summaryrefslogtreecommitdiff
path: root/engine-ecs/examples/event_loop.rs
diff options
context:
space:
mode:
Diffstat (limited to 'engine-ecs/examples/event_loop.rs')
-rw-r--r--engine-ecs/examples/event_loop.rs93
1 files changed, 93 insertions, 0 deletions
diff --git a/engine-ecs/examples/event_loop.rs b/engine-ecs/examples/event_loop.rs
new file mode 100644
index 0000000..7e215bd
--- /dev/null
+++ b/engine-ecs/examples/event_loop.rs
@@ -0,0 +1,93 @@
+use engine_ecs::actions::Actions;
+use engine_ecs::pair::ChildOf;
+use engine_ecs::phase::{Phase, UPDATE as UPDATE_PHASE};
+use engine_ecs::{declare_entity, pair, Component, Query, World};
+
+#[derive(Component)]
+struct Wool
+{
+ remaining: u32,
+}
+
+#[derive(Component)]
+struct Health
+{
+ health: u32,
+}
+
+#[derive(Component)]
+struct Name
+{
+ name: &'static str,
+}
+
+fn sheer(query: Query<(&mut Wool, &Name)>)
+{
+ for (mut wool, name) in &query {
+ if wool.remaining == 0 {
+ println!("{} Has no wool left", name.name);
+
+ continue;
+ }
+
+ // Sheer the whool
+ wool.remaining -= 5;
+
+ println!("Sheered 5 wool from {}", name.name);
+ }
+}
+
+fn feed(query: Query<(&mut Health, &Name)>)
+{
+ for (mut health, name) in &query {
+ health.health += 1;
+
+ println!("Feeded {} which gained 1 health", name.name);
+ }
+}
+
+fn age(query: Query<(&mut Health, &Name)>, mut actions: Actions)
+{
+ for (mut health, name) in &query {
+ if health.health <= 2 {
+ health.health = 0;
+
+ println!("{} passed away", name.name);
+
+ actions.stop();
+
+ continue;
+ }
+
+ health.health -= 2;
+
+ println!("{} aged and lost 2 health", name.name);
+ }
+}
+
+declare_entity! {
+ SHEER_PHASE: (Phase, pair!(ChildOf, { *UPDATE_PHASE }));
+ FEED_PHASE: (Phase, pair!(ChildOf, { *SHEER_PHASE }));
+ AGE_PHASE: (Phase, pair!(ChildOf, { *FEED_PHASE }));
+}
+
+fn main()
+{
+ let mut world = World::new();
+
+ world.spawn_declared_entity(&SHEER_PHASE);
+ world.spawn_declared_entity(&FEED_PHASE);
+ world.spawn_declared_entity(&AGE_PHASE);
+
+ world.register_system(*SHEER_PHASE, sheer);
+ world.register_system(*FEED_PHASE, feed);
+ world.register_system(*AGE_PHASE, age);
+
+ world.spawn((
+ Wool { remaining: 30 },
+ Health { health: 3 },
+ Name { name: "Bessy" },
+ ));
+
+ world.start_loop();
+}