summaryrefslogtreecommitdiff
path: root/engine-ecs/examples/with_sole.rs
diff options
context:
space:
mode:
Diffstat (limited to 'engine-ecs/examples/with_sole.rs')
-rw-r--r--engine-ecs/examples/with_sole.rs56
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();
+}