8个版本
使用旧的Rust 2015
0.0.8 | 2016年7月10日 |
---|---|
0.0.7 | 2016年6月25日 |
0.0.1 | 2016年4月5日 |
#30 in #event-handling
71 每月下载量
585KB
1.5K SLoC
包含(WOFF字体,120KB)doc/Heuristica-Italic.woff,(WOFF字体,90KB)doc/FiraSans-Medium.woff,(WOFF字体,92KB)doc/FiraSans-Regular.woff,(WOFF字体,56KB)doc/SourceCodePro-Regular.woff,(WOFF字体,56KB)doc/SourceCodePro-Semibold.woff,(WOFF字体,49KB)doc/SourceSerifPro-Bold.woff 以及更多。
Entity Rust
该项目刚开始形成功能。请在测试目录中查看如何使用它的示例。
总体思路
该项目是一个用于在传统ECS风格中定义组件和系统的DSL和框架。系统是事件驱动的,将组件视为订阅的资源。因为框架了解每个事件处理器使用的组件,所以它可以(理论上)高效地并行调度事件。DSL和Rust一起强制执行系统的并发性和类型安全性。它应该具有高性能(即我编写这个项目的目标是实现像Simcity或Dwarf Fortress这样的大型模拟游戏)。但测试应该证明我是否真正实现了这一点。
lib.rs
:
目标
我们想要定义组件,以高效的方式存储它们,并使它们可用于系统。
我们想要定义事件及其类型,并使它们可用于系统。
我们想要定义通过事件由其他系统触发的,在组件列表上操作的系统。
实现
对于每种组件类型,将有一个列表,它是一个实体ID和组件值的元组。还将有一个从实体ID到组件列表索引的映射。
系统将由状态、其订阅的组件的迭代器以及由事件触发的任何数量的函数组成。
语法
component! { Physics, body: physics.RigidBody, physics_id: physics.ID }
// event! { GameStarted } // This one is implicitly defined
event! { PhysicsTick, dt: u64 }
event! { Bump, e1: EntityID, e2: EntityID }
system! { PhysicsSystem,
state! { world: physics.World }
on! { GameStarted, {
state.world = physics.World::new(event.name);
state.world.on_collision = |e1, e2| {
unwrap_entity = |e| { e.user_data.downcast_ref<EntityID>() }
trigger! { Bump, unwrap_entity(e1), unwrap_entity(e2) }
};
}}
on! { PhysicsTick, {
state.world.step(event.dt);
}}
component_added! { Physics, {
let id = state.world.add_body(component.body);
component.physics_id = id;
}}
component_removed! { Physics, {
state.world.remove_body(component.physics_id);
}}
}
system! { BumpSystem, {
on! { Bump, {
println!("Entity {:?} bumped into entity {:?}!", e1, e2);
}}
}}