basic/
basic.rs

1#![allow(missing_docs)]
2use xuko_ecs::{Query, QueryFilter, World, component_id};
3
4fn main() {
5    let mut world = World::new();
6
7    struct Name(String);
8    struct Age(u8);
9    struct Human;
10
11    let people = [
12        (Name("Alice".to_owned()), Age(20)),
13        (Name("Bob".to_owned()), Age(26)),
14        (Name("Cathrine".to_owned()), Age(33)),
15        (Name("Dennis".to_owned()), Age(10)),
16    ];
17
18    for (name, age) in people {
19        let entity = world.spawn();
20        let entity = world.get_entity_mut(entity).unwrap();
21
22        entity.add(name);
23        entity.add(age);
24        entity.add(Human);
25    }
26
27    {
28        let entity = world.spawn();
29        let entity = world.get_entity_mut(entity).unwrap();
30
31        entity.add(Name("Jupiter".to_owned()));
32    }
33
34    for e in &Query::query_world(
35        &world,
36        QueryFilter {
37            requires: vec![
38                component_id!(Name),
39                component_id!(Age),
40                component_id!(Human),
41            ],
42            ..Default::default()
43        },
44    ) {
45        let e = world.get_entity_mut(e).unwrap();
46        let age = e.get::<Age>().map(|x| Age(x.0)).unwrap();
47        let name = e.get_mut::<Name>().unwrap();
48
49        name.0 = name.0.to_uppercase();
50        println!("Found human named {}, who is {} years old", name.0, age.0);
51    }
52
53    for e in &Query::query_world(
54        &world,
55        QueryFilter {
56            requires: vec![component_id!(Name)],
57            ..Default::default()
58        },
59    ) {
60        let entity = world.get_entity(e).unwrap();
61        let name = entity.get::<Name>().unwrap();
62
63        println!("This entity (#{e}) has a name: {}", name.0);
64    }
65}