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.rs120
1 files changed, 120 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..62d0876
--- /dev/null
+++ b/engine-ecs/examples/event_loop.rs
@@ -0,0 +1,120 @@
+use engine_ecs::actions::Actions;
+use engine_ecs::pair::{ChildOf, Pair};
+use engine_ecs::phase::{Phase, UPDATE as UPDATE_PHASE};
+use engine_ecs::{declare_entity, 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::builder()
+ .relation::<ChildOf>()
+ .target_id(*UPDATE_PHASE)
+ .build()
+ )
+);
+
+declare_entity!(
+ FEED_PHASE,
+ (
+ Phase,
+ Pair::builder()
+ .relation::<ChildOf>()
+ .target_id(*SHEER_PHASE)
+ .build()
+ )
+);
+
+declare_entity!(
+ AGE_PHASE,
+ (
+ Phase,
+ Pair::builder()
+ .relation::<ChildOf>()
+ .target_id(*FEED_PHASE)
+ .build()
+ )
+);
+
+fn main()
+{
+ let mut world = World::new();
+
+ world.create_declared_entity(&SHEER_PHASE);
+ world.create_declared_entity(&FEED_PHASE);
+ world.create_declared_entity(&AGE_PHASE);
+
+ world.register_system(*SHEER_PHASE, sheer);
+ world.register_system(*FEED_PHASE, feed);
+ world.register_system(*AGE_PHASE, age);
+
+ world.create_entity((
+ Wool { remaining: 30 },
+ Health { health: 3 },
+ Name { name: "Bessy" },
+ ));
+
+ world.start_loop();
+}