use ecs::event::component::Changed; use ecs::pair::Pair; use ecs::phase::UPDATE as UPDATE_PHASE; use ecs::system::observer::Observe; use ecs::{Component, Query, World}; #[derive(Component)] struct SomeData { num: u64, } #[derive(Component)] struct Greeting { greeting: String, } fn say_hello(query: Query<(&SomeData, &mut Greeting)>) { for (data, mut greeting) in &query { println!("{}: {}", greeting.greeting, data.num); if greeting.greeting == "Good evening" { greeting.greeting = "Good morning".to_string(); greeting.set_changed(); } } } fn print_changed_greetings(observe: Observe<'_, Pair>) { println!("\nChanged greetings:"); for ent in &observe { let Some(greeting) = ent.get::() else { unreachable!(); }; println!("A greeting changed to {}", greeting.greeting); } println!(""); } fn main() { let mut world = World::new(); world.register_system(*UPDATE_PHASE, say_hello); world.register_observer(print_changed_greetings); world.create_entity(( SomeData { num: 987_654 }, Greeting { greeting: "Good afternoon".to_string(), }, )); world.create_entity(( SomeData { num: 345 }, Greeting { greeting: "Good evening".to_string() }, )); world.step(); world.step(); for (mut greeting,) in &world.query::<(&mut Greeting,), ()>() { if greeting.greeting == "Good afternoon" { greeting.greeting = "Yo yo".to_string(); greeting.set_changed(); } } world.step(); world.step(); }