use ecs::component::single::Single; use ecs::event::{Event, Id as EventId}; use ecs::{Component, Query, World}; #[derive(Component)] struct Ammo { ammo_left: u32, } #[derive(Component, Default)] struct AmmoCounter { counter: u32, } fn count_ammo(query: Query<(Ammo,)>, mut ammo_counter: Single) { for (ammo,) in &query { println!("Found {} ammo", ammo.ammo_left); ammo_counter.counter += ammo.ammo_left; } } fn print_total_ammo_count(ammo_counter: Single) { println!("Total ammo count: {}", ammo_counter.counter); assert_eq!(ammo_counter.counter, 19); } #[derive(Debug)] struct EventA; impl Event for EventA { fn id(&self) -> EventId { EventId::of::() } } #[derive(Debug)] struct EventB; impl Event for EventB { fn id(&self) -> EventId { EventId::of::() } } fn main() { let mut world = World::new(); world.register_system(&EventA, count_ammo); world.register_system(&EventB, print_total_ammo_count); world.create_entity((Ammo { ammo_left: 4 },)); world.create_entity((Ammo { ammo_left: 7 },)); world.create_entity((Ammo { ammo_left: 8 },)); world.add_single_component(AmmoCounter::default()).unwrap(); world.emit(&EventA); world.emit(&EventB); }