Entity Component System
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Florian Blasius fb2c26381c Fix shareing of shared components. 1 month ago
.vscode Fix string key example. 1 month ago
examples Fix shareing of shared components. 1 month ago
src Fix shareing of shared components. 1 month ago
tests Work on test fix. 1 month ago
.gitignore [update] rust 2018 part I 11 months ago
.gitlab-ci.yml Update .gitlab-ci.yml 4 months ago
CHANGELOG.md quick fix. 1 month ago
Cargo.toml fix. 4 months ago
LICENSE Update. 1 year ago
README.md Adjust api. 1 month ago

README.md

DCES

DCES is a library that provides a variant of the Entity Component System: https://en.wikipedia.org/wiki/Entity–component–system.

The goal of DCES is a lightweight ECS library with zero dependencies used by UI frameworks and game engines. It is being developed as part of OrbTk an (G)UI framework written in Rust. All widgets and properties of OrbTk are handled by DCES.

Build status MIT licensed crates.io docs.rs

Features:

  • Register entities with components
  • Share components between entities
  • Register systems and read / write components of entities
  • Order systems execution by priority
  • Register container for entity organization (Vec, HashMap, Custom Container, …)
  • Register init and cleanup system

Usage

To include DCES in your project, just add the dependency line to your Cargo.toml file:

dces = "0.2"

To use DCES master, just add the dependency line to your Cargo.toml file:

dces = { git = https://gitlab.redox-os.org/redox-os/dces-rust.git }

Example

use dces::prelude::*;

#[derive(Default)]
struct Name {
    value: String,
}

struct PrintSystem;

impl System<EntityStore, ComponentStore> for PrintSystem {
    fn run(&self, ecm: &mut EntityComponentManager<EntityStore, ComponentStore>) {
        let (e_store, c_store) = ecm.stores();

        for entity in &e_store.inner {
            if let Ok(comp) = c_store.get::<Name>(*entity) {
                println!("{}", comp.value);
            }
        }
    }
}

fn main() {
    let mut world = World::<EntityStore, ComponentStore>::new();

    world
        .create_entity()
        .components(
            ComponentBuilder::new()
                .with(Name {
                    value: String::from("DCES"),
                })
                .build(),
        )
        .build();

    world.create_system(PrintSystem).build();
    world.run();
}

You could find additional examples in the examples/ directory.

You can start the basic example by executing the following command:

cargo run --example basic

Build and run documentation

You can build and run the latest documentation by executing the following command:

cargo doc --no-deps --open

Future features

  • Concurrency of systems with same priority
  • Advanced example
  • Book

Inspirations

FAQ

Why not Specs

Because DCES is developed to fulfill the requirements of OrbTk. To reduce the dependency tree of OrbTk DCES depends on zero crates.

License

Licensed under MIT license (LICENSE).