diff options
Diffstat (limited to 'engine-ecs/examples/multiple_queries.rs')
| -rw-r--r-- | engine-ecs/examples/multiple_queries.rs | 85 |
1 files changed, 85 insertions, 0 deletions
diff --git a/engine-ecs/examples/multiple_queries.rs b/engine-ecs/examples/multiple_queries.rs new file mode 100644 index 0000000..1a4aaad --- /dev/null +++ b/engine-ecs/examples/multiple_queries.rs @@ -0,0 +1,85 @@ +use std::fmt::Display; + +use engine_ecs::phase::START as START_PHASE; +use engine_ecs::{Component, Query, World}; + +#[derive(Component)] +struct Health +{ + health: u32, +} + +#[derive(Component)] +enum AttackStrength +{ + Strong, + Weak, +} + +#[derive(Component)] +struct EnemyName +{ + name: String, +} + +impl Display for EnemyName +{ + fn fmt(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result + { + self.name.fmt(formatter) + } +} + +fn do_attacks( + attacker_query: Query<(&AttackStrength,)>, + enemy_query: Query<(&mut Health, &EnemyName)>, +) +{ + for (attack_strength,) in &attacker_query { + for (mut health, enemy_name) in &enemy_query { + let damage = match *attack_strength { + AttackStrength::Strong => 20, + AttackStrength::Weak => 10, + }; + + if health.health <= damage { + println!("Enemy '{}' died", *enemy_name); + + health.health = 0; + + continue; + } + + health.health -= damage; + + println!("Enemy '{}' took {damage} damage", *enemy_name); + } + } +} + +fn main() +{ + let mut world = World::new(); + + world.register_system(*START_PHASE, do_attacks); + + 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.step(); +} |
