そういえばユーザー入力をちゃんと取り扱っていなかったので、ここではまずはキーボードからの入力を取り扱います。マウスからの入力は少し説明することが多いので……。
ButtonInputリソース
キー入力は比較的簡単です。「リソース」の回で、Bevyの要素は、全体でひとつしかないものは「リソース」、複数あるものはエンティティになると説明しました。このうち、キーボード入力はリソースになっています。
キーボード入力を読み取るには、ButtonInput<KeyCode>
リソースを読み取ります。たとえば、私が作っているゲームではタブキーを押すとインベントリ(アイテム欄)が開くのですが、その操作を扱うtoggle_inventory
システムを定義して、keys: Res<ButtonInput<KeyCode>>
というシステムパラメータを読み取るようにします。あとは、keys.just_pressed
を呼べば、そのフレームで指定したキーが押されたかを判別できます。
fn toggle_inventory(
keys: Res<ButtonInput<KeyCode>>,
...
) {
if keys.just_pressed(KeyCode::Tab) {
...
}
}
ButtonInput
にはほかにも、そのフレームでキーが離されたかを調べるjust_released
と、指定したキーが押されたままになっているかを調べるpressed
があります。キャラクターの移動のようにキーを押し続ける操作の場合はpressed
のほうを使えばいいでしょう。また、複数のキーを指定して調べるany_pressed
なんかもあります。
キーイベント
テキストボックスへの文字入力などでどのキーが押されたのかをしりたいときに、すべてのキーに対してjust_pressed
で調べるのは無理があります。そういうときはキーボードイベントを参照すると、どのキーが押されたのかを順番にイベントとして取得することができます。以下はチートブックから拝借したサンプルコードです。「イベント」の回で説明したように、EventReader
でイベントを読み取ることができます。キーボードイベントの場合はEventReader<KeyboardInput>
というシステムパラメータを定義すればOKです。
fn keyboard_events(
mut evr_kbd: EventReader<KeyboardInput>,
) {
for ev in evr_kbd.read() {
match ev.state {
ButtonState::Pressed => {
println!("Key press: {:?} ({:?})", ev.key_code, ev.logical_key);
}
ButtonState::Released => {
println!("Key release: {:?} ({:?})", ev.key_code, ev.logical_key);
}
}
}
}
参考文献
話は変わりますが
記事のストックが底を尽いて、ひとりアドベントカレンダーへの記事投稿が遅れ始めました!やばい!