3

私はPyGameで簡単なゲームを開発しています... ロケット船が飛び回って物を撃っています。


質問:一度にあまりにも多くのキーが押されると、pygame がキーボード イベントの発行を停止するのはなぜですか?

キー処理について:KEYSTATE_FIRE, KEYSTATE_TURNLEFTプログラムには、 などの多くの変数があります。

  1. KEYDOWNイベントが処理されると、対応する変数が True に設定さKEYSTATE_*れます。
  2. イベントが処理されるKEYUPと、同じ変数が False に設定されます。

問題:UP-ARROWとが同時に押されている 場合、LEFT-ARROWが押されたときに pygame はKEYDOWNイベントを発行しませんSPACE。この動作はキーによって異なります。文字を押すと、pygame がKEYDOWN追加のキーのイベントの発行を停止する前に、約 5 個の文字を保持できるようです。

検証:メイン ループでは、受信した各イベントを単純に出力して、上記の動作を検証しました。

コード:参考までに、この時点で重要なイベントを処理する (大雑把な) 方法を次に示します。

while GAME_RUNNING:
    FRAME_NUMBER += 1
    CLOCK.tick(FRAME_PER_SECOND)

    #----------------------------------------------------------------------
    # Check for events
    for event in pygame.event.get():
        print event

        if event.type == pygame.QUIT:
            raise SystemExit()

        elif event.type == pygame.KEYDOWN and event.dict['key'] == pygame.K_UP:
            KEYSTATE_FORWARD = True
        elif event.type == pygame.KEYUP and event.dict['key'] == pygame.K_UP:
            KEYSTATE_FORWARD = False

        elif event.type == pygame.KEYDOWN and event.dict['key'] == pygame.K_DOWN:
            KEYSTATE_BACKWARD = True
        elif event.type == pygame.KEYUP and event.dict['key'] == pygame.K_DOWN:
            KEYSTATE_BACKWARD = False

        elif event.type == pygame.KEYDOWN and event.dict['key'] == pygame.K_LEFT:
            KEYSTATE_TURNLEFT = True
        elif event.type == pygame.KEYUP and event.dict['key'] == pygame.K_LEFT:
            KEYSTATE_TURNLEFT = False

        elif event.type == pygame.KEYDOWN and event.dict['key'] == pygame.K_RIGHT:
            KEYSTATE_TURNRIGHT = True
        elif event.type == pygame.KEYUP and event.dict['key'] == pygame.K_RIGHT:
            KEYSTATE_TURNRIGHT = False

        elif event.type == pygame.KEYDOWN and event.dict['key'] == pygame.K_SPACE:
            KEYSTATE_FIRE = True
        elif event.type == pygame.KEYUP and event.dict['key'] == pygame.K_SPACE:
            KEYSTATE_FIRE = False

    # remainder of game loop here...

このシーケンスを押す場合:

  • a (down)
  • s (down)
  • d (down)
  • f (down)
  • g (down)
  • h (down)
  • j (down)
  • k (down)
  • a (up)
  • s (up)
  • d (up)
  • f (up)
  • g (up)
  • h (up)
  • j (up)
  • k (up)

出力は次のとおりです。

  • <Event(2-KeyDown {'scancode': 30, 'key': 97, 'unicode': u'a', 'mod': 0})>
  • <Event(2-KeyDown {'scancode': 31, 'key': 115, 'unicode': u's', 'mod': 0})>
  • <Event(2-KeyDown {'scancode': 32, 'key': 100, 'unicode': u'd', 'mod': 0})>
  • <Event(2-KeyDown {'scancode': 33, 'key': 102, 'unicode': u'f', 'mod': 0})>
  • <Event(3-KeyUp {'scancode': 30, 'key': 97, 'mod': 0})>
  • <Event(3-KeyUp {'scancode': 31, 'key': 115, 'mod': 0})>
  • <Event(3-KeyUp {'scancode': 32, 'key': 100, 'mod': 0})>
  • <Event(3-KeyUp {'scancode': 33, 'key': 102, 'mod': 0})>
  • <Event(2-KeyDown {'scancode': 36, 'key': 106, 'unicode': u'j', 'mod': 0})>
  • <Event(2-KeyDown {'scancode': 37, 'key': 107, 'unicode': u'k', 'mod': 0})>
  • <Event(3-KeyUp {'scancode': 36, 'key': 106, 'mod': 0})>
  • <Event(3-KeyUp {'scancode': 37, 'key': 107, 'mod': 0})>

これはよくある問題ですか?回避策はありますか? そうでない場合、pygame を使用する際の複数キー制御の問題を処理する最良の方法は何ですか?

4

4 に答える 4

11

これはコードの問題ではなく、入力の問題のように思えます。問題はキーボード自体ではないのでしょうか? ほとんどのキーボードには、同時に押すことができるキーの数に制限があります。多くの場合、近くにある複数のキーを一度に押すことはできません。

テストするには、キーボードの文字を長押しして、新しい文字が表示されなくなるタイミングを確認します。

私の提案は、SPACE を別の場所の別のキーにマッピングして、何が起こるかを確認することです。

于 2009-02-23T06:02:08.443 に答える
5

他の人がすでに回避しているように、特定の(特に安価でローエンドの)キーボードには低品質のキーボードマトリックスがあります。これらのキーボードでは、特定のキーの組み合わせによって、発生している動作が発生します。もう 1 つの一般的な副作用は、「ゴースト キー」である可能性があります。これは、実際には押されていない余分なキーが入力ストリームに表示される場合です。

唯一の解決策 (問題がキーボード マトリックスに関連している場合) は、マトリックスの異なる行/列のキーを使用するようにキー マッピングを変更するか、より優れたマトリックスのキーボードを購入することです。

于 2009-02-23T20:42:15.553 に答える
2

一部のキーボードでは、特定のキーを一緒に送信できません。多くの場合、この制限には 3 つのキーで到達します。

于 2009-02-23T06:03:05.667 に答える
1

キーボードにもよるかもしれません。私の現在の名前のないキーボードは、同時に押される 2 つのキーしかサポートしていません。これは、ゲームでしばしば苦痛になります。

于 2009-02-23T06:02:59.957 に答える