diff options
Diffstat (limited to 'ecs/examples')
| -rw-r--r-- | ecs/examples/component_changed_event.rs | 80 | 
1 files changed, 80 insertions, 0 deletions
diff --git a/ecs/examples/component_changed_event.rs b/ecs/examples/component_changed_event.rs new file mode 100644 index 0000000..643f338 --- /dev/null +++ b/ecs/examples/component_changed_event.rs @@ -0,0 +1,80 @@ +use ecs::event::component::OnChanged; +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<OnChanged, Greeting>>) +{ +    println!("\nChanged greetings:"); + +    for ent in &observe { +        let Some(greeting) = ent.get::<Greeting>() 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(); +}  | 
