首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何正确引用相同的代码作为依赖项的依赖项?

如何正确引用相同的代码作为依赖项的依赖项?
EN

Stack Overflow用户
提问于 2019-02-19 03:52:09
回答 2查看 78关注 0票数 2

我有一个使用Amethyst game engine的玩具项目。我正在尝试编写自己的System来收集用户输入,类似于他们实现的hereFlyMovementSystemArcBallRotationSystem

似乎收集鼠标移动的正确方法是通过EventChannel<Event>,其中Event来自紫晶所依赖的winit板条箱,但不再出口。

什么才是引用紫晶所用的同一个 winit::Event 的“正确”方式?

  • 我应该将winit添加到我的Cargo.toml文件吗?如果是,那么指定版本的推荐方式是什么?(是否有一些关键字可以用来代替特定的版本号,以允许我从实际上不鼓励的Amethyst?)
  • Is引用子依赖项中“继承”依赖项?如果是这样,我应该怎么做呢?
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-02-19 04:01:52

这个问题目前还没有很好的解决方案。最好的解决方法是在可传递依赖项的同一版本上添加直接依赖项:

代码语言:javascript
复制
[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的区别。虽然从工程角度来看,这将是一个更好的解决方案,但在实现它方面取得的进展很小。

另请参阅:

票数 4
EN

Stack Overflow用户

发布于 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):

代码语言:javascript
复制
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());
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54754402

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档