6 releases (breaking)

0.5.0 Mar 26, 2025
0.4.0 May 28, 2024
0.3.0 Sep 24, 2023
0.2.0 Sep 3, 2023
0.0.0 Jan 16, 2023

#538 in Game dev

Download history 63/week @ 2025-03-20 72/week @ 2025-03-27 3/week @ 2025-04-03

138 downloads per month

AGPL-3.0-only

57KB
1K SLoC

checs

Crates.io Documentation License

An Entity-Component-System library.

Disclaimer

This is a work in progress.

Example

This is a very basic example of how to use checs.

Note: You can find this example at examples/basic.rs. Run it with:

cargo run --example basic

Define some components and a World to store them in.

Note: Components are just plain old Rust types.

struct Position { x: u32, y: u32, }
struct Health(i32);
struct Visible;

use checs::component::ComponentVec;
use checs::Storage;

#[derive(Default, Storage)]
struct Storage {
    positions: ComponentVec<Position>,
    healths: ComponentVec<Health>,
    visibles: ComponentVec<Visible>,
}

let mut world = checs::world::World::<Storage>::new();

Create entities with initial components.

// Either manually...
let player = world.spawn();
world.insert(player, Position { x: 0, y: 0 });
world.insert(player, Visible);
world.insert(player, Health(80));

// ...or by using the `spawn` macro...
let obstacle = checs::spawn!(world, Position { x: 1, y: 1 }, Visible);
let trap = checs::spawn!(world, Position { x: 2, y: 1 });

// ...or by using `spawn_with`.
let enemy = world.spawn_with((Position { x: 1, y: 4 }, Visible, Health(100)));

Create a query to find the entities that share some components.

use checs::iter::LendingIterator;
use checs::query::IntoQuery;

let ps = &world.storage.positions;
let hs = &mut world.storage.healths;
let vs = &world.storage.visibles;

let query = (ps, hs, vs).into_query();

query.for_each(|(e, (p, h, _v))| {
    h.0 = h.0 - 17;
    println!("{e:?} at ({}, {}) has {} HP.", p.x, p.y, h.0);
});

// Entity(0) at (0, 0) has 63 HP.
// Entity(3) at (1, 4) has 83 HP.

Dependencies