pub struct Entity {
pub id: i32,
pub components: RefCell<HashMap<TypeId, Box<dyn Any>>>,
pub fresh: RefCell<bool>,
}Fields§
§id: i32§components: RefCell<HashMap<TypeId, Box<dyn Any>>>§fresh: RefCell<bool>Implementations§
Source§impl Entity
impl Entity
pub fn new(id: i32) -> Entity
Sourcepub fn refresh(&self)
pub fn refresh(&self)
Mark this entity as not refreshed. On beginning of next frame new registered components will affect their systems.
Examples found in repository?
examples/process_macro.rs (line 52)
43fn main() {
44 let mut world = World::new();
45
46 {
47 let mut entity_manager = world.entity_manager();
48 let entity = entity_manager.create_entity();
49
50 entity.add_component(Position {x : 0});
51 entity.add_component(Velocity {x : 1});
52 entity.refresh();
53 }
54 world.set_system(MoveSystem);
55 world.update();
56
57 world.update();
58 world.update();
59}More examples
examples/multiple_fields.rs (line 35)
25 fn process_one(&mut self, entity : &mut Entity) {
26 let pos = entity.get_component::<Position>();
27 let mut health = entity.get_component::<Health>();
28
29 if pos.x == 5 {
30 health.hp -= 10;
31 println!("You are in bleeding zone, hp: {}", health.hp);
32 }
33 if health.hp <= 0 {
34 entity.remove_component::<Alive>();
35 entity.refresh();
36 }
37 }
38}
39
40fn main() {
41 let mut world = World::new();
42
43 {
44 let mut manager = world.entity_manager();
45 let entity = manager.create_entity();
46 entity.add_component(Health {hp : 100});
47 entity.add_component(Position {x : 5});
48 entity.add_component(Alive);
49 entity.refresh();
50 }
51 world.set_system(BleedZoneSystem);
52
53 for _ in 0..100 {
54 world.update();
55 }
56}examples/spawn_system.rs (line 28)
22 fn process_w(&mut self, entity : &mut Entity, world : &mut WorldHandle) {
23 let mut spawn_point = entity.get_component::<SpawnPoint>();
24
25 if spawn_point.count > 0 {
26 let spawned = world.entity_manager.create_entity();
27 spawned.add_component(SomeComponent { _some_data : spawn_point.data.to_string() });
28 spawned.refresh();
29
30 spawn_point.count -= 1;
31 }
32 }
33}
34
35fn main() {
36 let mut world = World::new();
37
38 {
39 let mut w = world.entity_manager();
40 let entity = w.create_entity();
41
42 entity.add_component(SpawnPoint {data : "player", count : 5});
43 entity.refresh();
44 }
45
46 world.set_system(SpawnSystem);
47
48 world.update();
49 world.update();
50}examples/systems.rs (line 62)
55fn main() {
56 let mut world = World::new();
57
58 {
59 let mut entity_manager = world.entity_manager();
60 let entity = entity_manager.create_entity();
61 entity.add_component(Position {pos : [0.0, 0.0, 0.0]});
62 entity.refresh();
63 }
64
65 // if you have position, you will be drawn
66 world.set_system(DrawerSystem);
67 // except you are dead
68 world.set_system(MoverSystem);
69 // but only if you are dead your corpse will be draw, too
70 world.set_system(DeadDrawerSystem);
71
72 world.update();
73 world.update();
74}examples/render_gui_system.rs (line 94)
81fn main() {
82 let mut world = World::new();
83 world.set_system(RenderSystem::new());
84 world.set_system(GuiSystem);
85 world.set_system(Glutin2HeavySystem);
86
87 {
88 let mut entity_manager = world.entity_manager();
89
90 {
91 let mesh = entity_manager.create_entity();
92
93 mesh.add_component(Renderable);
94 mesh.refresh();
95 }
96 {
97 let window = entity_manager.create_entity();
98
99 window.add_component(GuiWindow);
100 window.refresh();
101 }
102 }
103 world.update();
104 world.update();
105 world.update();
106}examples/process_types.rs (line 83)
74fn main() {
75 let mut world = World::new();
76
77 {
78 let mut entity_manager = world.entity_manager();
79 let entity = entity_manager.create_entity();
80
81 entity.add_component(Position {pos : [0.0, 0.0, 0.0]});
82 entity.add_component(Mesh {mesh : "player".to_string()});
83 entity.refresh();
84 }
85
86 {
87 let mut entity_manager = world.entity_manager();
88 let entity = entity_manager.create_entity();
89 entity.add_component(Camera {pos : [0.0, 0.0, 0.0]});
90 entity.refresh();
91 }
92 // will process all entities with Position and Mesh,
93 // and in this process all entities with Camera will be accessable
94 world.set_system(RenderSystem);
95
96
97 // same system, but we will use another implementetion inside it, for processing all entities at once
98 world.set_system(DeferRenderSystem);
99
100 world.update();
101 world.update();
102}Sourcepub fn add_component<T: Any + Component>(&self, component: T)
pub fn add_component<T: Any + Component>(&self, component: T)
Examples found in repository?
examples/render_gui_system.rs (line 57)
55 fn on_created(&mut self, entity_manager : &mut EntityManager) {
56 let data_entity = entity_manager.create_entity();
57 data_entity.add_component(RenderData {facade : self.facade.clone()});
58 }
59 fn process_one(&mut self, _ : &mut Entity) {
60 self.facade.borrow_mut().draw_something("triangles triangles");
61 }
62}
63
64pub struct GuiSystem;
65
66impl System for GuiSystem {
67 fn aspect(&self) -> Aspect {
68 aspect_all!(GuiWindow)
69 }
70 fn data_aspects(&self) -> Vec<Aspect> {
71 vec![aspect_all!(RenderData, HeavyGuiData)]
72 }
73
74 fn process_d(&mut self, _ : &mut Entity, data : &mut DataList) {
75 let render_data = data.unwrap_entity().get_component::<RenderData>();
76 let _gui_data = data.unwrap_entity().get_component::<HeavyGuiData>();
77 render_data.facade.borrow_mut().draw_something("gui gui gui");
78 }
79}
80
81fn main() {
82 let mut world = World::new();
83 world.set_system(RenderSystem::new());
84 world.set_system(GuiSystem);
85 world.set_system(Glutin2HeavySystem);
86
87 {
88 let mut entity_manager = world.entity_manager();
89
90 {
91 let mesh = entity_manager.create_entity();
92
93 mesh.add_component(Renderable);
94 mesh.refresh();
95 }
96 {
97 let window = entity_manager.create_entity();
98
99 window.add_component(GuiWindow);
100 window.refresh();
101 }
102 }
103 world.update();
104 world.update();
105 world.update();
106}More examples
examples/process_macro.rs (line 50)
43fn main() {
44 let mut world = World::new();
45
46 {
47 let mut entity_manager = world.entity_manager();
48 let entity = entity_manager.create_entity();
49
50 entity.add_component(Position {x : 0});
51 entity.add_component(Velocity {x : 1});
52 entity.refresh();
53 }
54 world.set_system(MoveSystem);
55 world.update();
56
57 world.update();
58 world.update();
59}examples/multiple_fields.rs (line 46)
40fn main() {
41 let mut world = World::new();
42
43 {
44 let mut manager = world.entity_manager();
45 let entity = manager.create_entity();
46 entity.add_component(Health {hp : 100});
47 entity.add_component(Position {x : 5});
48 entity.add_component(Alive);
49 entity.refresh();
50 }
51 world.set_system(BleedZoneSystem);
52
53 for _ in 0..100 {
54 world.update();
55 }
56}examples/spawn_system.rs (line 27)
22 fn process_w(&mut self, entity : &mut Entity, world : &mut WorldHandle) {
23 let mut spawn_point = entity.get_component::<SpawnPoint>();
24
25 if spawn_point.count > 0 {
26 let spawned = world.entity_manager.create_entity();
27 spawned.add_component(SomeComponent { _some_data : spawn_point.data.to_string() });
28 spawned.refresh();
29
30 spawn_point.count -= 1;
31 }
32 }
33}
34
35fn main() {
36 let mut world = World::new();
37
38 {
39 let mut w = world.entity_manager();
40 let entity = w.create_entity();
41
42 entity.add_component(SpawnPoint {data : "player", count : 5});
43 entity.refresh();
44 }
45
46 world.set_system(SpawnSystem);
47
48 world.update();
49 world.update();
50}examples/systems.rs (line 61)
55fn main() {
56 let mut world = World::new();
57
58 {
59 let mut entity_manager = world.entity_manager();
60 let entity = entity_manager.create_entity();
61 entity.add_component(Position {pos : [0.0, 0.0, 0.0]});
62 entity.refresh();
63 }
64
65 // if you have position, you will be drawn
66 world.set_system(DrawerSystem);
67 // except you are dead
68 world.set_system(MoverSystem);
69 // but only if you are dead your corpse will be draw, too
70 world.set_system(DeadDrawerSystem);
71
72 world.update();
73 world.update();
74}examples/process_types.rs (line 81)
74fn main() {
75 let mut world = World::new();
76
77 {
78 let mut entity_manager = world.entity_manager();
79 let entity = entity_manager.create_entity();
80
81 entity.add_component(Position {pos : [0.0, 0.0, 0.0]});
82 entity.add_component(Mesh {mesh : "player".to_string()});
83 entity.refresh();
84 }
85
86 {
87 let mut entity_manager = world.entity_manager();
88 let entity = entity_manager.create_entity();
89 entity.add_component(Camera {pos : [0.0, 0.0, 0.0]});
90 entity.refresh();
91 }
92 // will process all entities with Position and Mesh,
93 // and in this process all entities with Camera will be accessable
94 world.set_system(RenderSystem);
95
96
97 // same system, but we will use another implementetion inside it, for processing all entities at once
98 world.set_system(DeferRenderSystem);
99
100 world.update();
101 world.update();
102}Sourcepub fn remove_component<T: Any>(&self)
pub fn remove_component<T: Any>(&self)
Remove component of given type from entity Be carefull, if this component is borrowed at this moment, it will not be really deleted.
Examples found in repository?
examples/multiple_fields.rs (line 34)
25 fn process_one(&mut self, entity : &mut Entity) {
26 let pos = entity.get_component::<Position>();
27 let mut health = entity.get_component::<Health>();
28
29 if pos.x == 5 {
30 health.hp -= 10;
31 println!("You are in bleeding zone, hp: {}", health.hp);
32 }
33 if health.hp <= 0 {
34 entity.remove_component::<Alive>();
35 entity.refresh();
36 }
37 }pub fn has_component<T: Any>(&self) -> bool
Sourcepub fn get_component<T: Any + Component>(&self) -> ComponentGuard<'_, T>
pub fn get_component<T: Any + Component>(&self) -> ComponentGuard<'_, T>
Move component from entity to CompoentGuard. In general case, it behaves like &mut T. While component is borrowed, second get_component() with same type will cause panic
Examples found in repository?
examples/systems.rs (line 25)
24 fn process_one(&mut self, entity : &mut Entity) {
25 let pos = entity.get_component::<Position>();
26 println!("{}", pos.pos[0]);
27 }
28}
29
30pub struct DeadDrawerSystem;
31impl System for DeadDrawerSystem {
32 fn aspect(&self) -> Aspect {
33 Aspect::all::<Position>().except::<Dead>()
34 }
35 fn process_one(&mut self, entity : &mut Entity) {
36 let pos = entity.get_component::<Position>();
37 println!("is dead {}", pos.pos[0]);
38 }
39}
40
41pub struct MoverSystem;
42impl System for MoverSystem {
43 fn aspect(&self) -> Aspect {
44 Aspect::all2::<Position, Dead>()
45 }
46
47 fn process_one(&mut self, entity : &mut Entity) {
48 let mut pos = entity.get_component::<Position>();
49 pos.pos[0] += 0.1;
50 println!("Moved! {}", pos.pos[0]);
51 }More examples
examples/process_types.rs (line 36)
34 fn process_d(&mut self, entity : &mut Entity, data : &mut DataList) {
35 let cam = data.unwrap_entity();
36 let cam = cam.get_component::<Camera>();
37
38 let pos = entity.get_component::<Position>();
39 let mesh = entity.get_component::<Mesh>();
40
41 println!("{}, {}, seen from camera pos: {:?}", mesh.mesh, pos.pos[0], cam.pos);
42 }
43}
44
45pub struct DeferRenderSystem;
46
47impl System for DeferRenderSystem {
48 fn aspect(&self) -> Aspect {
49 Aspect::all2::<Position, Mesh>()
50 }
51 fn data_aspects(&self) -> Vec<Aspect> {
52 vec![Aspect::all::<Camera>()]
53 }
54 fn process_all(&mut self,
55 entities : &mut Vec<&mut Entity>,
56 _ : &mut WorldHandle,
57 data : &mut DataList) {
58 entities.sort_by(|e1, e2| {
59 let defer1 = e1.get_component::<DeferMesh>();
60 let defer2 = e2.get_component::<DeferMesh>();
61 defer1.order.cmp(&defer2.order)
62 });
63 for entity in entities {
64 let cam = data.unwrap_entity();
65 let cam = cam.get_component::<Camera>();
66
67 let mesh = entity.get_component::<Mesh>();
68
69 println!("{}, seen from camera pos: {:?}", mesh.mesh, cam.pos);
70 }
71 }examples/multiple_fields.rs (line 26)
25 fn process_one(&mut self, entity : &mut Entity) {
26 let pos = entity.get_component::<Position>();
27 let mut health = entity.get_component::<Health>();
28
29 if pos.x == 5 {
30 health.hp -= 10;
31 println!("You are in bleeding zone, hp: {}", health.hp);
32 }
33 if health.hp <= 0 {
34 entity.remove_component::<Alive>();
35 entity.refresh();
36 }
37 }Auto Trait Implementations§
impl !Freeze for Entity
impl !RefUnwindSafe for Entity
impl !Send for Entity
impl !Sync for Entity
impl !UnwindSafe for Entity
impl Unpin for Entity
impl UnsafeUnpin for Entity
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more