use ecs::actions::Actions; use ecs::component::Component; use ecs::event::component::{Changed, Removed}; use ecs::pair::Pair; use ecs::phase::UPDATE; use ecs::system::observer::Observe; use ecs::{Component, Query, World}; #[derive(Debug, Component)] struct CheeseCrumbs { cnt: usize, } #[derive(Debug, Component)] struct Cheese { name: &'static str, } fn eat_cheese(query: Query<(&Cheese, &mut CheeseCrumbs)>, mut actions: Actions) { for (cheese_ent_id, (_, mut cheese_crumbs)) in query.iter_with_euids() { println!("Eating cheese!"); cheese_crumbs.cnt += 40; cheese_crumbs.set_changed(); actions.remove_components(cheese_ent_id, [Cheese::id()]); } } fn on_cheese_removed(observe: Observe>) { for evt_match in &observe { let ent = evt_match.get_entity().unwrap(); let cheese = ent.get::().unwrap(); println!("{} cheese was eaten", cheese.name); } } fn on_cheese_crumbs_changed(observe: Observe>) { for evt_match in &observe { let ent = evt_match.get_entity().unwrap(); let cheese_crumbs = ent.get::().unwrap(); println!("Cheese crumbs count changed to {}", cheese_crumbs.cnt); } } fn main() { let mut world = World::new(); world.register_system(*UPDATE, eat_cheese); world.register_observer(on_cheese_removed); world.register_observer(on_cheese_crumbs_changed); world.create_entity((Cheese { name: "Brie" }, CheeseCrumbs { cnt: 0 })); world.create_entity((Cheese { name: "Parmesan" }, CheeseCrumbs { cnt: 0 })); world.create_entity((Cheese { name: "Gouda" }, CheeseCrumbs { cnt: 0 })); world.step(); }