问题描述
考虑一个代表玩家 struct TilePos(i32,i32);
并生成为 commands.spawn((TilePos(0,0),));
的简单组件。
对键盘输入做出反应的正确方式是什么,例如方向键,并在每次按下一个键时将 TilePos
更改为 1?
解决方法
您可能想查看 the cookbook 以获取更多示例。
如果只有一个玩家,那么您应该将其设为资源,以便您可以在函数定义中执行以下操作:ResMut<TilePos>
。
否则你可以这样做:
#[derive(Default)]
struct State {
event_reader: EventReader<KeyboardInput>,}
/// This system prints out all keyboard events as they come in
fn print_keyboard_event_system(
mut state: Local<State>,keyboard_input_events: Res<Events<KeyboardInput>>,mut query: Query<&mut TilePos>
) {
for event in state.event_reader.iter(&keyboard_input_events) {
if event.state == bevy::input::ElementState::Pressed && event.key_code == Some(bevy::input::keyboard::KeyCode::Up){
for mut t in &mut query.iter_mut() {
t.1 += 1;
println!("New Tile: {} {}",t.0,t.1);
println!("{:?}",event);
}
}
}
}
如果您想编辑特定的磁贴,则可以使用另一个组件 (.with()
) 生成它,并使用 query
使 Query<TilePos,With<Specific>>
更加具体。
此代码改编自here。