今日はキーボードの入力を取得してみましょう。ゲーム的には、キーが「押された」「離された」「押されている」の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 を使って、「キーが押された」に反応出来たらゲーム制作に近づきそう。