diff options
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); +} |