#entity #ecs #es #game #event-handling #ces

nightly entity_rust

适用于Rust的事件驱动CES框架,具有宏DSL

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

Download history 22/week @ 2024-03-27 22/week @ 2024-04-03 2/week @ 2024-05-29 2/week @ 2024-06-05 57/week @ 2024-06-19 9/week @ 2024-06-26 5/week @ 2024-07-03

71 每月下载量

MIT 许可证

585KB
1.5K SLoC

JavaScript 837 SLoC // 0.2% comments Rust 558 SLoC // 0.0% comments

包含(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

该项目刚开始形成功能。请在测试目录中查看如何使用它的示例。

总体思路

General Idea

该项目是一个用于在传统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);
  }}
}}

依赖项