我有一个玩具项目正在使用Amethyst game engine。我正在尝试编写自己的System
来收集用户输入,类似于他们实施FlyMovementSystem
的ArcBallRotationSystem
和here。
看来正确的收集老鼠运动的方法是通过EventChannel<Event>
,其中Event
来自winit
箱子,紫水晶依赖,但不再出口。
引用紫水晶相同的winit::Event
的“正确”方法是什么?
winit
添加到我的Cargo.toml
文件中吗?如果是这样,指定版本的推荐方法是什么? (我可以使用一些关键字而不是特定的版本号,以允许我“继承”紫水晶的依赖吗?)目前没有很好的解决方案来解决这个问题。最好的解决方法是在相同版本的传递依赖项上添加直接依赖项:
[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保持最新状态。我强烈建议添加注释,说明您选择特定版本的原因。
如果在没有使用底层依赖性的情况下很难使用包,我还鼓励您向父包提交一个问题,要求他们重新导出所需的内容。一个很好的例子是Tokio crate,re-exports large chunks of the futures crate。
与您的想法类似,I proposed有一种方法可以使用相同的版本作为依赖。相反,货运团队选择加入public and private dependencies的区别。虽然从工程的角度来看这将是一个更好的解决方案,但在实施它方面进展甚微。
也可以看看:
我将离开@ Shepmaster的答案作为被接受的答案,因为它回答了我想要的一般性问题。但是感谢@trentcl的温和推动,如果有人发现这个问题专门针对它与紫水晶的关系,这就是我最终做的事情。
不要试图获得winit::Events
。
当你将InputBundle<AX, AC>
附加到你的GameData时,它会设置一个InputSystem<AX, AC>
,它以winit::Events
的形式重新发布InputEvent<AC>
。
它通过将EventChannel<InputEvent<AC>>
设置为资源来实现,您可以通过ECS系统中的Read
类型访问它。 EventChannels及其用法解释in the Amethyst Book。
我已经切换到另一种方法来处理我的用户输入,但这里大概是它的样子(注意:Amethyst 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());
}
}