3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

🦀ひとりRustとBevyでゲーム開発🕊️Advent Calendar 2024

Day 20

【Rustのまほう2】#20 キーボード入力

Posted at

そういえばユーザー入力をちゃんと取り扱っていなかったので、ここではまずはキーボードからの入力を取り扱います。マウスからの入力は少し説明することが多いので……。

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);
            }
        }
    }
}

参考文献

話は変わりますが

記事のストックが底を尽いて、ひとりアドベントカレンダーへの記事投稿が遅れ始めました!やばい!

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?