From 519a73f83848ea668fe79895e6643cff4c5c51be Mon Sep 17 00:00:00 2001 From: HampusM Date: Sat, 6 Apr 2024 12:30:49 +0200 Subject: feat(ecs): add stopping event loop --- ecs/examples/event_loop.rs | 115 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 115 insertions(+) create mode 100644 ecs/examples/event_loop.rs (limited to 'ecs/examples/event_loop.rs') 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::() + } +} + +#[derive(Debug)] +struct EventB; + +impl Event for EventB +{ + fn id(&self) -> EventId + { + EventId::of::() + } +} + +#[derive(Debug)] +struct EventC; + +impl Event for EventC +{ + fn id(&self) -> EventId + { + EventId::of::() + } +} + +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)>(); +} -- cgit v1.2.3-18-g5258