summaryrefslogtreecommitdiff
path: root/ecs/examples
diff options
context:
space:
mode:
Diffstat (limited to 'ecs/examples')
-rw-r--r--ecs/examples/event_loop.rs115
1 files changed, 115 insertions, 0 deletions
diff --git a/ecs/examples/event_loop.rs b/ecs/examples/event_loop.rs
new file mode 100644
index 0000000..f9fd85f
--- /dev/null
+++ b/ecs/examples/event_loop.rs
@@ -0,0 +1,115 @@
+use ecs::event::{Event, Id as EventId};
+use ecs::flags::Flags;
+use ecs::{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<(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<(Health, Name)>)
+{
+ for (mut health, name) in &query {
+ health.health += 1;
+
+ println!("Feeded {} which gained 1 health", name.name);
+ }
+}
+
+fn age(query: Query<(Health, Name)>, mut flags: Flags)
+{
+ for (mut health, name) in &query {
+ if health.health <= 2 {
+ health.health = 0;
+
+ println!("{} passed away", name.name);
+
+ flags.stop();
+
+ continue;
+ }
+
+ health.health -= 2;
+
+ println!("{} aged and lost 2 health", name.name);
+ }
+}
+
+#[derive(Debug)]
+struct EventA;
+
+impl Event for EventA
+{
+ fn id(&self) -> EventId
+ {
+ EventId::of::<Self>()
+ }
+}
+
+#[derive(Debug)]
+struct EventB;
+
+impl Event for EventB
+{
+ fn id(&self) -> EventId
+ {
+ EventId::of::<Self>()
+ }
+}
+
+#[derive(Debug)]
+struct EventC;
+
+impl Event for EventC
+{
+ fn id(&self) -> EventId
+ {
+ EventId::of::<Self>()
+ }
+}
+
+fn main()
+{
+ let mut world = World::new();
+
+ world.register_system(&EventA, sheer);
+ world.register_system(&EventB, feed);
+ world.register_system(&EventC, age);
+
+ world.create_entity((
+ Wool { remaining: 30 },
+ Health { health: 3 },
+ Name { name: "Bessy" },
+ ));
+
+ world.event_loop::<(EventA, EventB, EventC)>();
+}