|
- #![allow(dead_code)]
-
- use specs::{prelude::*, ParJoin, Read, ReadStorage, System, WriteStorage};
-
- use crate::{
- components::{Player, PlayerOwned, Position, Ship},
- resources::Global,
- return_if_none,
- };
-
- #[derive(Default)]
- pub struct ShipMovement;
-
- #[derive(SystemData)]
- pub struct ShipMovementData<'a> {
- positions: WriteStorage<'a, Position>,
- ships: ReadStorage<'a, Ship>,
- player_owned: ReadStorage<'a, PlayerOwned>,
- players: ReadStorage<'a, Player>,
- global: Read<'a, Global>,
- }
-
- impl<'a> System<'a> for ShipMovement {
- type SystemData = ShipMovementData<'a>;
-
- fn run(&mut self, data: Self::SystemData) {
- let ShipMovementData {
- mut positions,
- ships,
- player_owned,
- players,
- global,
- } = data;
-
- (&mut positions, &player_owned, &ships).par_join().for_each(
- |(position, player_owned, ship)| {
- let delta = global.delta * global.world_speed;
- let position = position.get_mut();
- let type_ = ship.type_();
- let player_id = player_owned.owner();
- let player = return_if_none!(players.get(player_id));
- let ship_data = player.ship_data(type_);
-
- *position += ship.dir() * ship_data.speed * delta;
- },
- );
- }
- }
|