You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

84 regels
2.7 KiB

  1. use shrev::{EventChannel, ReaderId};
  2. use space_crush_common::misc::WorldHelper;
  3. use specs::{prelude::*, ReadExpect, System, World, Write};
  4. use crate::{
  5. misc::{KeyboardEvent, MouseEvent, WindowEvent},
  6. resources::{camera::window_to_view, InputState},
  7. Error,
  8. };
  9. pub struct InputStateUpdate {
  10. mouse_event_id: ReaderId<MouseEvent>,
  11. window_events_id: ReaderId<WindowEvent>,
  12. keyboard_events_id: ReaderId<KeyboardEvent>,
  13. }
  14. impl InputStateUpdate {
  15. pub fn new(world: &mut World) -> Result<Self, Error> {
  16. let mouse_event_id = world.register_event_reader::<MouseEvent>()?;
  17. let window_events_id = world.register_event_reader::<WindowEvent>()?;
  18. let keyboard_events_id = world.register_event_reader::<KeyboardEvent>()?;
  19. Ok(Self {
  20. mouse_event_id,
  21. window_events_id,
  22. keyboard_events_id,
  23. })
  24. }
  25. }
  26. #[derive(SystemData)]
  27. pub struct InputStateUpdateData<'a> {
  28. input_state: Write<'a, InputState>,
  29. mouse_events: ReadExpect<'a, EventChannel<MouseEvent>>,
  30. window_events: ReadExpect<'a, EventChannel<WindowEvent>>,
  31. keyboard_events: ReadExpect<'a, EventChannel<KeyboardEvent>>,
  32. }
  33. impl<'a> System<'a> for InputStateUpdate {
  34. type SystemData = InputStateUpdateData<'a>;
  35. fn run(&mut self, data: Self::SystemData) {
  36. let InputStateUpdateData {
  37. mut input_state,
  38. mouse_events,
  39. window_events,
  40. keyboard_events,
  41. } = data;
  42. let events = mouse_events.read(&mut self.mouse_event_id);
  43. for event in events {
  44. match event {
  45. MouseEvent::Move(x, y) => {
  46. input_state.mouse_pos = window_to_view(&input_state.resolution, (*x, *y))
  47. }
  48. MouseEvent::ButtonUp(button) => input_state.set_button_state(*button, false),
  49. MouseEvent::ButtonDown(button) => input_state.set_button_state(*button, true),
  50. _ => (),
  51. }
  52. }
  53. let events = window_events.read(&mut self.window_events_id);
  54. for event in events {
  55. match event {
  56. WindowEvent::Resize(w, h) => {
  57. input_state.resolution = (*w as f32, *h as f32).into();
  58. }
  59. WindowEvent::Close => {
  60. input_state.close_requested = true;
  61. }
  62. }
  63. }
  64. let events = keyboard_events.read(&mut self.keyboard_events_id);
  65. for event in events {
  66. match event {
  67. KeyboardEvent::KeyUp(code) => input_state.set_key_state(*code, false),
  68. KeyboardEvent::KeyDown(code) => input_state.set_key_state(*code, true),
  69. _ => (),
  70. }
  71. }
  72. }
  73. }