diff options
Diffstat (limited to 'ecs/examples')
| -rw-r--r-- | ecs/examples/component_changed_event.rs | 78 | ||||
| -rw-r--r-- | ecs/examples/component_events.rs | 64 | ||||
| -rw-r--r-- | ecs/examples/component_relationship.rs | 65 | ||||
| -rw-r--r-- | ecs/examples/component_removed_event.rs | 46 | ||||
| -rw-r--r-- | ecs/examples/event_loop.rs | 38 | ||||
| -rw-r--r-- | ecs/examples/optional_component.rs | 2 | ||||
| -rw-r--r-- | ecs/examples/relationship.rs | 20 | ||||
| -rw-r--r-- | ecs/examples/with_local.rs | 3 | ||||
| -rw-r--r-- | ecs/examples/with_sole.rs | 16 | 
9 files changed, 311 insertions, 21 deletions
diff --git a/ecs/examples/component_changed_event.rs b/ecs/examples/component_changed_event.rs new file mode 100644 index 0000000..1a53a88 --- /dev/null +++ b/ecs/examples/component_changed_event.rs @@ -0,0 +1,78 @@ +use ecs::event::component::Changed; +use ecs::pair::Pair; +use ecs::phase::UPDATE as UPDATE_PHASE; +use ecs::system::observer::Observe; +use ecs::{Component, Query, World}; + +#[derive(Component)] +struct SomeData +{ +    num: u64, +} + +#[derive(Component)] +struct Greeting +{ +    greeting: String, +} + +fn say_hello(query: Query<(&SomeData, &mut Greeting)>) +{ +    for (data, mut greeting) in &query { +        println!("{}: {}", greeting.greeting, data.num); + +        if greeting.greeting == "Good evening" { +            greeting.greeting = "Good morning".to_string(); +            greeting.set_changed(); +        } +    } +} + +fn print_changed_greetings(observe: Observe<'_, Pair<Changed, Greeting>>) +{ +    println!("\nChanged greetings:"); + +    for evt_match in &observe { +        let greeting = evt_match.get_changed_comp(); + +        println!("A greeting changed to {}", greeting.greeting); +    } + +    println!(""); +} + +fn main() +{ +    let mut world = World::new(); + +    world.register_system(*UPDATE_PHASE, say_hello); + +    world.register_observer(print_changed_greetings); + +    world.create_entity(( +        SomeData { num: 987_654 }, +        Greeting { +            greeting: "Good afternoon".to_string(), +        }, +    )); + +    world.create_entity(( +        SomeData { num: 345 }, +        Greeting { greeting: "Good evening".to_string() }, +    )); + +    world.step(); + +    world.step(); + +    for (mut greeting,) in &world.query::<(&mut Greeting,), ()>() { +        if greeting.greeting == "Good afternoon" { +            greeting.greeting = "Yo yo".to_string(); +            greeting.set_changed(); +        } +    } + +    world.step(); + +    world.step(); +} diff --git a/ecs/examples/component_events.rs b/ecs/examples/component_events.rs new file mode 100644 index 0000000..af09ff9 --- /dev/null +++ b/ecs/examples/component_events.rs @@ -0,0 +1,64 @@ +use ecs::actions::Actions; +use ecs::component::Component; +use ecs::event::component::{Changed, Removed}; +use ecs::pair::Pair; +use ecs::phase::UPDATE; +use ecs::system::observer::Observe; +use ecs::{Component, Query, World}; + +#[derive(Debug, Component)] +struct CheeseCrumbs +{ +    cnt: usize, +} + +#[derive(Debug, Component)] +struct Cheese +{ +    name: &'static str, +} + +fn eat_cheese(query: Query<(&Cheese, &mut CheeseCrumbs)>, mut actions: Actions) +{ +    for (cheese_ent_id, (_, mut cheese_crumbs)) in query.iter_with_euids() { +        println!("Eating cheese!"); + +        cheese_crumbs.cnt += 40; +        cheese_crumbs.set_changed(); + +        actions.remove_components(cheese_ent_id, [Cheese::id()]); +    } +} + +fn on_cheese_removed(observe: Observe<Pair<Removed, Cheese>>) +{ +    for evt_match in &observe { +        let cheese = evt_match.get_removed_comp(); + +        println!("{} cheese was eaten", cheese.name); +    } +} + +fn on_cheese_crumbs_changed(observe: Observe<Pair<Changed, CheeseCrumbs>>) +{ +    for evt_match in &observe { +        let cheese_crumbs = evt_match.get_changed_comp(); + +        println!("Cheese crumbs count changed to {}", cheese_crumbs.cnt); +    } +} + +fn main() +{ +    let mut world = World::new(); + +    world.register_system(*UPDATE, eat_cheese); +    world.register_observer(on_cheese_removed); +    world.register_observer(on_cheese_crumbs_changed); + +    world.create_entity((Cheese { name: "Brie" }, CheeseCrumbs { cnt: 0 })); +    world.create_entity((Cheese { name: "Parmesan" }, CheeseCrumbs { cnt: 0 })); +    world.create_entity((Cheese { name: "Gouda" }, CheeseCrumbs { cnt: 0 })); + +    world.step(); +} diff --git a/ecs/examples/component_relationship.rs b/ecs/examples/component_relationship.rs new file mode 100644 index 0000000..e07b214 --- /dev/null +++ b/ecs/examples/component_relationship.rs @@ -0,0 +1,65 @@ +use ecs::pair::Pair; +use ecs::phase::START as START_PHASE; +use ecs::{Component, Query, World}; + +#[derive(Component)] +struct Person +{ +    name: String, +} + +fn print_dog_likers(query: Query<(&Person, Pair<Likes, &Dogs>)>) +{ +    for (person, liked_dogs) in &query { +        println!( +            "{} likes {} dogs!", +            person.name, +            if liked_dogs.large { "large" } else { "small" }, +        ); +    } +} + +#[derive(Component)] +struct Likes; + +#[derive(Component)] +struct Cats; + +#[derive(Component)] +struct Dogs +{ +    large: bool, +} + +fn main() +{ +    let mut world = World::new(); + +    world.register_system(*START_PHASE, print_dog_likers); + +    world.create_entity(( +        Person { name: "Irving".to_string() }, +        Pair::builder() +            .relation::<Likes>() +            .target_as_data(Dogs { large: true }) +            .build(), +    )); + +    world.create_entity(( +        Person { name: "Mark".to_string() }, +        Pair::builder() +            .relation::<Likes>() +            .target_as_data(Cats) +            .build(), +    )); + +    world.create_entity(( +        Person { name: "Helena".to_string() }, +        Pair::builder() +            .relation::<Likes>() +            .target_as_data(Dogs { large: false }) +            .build(), +    )); + +    world.step(); +} diff --git a/ecs/examples/component_removed_event.rs b/ecs/examples/component_removed_event.rs new file mode 100644 index 0000000..776aa48 --- /dev/null +++ b/ecs/examples/component_removed_event.rs @@ -0,0 +1,46 @@ +use ecs::actions::Actions; +use ecs::component::Component; +use ecs::event::component::Removed; +use ecs::pair::Pair; +use ecs::phase::UPDATE; +use ecs::system::observer::Observe; +use ecs::{Component, Query, World}; + +#[derive(Debug, Component)] +struct Cheese +{ +    name: &'static str, +} + +fn eat_cheese(query: Query<(&Cheese,)>, mut actions: Actions) +{ +    for (cheese_ent_id, (_,)) in query.iter_with_euids() { +        println!("Eating cheese!"); + +        actions.remove_components(cheese_ent_id, [Cheese::id()]); +    } +} + +fn on_cheese_removed(observe: Observe<Pair<Removed, Cheese>>) +{ +    for evt_match in &observe { +        let cheese = evt_match.get_removed_comp(); + +        println!("{} cheese was eaten", cheese.name); +    } +} + +fn main() +{ +    let mut world = World::new(); + +    world.register_system(*UPDATE, eat_cheese); +    world.register_observer(on_cheese_removed); + +    world.create_entity((Cheese { name: "Brie" },)); +    world.create_entity((Cheese { name: "Parmesan" },)); +    world.create_entity((Cheese { name: "Gouda" },)); + +    world.step(); +    world.step(); +} diff --git a/ecs/examples/event_loop.rs b/ecs/examples/event_loop.rs index 2365eb0..bec2c00 100644 --- a/ecs/examples/event_loop.rs +++ b/ecs/examples/event_loop.rs @@ -1,7 +1,7 @@  use ecs::actions::Actions; +use ecs::pair::{ChildOf, Pair};  use ecs::phase::{Phase, UPDATE as UPDATE_PHASE}; -use ecs::relationship::{ChildOf, Relationship}; -use ecs::{static_entity, Component, Query, World}; +use ecs::{declare_entity, Component, Query, World};  #[derive(Component)]  struct Wool @@ -65,25 +65,47 @@ fn age(query: Query<(&mut Health, &Name)>, mut actions: Actions)      }  } -static_entity!( +declare_entity!(      SHEER_PHASE, -    (Phase, <Relationship<ChildOf, Phase>>::new(*UPDATE_PHASE)) +    ( +        Phase, +        Pair::builder() +            .relation::<ChildOf>() +            .target_id(*UPDATE_PHASE) +            .build() +    )  ); -static_entity!( +declare_entity!(      FEED_PHASE, -    (Phase, <Relationship<ChildOf, Phase>>::new(*SHEER_PHASE)) +    ( +        Phase, +        Pair::builder() +            .relation::<ChildOf>() +            .target_id(*SHEER_PHASE) +            .build() +    )  ); -static_entity!( +declare_entity!(      AGE_PHASE, -    (Phase, <Relationship<ChildOf, Phase>>::new(*FEED_PHASE)) +    ( +        Phase, +        Pair::builder() +            .relation::<ChildOf>() +            .target_id(*FEED_PHASE) +            .build() +    )  );  fn main()  {      let mut world = World::new(); +    world.create_declared_entity(&SHEER_PHASE); +    world.create_declared_entity(&FEED_PHASE); +    world.create_declared_entity(&AGE_PHASE); +      world.register_system(*SHEER_PHASE, sheer);      world.register_system(*FEED_PHASE, feed);      world.register_system(*AGE_PHASE, age); diff --git a/ecs/examples/optional_component.rs b/ecs/examples/optional_component.rs index 488dad2..ebc9115 100644 --- a/ecs/examples/optional_component.rs +++ b/ecs/examples/optional_component.rs @@ -21,7 +21,7 @@ pub struct CatName      name: String,  } -fn pet_cats(query: Query<(&CatName, &mut PettingCapacity, &Option<Aggressivity>)>) +fn pet_cats(query: Query<(&CatName, &mut PettingCapacity, Option<&Aggressivity>)>)  {      for (cat_name, mut petting_capacity, aggressivity) in &query {          let Some(aggressivity) = aggressivity else { diff --git a/ecs/examples/relationship.rs b/ecs/examples/relationship.rs index 240884a..4e94151 100644 --- a/ecs/examples/relationship.rs +++ b/ecs/examples/relationship.rs @@ -1,5 +1,5 @@ +use ecs::pair::{Pair, Wildcard};  use ecs::phase::START as START_PHASE; -use ecs::relationship::Relationship;  use ecs::{Component, Query, World};  #[derive(Component)] @@ -17,16 +17,19 @@ struct Health      health: u32,  } +#[derive(Component)]  struct Holding; -fn print_player_stats( -    player_query: Query<(&Player, &Health, &Relationship<Holding, Sword>)>, -) +fn print_player_stats(player_query: Query<(&Player, &Health, Pair<Holding, Wildcard>)>)  { -    for (_, health, sword_relationship) in &player_query { +    for (_, health, target_sword) in &player_query {          println!("Player health: {}", health.health); -        if let Some(sword) = sword_relationship.get(0) { +        if let Some(sword_ent) = target_sword.get_target_ent() { +            let sword = sword_ent +                .get::<Sword>() +                .expect("Sword entity is missing sword component"); +              println!("Player sword attack strength: {}", sword.attack_strength);          }      } @@ -43,7 +46,10 @@ fn main()      world.create_entity((          Player,          Health { health: 180 }, -        Relationship::<Holding, Sword>::new(sword_uid), +        Pair::builder() +            .relation::<Holding>() +            .target_id(sword_uid) +            .build(),      ));      world.step(); diff --git a/ecs/examples/with_local.rs b/ecs/examples/with_local.rs index 4658fc0..7a36d0e 100644 --- a/ecs/examples/with_local.rs +++ b/ecs/examples/with_local.rs @@ -1,6 +1,7 @@  use ecs::component::local::Local;  use ecs::phase::UPDATE as UPDATE_PHASE; -use ecs::system::{Into, System}; +use ecs::system::initializable::Initializable; +use ecs::system::Into;  use ecs::{Component, Query, World};  #[derive(Component)] diff --git a/ecs/examples/with_sole.rs b/ecs/examples/with_sole.rs index 689e562..7e89b0a 100644 --- a/ecs/examples/with_sole.rs +++ b/ecs/examples/with_sole.rs @@ -1,7 +1,7 @@ +use ecs::pair::{ChildOf, Pair};  use ecs::phase::{Phase, UPDATE as UPDATE_PHASE}; -use ecs::relationship::{ChildOf, Relationship};  use ecs::sole::Single; -use ecs::{static_entity, Component, Query, Sole, World}; +use ecs::{declare_entity, Component, Query, Sole, World};  #[derive(Component)]  struct Ammo @@ -31,15 +31,23 @@ fn print_total_ammo_count(ammo_counter: Single<AmmoCounter>)      assert_eq!(ammo_counter.counter, 19);  } -static_entity!( +declare_entity!(      PRINT_AMMO_COUNT_PHASE, -    (Phase, <Relationship<ChildOf, Phase>>::new(*UPDATE_PHASE)) +    ( +        Phase, +        Pair::builder() +            .relation::<ChildOf>() +            .target_id(*UPDATE_PHASE) +            .build() +    )  );  fn main()  {      let mut world = World::new(); +    world.create_declared_entity(&PRINT_AMMO_COUNT_PHASE); +      world.register_system(*UPDATE_PHASE, count_ammo);      world.register_system(*PRINT_AMMO_COUNT_PHASE, print_total_ammo_count);  | 
