diff options
Diffstat (limited to 'engine-ecs/examples/with_sole.rs')
| -rw-r--r-- | engine-ecs/examples/with_sole.rs | 56 |
1 files changed, 56 insertions, 0 deletions
diff --git a/engine-ecs/examples/with_sole.rs b/engine-ecs/examples/with_sole.rs new file mode 100644 index 0000000..69670d1 --- /dev/null +++ b/engine-ecs/examples/with_sole.rs @@ -0,0 +1,56 @@ +use engine_ecs::pair::ChildOf; +use engine_ecs::phase::{Phase, UPDATE as UPDATE_PHASE}; +use engine_ecs::sole::Single; +use engine_ecs::{declare_entity, pair, Component, Query, Sole, World}; + +#[derive(Component)] +struct Ammo +{ + ammo_left: u32, +} + +#[derive(Sole, Default)] +struct AmmoCounter +{ + counter: u32, +} + +fn count_ammo(query: Query<(&Ammo,)>, mut ammo_counter: Single<AmmoCounter>) +{ + for (ammo,) in &query { + println!("Found {} ammo", ammo.ammo_left); + + ammo_counter.get_mut().unwrap().counter += ammo.ammo_left; + } +} + +fn print_total_ammo_count(ammo_counter: Single<AmmoCounter>) +{ + let ammo_count = ammo_counter.get().unwrap().counter; + + println!("Total ammo count: {}", ammo_count); + + assert_eq!(ammo_count, 19); +} + +declare_entity! { + PRINT_AMMO_COUNT_PHASE: (Phase, pair!(ChildOf, { *UPDATE_PHASE })); +} + +fn main() +{ + let mut world = World::new(); + + world.spawn_declared_entity(&PRINT_AMMO_COUNT_PHASE); + + world.register_system(*UPDATE_PHASE, count_ammo); + world.register_system(*PRINT_AMMO_COUNT_PHASE, print_total_ammo_count); + + world.spawn((Ammo { ammo_left: 4 },)); + world.spawn((Ammo { ammo_left: 7 },)); + world.spawn((Ammo { ammo_left: 8 },)); + + world.add_sole(AmmoCounter::default()).unwrap(); + + world.step(); +} |
