3个版本
使用旧的Rust 2015
0.0.3 | 2016年4月9日 |
---|---|
0.0.2 | 2016年4月4日 |
0.0.1 | 2016年4月3日 |
#1250 in 游戏开发
31KB
684 行
TinyECS
另一个用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