Я оставляю ответ @ Shepmaster как принятый, так как он отвечает на общий вопрос, на который я рассчитывал.Но благодаря мягкому толчку от @trentcl, в случае, если кто-то нашел этот вопрос специально для его отношения к Аметисту, вот что я в итоге сделал.
Не пытайтесь получить winit::Events
вall.
Когда вы присоединяете InputBundle<AX, AC>
к своим GameData, он устанавливает InputSystem<AX, AC>
, который повторно публикует winit::Events
в форме InputEvent<AC>
.
Это достигается путем установки EventChannel<InputEvent<AC>>
в качестве ресурса, к которому вы можете получить доступ через тип Read
в системе ECS.Каналы событий и их использование объясняются в Книге Аметистов .
С тех пор я переключился на другой подход для обработки моего пользовательского ввода, но вот примерно так это выглядело (примечание: Amethyst чуть позже 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());
}
}