3个版本

使用旧的Rust 2015

0.0.3 2016年4月9日
0.0.2 2016年4月4日
0.0.1 2016年4月3日

#1250 in 游戏开发

MIT许可证

31KB
684

TinyECS

Build Status

另一个用Rust编写的实体-组件-系统。

用法

用法

将以下内容添加到您的项目中的Cargo.toml中

[dependencies]
tinyecs = "*"
# features = ["prof"] <- for monitoring each system performance, but working only on nightly rust

并使用以下方式导入

extern crate tinyecs;
use tinyecs::*;

为什么还要另一个ecs?

  • 多个可变组件访问
  • 无需为实体和系统创建/访问编写样板代码
  • 组件内容无限制 - 非可复制非可克隆的结构体是OK的
  • 几乎可以在任何地方创建实体
  • 数据方面 - 在处理时查看一些额外的实体

概述

  • 实体是具有唯一ID的组件集合。

  • 组件是包含数据的结构体。

  • 系统是与组件一起工作的行为。

  • 组件

struct Position {
    x : i32,
    y : i32,
    z : i32
}
impl Component for Position {}

实体

let mut entity_manager = world.entity_manager();
let entity = entity_manager.create_entity();

entity.add_component(Position {x : 0, y : 0, z : 0});
entity.add_component(Velocity {x : 1});
entity.refresh();

系统

process_entities!((MoveSystem): |pos: Position, vel: Velocity| => {
    pos.x += vel.x;
    println!("Moving! position: {}, velocity: {}", pos.x, vel.x);
});

或者没有宏

pub struct MoverSystem;
impl System for MoverSystem {
    fn aspect(&self) -> Aspect {
        aspect_all![Position, Velocity]
    }

    fn process_one(&mut self, entity : &mut Entity) {
        let mut pos = entity.get_component::<Position>();
        let vel     = entity.get_component::<Velocity>(); // no problems with multiple mutable components

        pos.pos.x += vel.x;
    }
}

更多功能,目前仅在/examples中描述

  • 方面
  • 从系统的过程中创建实体
  • 数据方面 - 用于处理过程中的额外类型的实体
  • 不同的处理风格

在线文档

依赖关系

~0.6–1MB
~15K SLoC