Advertisement
Guest User

Untitled

a guest
Jul 21st, 2019
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.64 KB | None | 0 0
  1. use amethyst::core::{
  2. ecs::prelude::*,
  3. shrev::{Event, EventChannel},
  4. };
  5.  
  6. pub trait SimpleEventHandler<'a> {
  7. type EventType: Event;
  8. type HandlerSystemData: SystemData<'a>;
  9.  
  10. fn active(&self) -> bool {
  11. true
  12. }
  13.  
  14. fn handle_event(&mut self, event: Self::EventType, data: &mut Self::HandlerSystemData);
  15. }
  16.  
  17. pub struct EventHandlerSystem<'a, T>
  18. where
  19. T: SimpleEventHandler<'a>,
  20. {
  21. event_reader: Option<ReaderId<T::EventType>>,
  22. handler: T,
  23. }
  24.  
  25. impl<'a, T> Default for EventHandlerSystem<'a, T>
  26. where
  27. T: Default + SimpleEventHandler<'a>,
  28. {
  29. fn default() -> Self {
  30. Self {
  31. event_reader: None,
  32. handler: T::default(),
  33. }
  34. }
  35. }
  36.  
  37. impl<'a, T> System<'a> for EventHandlerSystem<'a, T>
  38. where
  39. T: SimpleEventHandler<'a>,
  40. {
  41. type SystemData = (Read<'a, EventChannel<T::EventType>>, T::HandlerSystemData);
  42.  
  43. fn setup(&mut self, res: &mut Resources) {
  44. Self::SystemData::setup(res);
  45.  
  46. self.event_reader = Some(
  47. res.fetch_mut::<EventChannel<T::EventType>>()
  48. .register_reader(),
  49. );
  50. }
  51.  
  52. fn run(&mut self, data: Self::SystemData) {
  53. let (events, inner_data) = data;
  54.  
  55. // Make sure we at least consume the input events so we don't act on stale ones.
  56. let events_iter = events.read(
  57. &mut self
  58. .event_reader
  59. .as_mut()
  60. .expect("EventHandlerSystem was not setup before running"),
  61. );
  62.  
  63. if !self.handler.active() {
  64. return;
  65. }
  66.  
  67. for event in events_iter {
  68. self.handler.handle_event(*event, &mut inner_data);
  69. }
  70. }
  71. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement