summaryrefslogtreecommitdiff
path: root/ecs/examples
diff options
context:
space:
mode:
Diffstat (limited to 'ecs/examples')
-rw-r--r--ecs/examples/multiple_queries.rs87
-rw-r--r--ecs/examples/with_local.rs10
2 files changed, 94 insertions, 3 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);
+}
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<SayHelloState>)
{
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((