Nie możesz wybrać więcej, niż 25 tematów Tematy muszą się zaczynać od litery lub cyfry, mogą zawierać myślniki ('-') i mogą mieć do 35 znaków.

86 wiersze
2.6 KiB

  1. use glc::vector::Vector4f;
  2. use space_crush_common::components::{
  3. Player, PlayerOwned, Position, Ship, ShipMoving, ShipObstacle, ShipOrbiting,
  4. };
  5. use specs::{prelude::*, ReadStorage, System, World, WriteExpect};
  6. use crate::resources::Geometry;
  7. #[derive(Default)]
  8. pub struct Ships;
  9. #[derive(SystemData)]
  10. pub struct ShipsData<'a> {
  11. geometry: WriteExpect<'a, Geometry>,
  12. positions: ReadStorage<'a, Position>,
  13. player_owned: ReadStorage<'a, PlayerOwned>,
  14. players: ReadStorage<'a, Player>,
  15. ships: ReadStorage<'a, Ship>,
  16. ships_orbiting: ReadStorage<'a, ShipOrbiting>,
  17. ships_moving: ReadStorage<'a, ShipMoving>,
  18. }
  19. impl<'a> System<'a> for Ships {
  20. type SystemData = ShipsData<'a>;
  21. fn run(&mut self, data: Self::SystemData) {
  22. let ShipsData {
  23. mut geometry,
  24. positions,
  25. player_owned,
  26. players,
  27. ships,
  28. ships_orbiting,
  29. ships_moving,
  30. } = data;
  31. gl::enable(gl::BLEND);
  32. gl::blend_func(gl::SRC_ALPHA, gl::ONE);
  33. let data = (
  34. &positions,
  35. &player_owned,
  36. &ships,
  37. ships_orbiting.maybe(),
  38. ships_moving.maybe(),
  39. );
  40. for (position, player_owned, ship, ship_orbiting, ship_moving) in data.join() {
  41. let ship_pos = position.get();
  42. let type_ = ship.type_();
  43. let player_id = player_owned.owner();
  44. let player = players.get(player_id).unwrap();
  45. let ship_data = player.ship_data(type_);
  46. geometry.render_lines(
  47. Vector4f::new(0.0, 0.0, 1.0, 0.2),
  48. &[*ship_pos, ship_pos + ship.dir() * ship_data.speed],
  49. );
  50. if let Some(ship_orbiting) = &ship_orbiting {
  51. geometry.render_lines(
  52. Vector4f::new(1.0, 0.0, 0.0, 0.2),
  53. &[*ship_pos, ship_pos + ship_orbiting.target_dir() * 100.0],
  54. );
  55. geometry.render_lines(
  56. Vector4f::new(1.0, 1.0, 1.0, 0.2),
  57. &[*ship_pos, *ship_orbiting.target_pos()],
  58. );
  59. }
  60. if let Some(ship_moving) = ship_moving {
  61. if let ShipObstacle::Known(obstacle_id) = ship_moving.obstacle() {
  62. let obstacle_pos = positions.get(*obstacle_id).unwrap().get();
  63. geometry.render_lines(
  64. Vector4f::new(0.0, 1.0, 0.0, 0.2),
  65. &[*ship_pos, *obstacle_pos],
  66. );
  67. }
  68. }
  69. }
  70. gl::disable(gl::BLEND);
  71. }
  72. }