Skip to content

Getting started

toyboot4e edited this page Mar 24, 2022 · 6 revisions

Getting started with toecs

First of all, create toecs::World:

use toecs::prelude::*;

let mut world = World::default();

Most of our game data will be in the world.

Resource: instance of a type

Resource is implemented for every type that is Send + Sync + 'static. They can be inserted into the world:

world.set_res(1usize);

And can be borrowed from the World:

*world.res_mut::<usize>() += 10;
assert_eq!(*world.res::<usize>(), 11);

World::res returns Res<T>, which is an immutable access to the resource of type T. World::res_mut returns ResMut<T>, which is a mutable access to the resource of type T.

ComponentPool: series of T, each of which is associated with an Entity

Non-unique thing in a World is referred to as an Entity:

let entity = world.spawn_empty();

Entity can be associated with any numbers of components. Component types need to be explicitly defined and registered:

use vek::Vec2;

#[derive(Component, Debug, Clone, Copy, PartialEq)]
pub struct Body {
    pub pos: Vec2<i32>,
    pub is_blocking: boool,
}

world.register::<Body>();

Components can be inserted to Entity:

world.insert(entity, Body::default());

Component pool can be borrowed from the world, just like a resource:

{
    let mut body_pool = world.comp_mut::<Body>();
    let body = body_pool.get_mut(entity).unwrap();
    body.pos = [10, 10].into();
}

assert_eq!(world.comp::<Body>().pos.into(), [10, 10]);

System: function that borrows World data

World data can be borrowed as Res<T>, ResMut<T>, Comp<T> or CompMut<T>. Let's make a function that takes some of them:

fn print_system(u: Res<usize>, body: Comp<Body>) {
    println!("usize: {}", *u);
    println!("bodies: {:?}", body.as_slice());
}

They can be run with the World, without passing the arguments manually:

world.run(print_system);