summaryrefslogtreecommitdiff
path: root/ecs/examples/multiple_queries.rs
diff options
context:
space:
mode:
Diffstat (limited to 'ecs/examples/multiple_queries.rs')
-rw-r--r--ecs/examples/multiple_queries.rs87
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);
+}