効果的なキーボード入力処理
-
10-07-2019 - |
質問
キーボード処理を実装する良い方法は何ですか?キーボードインタラクティブプログラム(テトリスゲームなど)を作成する任意の言語では、次のようなコードがいくつかあります。
for event in pygame.event.get():
if event.type == KEYDOWN:
if False: pass #make everything an elif
elif rotating: pass
elif event.key == K_q:
elif event.key == K_e:
elif event.key == K_LEFT:
curpiece.shift(-1, 0)
shadowpiece = curpiece.clone(); setupshadow(shadowpiece)
elif event.key == K_RIGHT:
curpiece.shift(1, 0)
shadowpiece = curpiece.clone(); setupshadow(shadowpiece)
(短縮)。これは私のメインループに行かなければならず、プログラムのすべての部分を混乱させるため、これは好きではありません。また、これにより、ユーザーがどのキーをどのアクションにマップするかを変更できるユーザー構成画面を使用できなくなります。何らかの形式の関数コールバックを使用してこれを行うには良いパターンがありますか?
解決
キーが入力で、値がキー押下を処理する関数である辞書を作成できます:
def handle_quit():
quit()
def handle_left():
curpiece.shift(-1, 0)
shadowpiece = curpiece.clone(); setupshadow(shadowpiece)
def handle_right():
curpiece.shift(1, 0)
shadowpiece = curpiece.clone(); setupshadow(shadowpiece)
def handle_pause():
if not paused:
paused = True
branch = {
K_q: handle_quit
K_e: handle_pause
K_LEFT: handle_left
K_RIGHT: handle_right
}
for event in pygame.event.get():
if event.type == KEYDOWN:
branch[event.key]()
キーの変更は、辞書のキーを変更することです。
他のヒント
superjoe30の回答に加えて、2レベルのマッピング(2辞書)
- key =>コマンド文字列
- command string =>関数
これにより、ユーザー定義のマッピングを許可しやすくなると思います。つまり、ユーザーは自分のキーを「コマンド」にマップできます。 "関数の名前"ではなく
最近私がしていることは、事前に定義されたキーとイベントのバインディングのリストをチェックする、ある種の入力収集クラス/関数/スレッドです。
次のようなもの:
class InputHandler:
def __init__ (self, eventDispatcher):
self.keys = {}
self.eventDispatcher = eventDispatcher
def add_key_binding (self, key, event):
self.keys.update((key, event,))
def gather_input (self):
for event in pygame.event.get():
if event.type == KEYDOWN:
event = self.keys.get(event.key, None)
if not event is None:
self.eventDispatcher.dispatch(event)
....
inputHandler = InputHandler(EventDispatcher)
inputHandler.add_key_binding(K_q, "quit_event")
...
inputHandler.gather_input()
....
これは基本的にsuperjoe30が行っていることです。ただし、コールバックを直接呼び出す代わりに、イベントディスパッチシステムを使用して別のレベルの分離を追加します。 p>
また、キーはさまざまなイベントに簡単にバインドでき、設定ファイルなどから読み取ることができ、イベントにバインドされていないキーは単に無視されます。
所属していません StackOverflow