質問

キーボード処理を実装する良い方法は何ですか?キーボードインタラクティブプログラム(テトリスゲームなど)を作成する任意の言語では、次のようなコードがいくつかあります。

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>

また、キーはさまざまなイベントに簡単にバインドでき、設定ファイルなどから読み取ることができ、イベントにバインドされていないキーは単に無視されます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top