diff options
author | HampusM <hampus@hampusmat.com> | 2024-02-25 23:25:03 +0100 |
---|---|---|
committer | HampusM <hampus@hampusmat.com> | 2024-02-26 19:54:00 +0100 |
commit | 1019924a29527eba2c8ec8bd976ece6ed76075b0 (patch) | |
tree | b26d8bd872684a0c87802e057d8952c42be31f7a /ecs/examples/multiple_queries.rs | |
parent | 00055d6af92d59a86eb00f110c77c699a562d33e (diff) |
feat(ecs): add support for multiple system queries & local components
Diffstat (limited to 'ecs/examples/multiple_queries.rs')
-rw-r--r-- | ecs/examples/multiple_queries.rs | 87 |
1 files changed, 87 insertions, 0 deletions
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::<Event>::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); +} |