pyglet でキーボードの入力を取得

今日はキーボードの入力を取得してみましょう。ゲーム的には、キーが「押された」「離された」「押されている」の3つの状態が取れれば、まあなんとかなるでしょう。

凝ったことをやろうとすると「長押し」とかも判定したくなりけどね…。最低限は上記の3つで。

Keyboard input — pyglet v2.0.15

ドキュメントを読むと、on_key_press, on_key_release で「押された」「離された」を取得するようになっていますね。機能としては前述の2つがメインで、「押されている」を取得するためにKeyStateHandler という別クラスが用意されている感じですか。

on_key_press と on_key_release だけを使って、自分で書いてしまったほうが楽な気もします。まずは「押されている」状態を判定することを目指しましょう。

https://github.com/jpaalasm/pyglet/blob/master/pyglet/window/key.py
参考に、GitHub の key.py の実装を見てみます。KeyStateHandler は dict 型を継承して作っていて、True/False で状態を覚えているんですね。これを真似して、bool 型で defaultdict を作って覚えてしまえば、同じことになりそうな気がします。

from collections import defaultdict
import pyglet

window = pyglet.window.Window()
window.set_mouse_visible(True)

label = pyglet.text.Label('Key Test',
                          font_name='Times New Roman',
                          font_size=36,
                          x=window.width//2, y=window.height//2,
                          anchor_x='center', anchor_y='center')

key_status = defaultdict(bool)

@window.event
def on_draw():
    window.clear()

    label.text = ''
    for k, v in key_status.items():
        if v:
            label.text += chr(k) + ','

    label.draw()

@window.event
def on_key_press(symbol, modifiers):
    key_status[symbol] = True

@window.event
def on_key_release(symbol, modifiers):
    key_status[symbol] = False

pyglet.app.run()

キーを押している間だけ、画面にキーが描画されるはずです。あとは on_key_press を使って、「キーが押された」に反応出来たらゲーム制作に近づきそう。

タイトルとURLをコピーしました