gpt4 book ai didi

rust - 在Amethyst ECS架构中添加事件 channel

转载 作者:行者123 更新时间:2023-12-03 11:37:11 25 4
gpt4 key购买 nike

Amethyst Pong tutorial中,以某种方式解释了实体/组件/系统(ECS)体系结构,使我认为系统是在main函数中添加到游戏中的,不能在运行时添加或删除。
在同一本书中,我遵循this part添加了Producer系统和Receiver系统,这两个系统均与定制的EventChannel相关联。
由于ReceiverProducer是系统,因此在本教程中,我仅学习了如何在main函数中以及其他位置添加它们,而在代码示例中,是Receiver new实例调用Worldstruct方法。在World函数中,我没有main的任何实例,因为在创建过程中拥有其中之一似乎为时过早。
如何以符合ECS的适当方式完成?有没有办法在游戏循环中从状态中检索系统并在那里订阅?这是正确的吗?

最佳答案

来不及回答,但是万一其他人遇到了这个问题。
紫 Crystal 书中给出的一些示例(在本例中为事件 channel 示例)依赖于 bundle 您的系统,而不是直接将它们提供给GameDataBuilder。
bundle 包在构建时便可以访问该世界对象。
请参见官方的紫 Crystal 示例中的示例,该示例显示了如何在系统构造中利用事件 channel 和访问world对象。
https://github.com/amethyst/amethyst/tree/master/examples/events
例如:

# Custom Bundle.

#[derive(Debug)]
struct MyBundle;

impl<'a, 'b> SystemBundle<'a, 'b> for MyBundle {
fn build(
self,
world: &mut World,
builder: &mut DispatcherBuilder<'a, 'b>,
) -> Result<(), Error> {
builder.add(SpammingSystem, "spamming_system", &[]);
builder.add(
ReceivingSystemDesc::default().build(world),
"receiving_system",
&[],
);
Ok(())
}
}

# System.

#[derive(SystemDesc)]
#[system_desc(name(ReceivingSystemDesc))]
struct ReceivingSystem {
#[system_desc(event_channel_reader)]
reader: ReaderId<MyEvent>,
}

impl ReceivingSystem {
pub fn new(reader: ReaderId<MyEvent>) -> Self {
ReceivingSystem { reader }
}
}

impl<'a> System<'a> for ReceivingSystem {
type SystemData = Read<'a, EventChannel<MyEvent>>;

fn run(&mut self, my_event_channel: Self::SystemData) {
for event in my_event_channel.read(&mut self.reader) {
println!("Received an event: {:?}", event);
}
}
}

# Adding your bundle.

fn main() -> amethyst::Result<()> {
amethyst::start_logger(Default::default());

let assets_dir = application_root_dir()?.join("examples/events/assets");

let game_data = GameDataBuilder::default().with_bundle(MyBundle)?;

let mut game = Application::build(assets_dir, GameplayState)?
.with_frame_limit(FrameRateLimitStrategy::Sleep, 1)
.build(game_data)?;

game.run();
Ok(())
}

关于rust - 在Amethyst ECS架构中添加事件 channel ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62535820/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com