我有一个使用Amethyst game engine的玩具项目。我正在尝试编写自己的System
来收集用户输入,类似于他们实现的here的FlyMovementSystem
和ArcBallRotationSystem
。
似乎收集鼠标移动的正确方法是通过EventChannel<Event>
,其中Event
来自紫晶所依赖的winit
板条箱,但不再出口。
什么才是引用紫晶所用的同一个 winit::Event
的“正确”方式?
winit
添加到我的Cargo.toml
文件吗?如果是,那么指定版本的推荐方式是什么?(是否有一些关键字可以用来代替特定的版本号,以允许我从实际上不鼓励的Amethyst?)发布于 2019-02-19 04:01:52
这个问题目前还没有很好的解决方案。最好的解决方法是在可传递依赖项的同一版本上添加直接依赖项:
[dependencies]
foo = "0.1"
bar = "0.2" # `foo` depends on bar 0.2 and we need to keep these in sync
您可以使用诸如cargo tree
之类的工具手动识别foo
所需的版本,并使您的Cargo.toml保持最新。我强烈建议您添加注释,说明您选择特定版本的原因。
如果在不使用底层依赖项的情况下使用机箱非常困难,我也鼓励您向父机箱提交问题,请求他们重新导出所需的内容。一个很好的例子是东京的板条箱,它的re-exports large chunks of the futures crate。
与您的想法类似,I proposed有一种方法可以使用相同的版本作为依赖项。取而代之的是,货运团队选择添加public and private dependencies的区别。虽然从工程角度来看,这将是一个更好的解决方案,但在实现它方面取得的进展很小。
另请参阅:
发布于 2019-02-21 11:52:40
我将@Shepmaster的答案保留为可接受的答案,因为它回答了我想要的一般问题。但感谢@trentcl的温和推动,如果有人发现这个问题特别是它与紫晶的关系,这是我最终要做的。
根本不要试图获取 winit::Events
。
当您将一个InputBundle<AX, AC>
附加到您的GameData时,它会设置一个InputSystem<AX, AC>
,它会以InputEvent<AC>
的形式重新发布winit::Events
。
它通过将EventChannel<InputEvent<AC>>
设置为资源来实现这一点,您可以通过ECS系统中的Read
类型访问该资源。in the Amethyst Book解释了EventChannels及其用法。
从那以后,我切换到了一种不同的方法来处理我的用户输入,但它看起来大致是这样的(注意:紫晶a little after v0.10.0):
pub struct MouseMovementSystem {
reader: Option<ReaderId<InputEvent<()>>>, // AC = ()
}
impl<'s> System<'s> for MouseMovementSystem {
type SystemData = (
Read<'s, EventChannel<InputEvent<()>>>,
/* and others */
}
fn run(&mut self, (events, /* and others */): Self::SystemData) {
let foo = events.read(self.reader.as_mut().unwrap())
.yadda_yadda(/* ... */); // event processing logic
do_stuff(foo);
}
fn setup(&mut self, res: &mut Resources) {
use amethyst::core::specs::prelude::SystemData;
Self::SystemData::setup(res);
self.reader = Some(res.fetch_mut::<EventChannel<InputEvent<()>>>().register_reader());
}
}
https://stackoverflow.com/questions/54754402
复制相似问题