From 1019924a29527eba2c8ec8bd976ece6ed76075b0 Mon Sep 17 00:00:00 2001 From: HampusM Date: Sun, 25 Feb 2024 23:25:03 +0100 Subject: feat(ecs): add support for multiple system queries & local components --- ecs/examples/multiple_queries.rs | 87 ++++++++++++++++++++++++++++++++++++++++ ecs/examples/with_local.rs | 10 +++-- 2 files changed, 94 insertions(+), 3 deletions(-) create mode 100644 ecs/examples/multiple_queries.rs (limited to 'ecs/examples') diff --git a/ecs/examples/multiple_queries.rs b/ecs/examples/multiple_queries.rs new file mode 100644 index 0000000..a4a5d2d --- /dev/null +++ b/ecs/examples/multiple_queries.rs @@ -0,0 +1,87 @@ +use std::fmt::Display; + +use ecs::{Query, World}; + +struct Health +{ + health: u32, +} + +enum AttackStrength +{ + Strong, + Weak, +} + +struct EnemyName +{ + name: String, +} + +impl Display for EnemyName +{ + fn fmt(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result + { + self.name.fmt(formatter) + } +} + +fn say_hello( + mut query: Query<(AttackStrength,)>, + mut enemy_query: Query<(Health, EnemyName)>, +) +{ + for (attack_strength,) in query.iter_mut() { + for (health, enemy_name) in enemy_query.iter_mut() { + let damage = match attack_strength { + AttackStrength::Strong => 20, + AttackStrength::Weak => 10, + }; + + if health.health <= damage { + println!("Enemy '{enemy_name}' died"); + + health.health = 0; + + continue; + } + + health.health -= damage; + + println!("Enemy '{enemy_name}' took {damage} damage"); + } + } +} + +#[derive(Debug, PartialEq, Eq, Hash)] +enum Event +{ + Start, +} + +fn main() +{ + let mut world = World::::new(); + + world.register_system(Event::Start, say_hello); + + world.create_entity(( + Health { health: 100 }, + EnemyName { name: "Big spider".to_string() }, + )); + + world.create_entity(( + Health { health: 30 }, + EnemyName { name: "Small goblin".to_string() }, + )); + + world.create_entity(( + Health { health: 30 }, + EnemyName { name: "Headcrab".to_string() }, + )); + + world.create_entity((AttackStrength::Strong,)); + world.create_entity((AttackStrength::Weak,)); + + world.emit(&Event::Start); +} diff --git a/ecs/examples/with_local.rs b/ecs/examples/with_local.rs index d7af0e0..0bd8f66 100644 --- a/ecs/examples/with_local.rs +++ b/ecs/examples/with_local.rs @@ -1,5 +1,5 @@ use ecs::component::Local; -use ecs::system::{Into, System}; +use ecs::system::{Input as SystemInput, Into, System}; use ecs::{Query, World}; struct SomeData @@ -17,6 +17,8 @@ struct SayHelloState cnt: usize, } +impl SystemInput for SayHelloState {} + fn say_hello(mut query: Query<(SomeData, String)>, mut state: Local) { for (data, text) in query.iter_mut() { @@ -50,14 +52,16 @@ fn main() world.register_system( Event::Update, - say_hello.into_system().initialize(SayHelloState { cnt: 0 }), + say_hello + .into_system() + .initialize((SayHelloState { cnt: 0 },)), ); world.register_system( Event::Update, say_whats_up .into_system() - .initialize(SayHelloState { cnt: 0 }), + .initialize((SayHelloState { cnt: 0 },)), ); world.create_entity(( -- cgit v1.2.3-18-g5258