在 Bevy 中按下某个键时如何修改特定组件?

问题描述

考虑一个代表玩家 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