input.rs 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. use crate::components::{Controlled, Velocity};
  2. use crate::game::MyGame;
  3. use sdl2::keyboard as sdl;
  4. use specs::RunNow;
  5. pub struct Move<'t> {
  6. keys: &'t std::collections::HashSet<sdl::Keycode>,
  7. }
  8. impl<'a, 't> specs::System<'a> for Move<'t> {
  9. type SystemData = (
  10. specs::ReadStorage<'a, Controlled>,
  11. specs::WriteStorage<'a, Velocity>,
  12. );
  13. fn run(&mut self, (movable, mut velocity): Self::SystemData) {
  14. use specs::Join;
  15. for (_, vel) in (&movable, &mut velocity).join() {
  16. vel.dx = 0.0;
  17. vel.dy = 0.0;
  18. if self.keys.contains(&sdl::Keycode::W) {
  19. vel.dy -= 2.0;
  20. }
  21. if self.keys.contains(&sdl::Keycode::A) {
  22. vel.dx -= 2.0;
  23. }
  24. if self.keys.contains(&sdl::Keycode::S) {
  25. vel.dy += 2.0;
  26. }
  27. if self.keys.contains(&sdl::Keycode::D) {
  28. vel.dx += 2.0;
  29. }
  30. }
  31. }
  32. }
  33. pub fn systems(game: &mut MyGame) {
  34. Move { keys: &game.keys }.run_now(&game.world.res);
  35. }