Attribute Macro genesis_impl::world[][src]

#[world]

Generates an ECS (World) and a component enum containing all components.

Takes as input a struct with named fields. The names of the fields will correspond to the names of the storage types in the generated World. The storage type used can be specified with #[component(vec)] for VecStorage<T> (the default) or #[component(map)] for MapStorage<T>.

The name of the generated ECS is passed to the #[world] macro directly, together with the name of the component enum. The component enum is a generated enum with one variant per component type that can be used to register any of the component types on the generated World as an alternative to directly calling .set() on the corresponding storage field.

The generated ECS has a shared set of Entities that is also used by each storage to check if an entity exists; it is available via the .entities field. To avoid concurrency hazards, it is stored in an Arc<RwLock<Entities>>. The generated World has some utility methods for spawning new entities; these are handy shortcuts to accessing the underlying entities directly. When spawning entities in a batch, direct access is recommended to avoid re-acquiring the write lock over and over.

In addition to the component enum, this macro generates a “template” for an entity; this template has one public field of type Option<T> for every component and can be used to set the corresponding components on an entity. The name of these fields defaults to the name of the field in the World definition and can be customized via #[template_name(name)].

Attribute macros like #[derive(Debug)] are applied to both the component enum and the template struct. This can be very useful for debugging and provides a quick and simple way to define entities in data files and using e.g. serde to deserialize them into the generated Template struct.

Example

#[derive(Clone, Debug, Eq, PartialEq)]
pub struct Position {
   pub position: (u32, u32),
}

#[derive(Clone, Debug, Eq, PartialEq)]
pub struct NameComponent {
    pub name: String,
}

#[derive(Clone, Debug, Eq, PartialEq)]
pub struct RareComponent {
    pub data: u32,
}

#[world(MyComponent, Template)]
#[derive(Clone, Debug, Eq, PartialEq)]
pub struct World {
    #[component(vec)] //default, optional
    positions: Position,
    names: NameComponent,
    #[component(map)]
    rare_data: RareComponent,
}