# XECS An Entity-Component-System library ## Simple Example ```rust,no_run // Define two components struct // Component is Send + Sync + 'static #[derive(Debug,Copy)] struct Position{ x : f32, y : f32 }; struct Hidden;
// create an empty world let mut world = World::new();
// generate 10 entities for _ in 0..10 { let x = random(); lety = random(); // andomly generate the positions world.create_entity() .attach(Position { x,y }); }
// print all postions for pos in world.query::<&Position>() { print!("{:?}",pos) }
// filter some entities need to be hidden
let ids = world.query::<&Position>()
.withid()
.filter(|(,)|random())
.map(|(id,)|id)
.collect::
// attach hidden to id for id in ids { world.attach_component(id,Hidden); }
// make a full-owning group to accelerate the query
world.makegroup(fullowning::
// only print postions with id that is not hidden for (id,data) in world.query::<&Position,Without<&Hidden>>() { print!("{}:{:?}",id,data); } ```
# About entity
Entity in XECS is just an number ID.In XECS, it's just a
NonZeroUsize.
The ID is allocated from 1 by world automatically. The id=0
represents a recycled ID without any other flags through Option<EntityId>
.
# ID recycling
When you call world.create_entity()
, an ID will be allocated automatically.
If you call world.remove_entity(id)
, this ID will be a pit. If the
next world.create_entity()
is called, it will allocate this ID to fill
the pit.Thanks to sparse set, it's still fast to
iterate all components no matter how random of ID
# Concurrency Safety
Because Component is just T : Send + Sync
.
World can use RwLock to
ensure the borrow check relations of all components.And World can also
be Send + Sync
.Therefore,the all other states of world can be guarded
by RwLock.So we can use world in concurrency environment by RwLock<World>
.
# System in XECS System is a Stream with World as Context. Because Stream is not stable in std, XECS use futures::Stream instead. # To Run System Because system is just an async trait, you need a wrapper of runtime from tokio or async-std