私はPyGameで簡単なゲームを開発しています... ロケット船が飛び回って物を撃っています。
質問:一度にあまりにも多くのキーが押されると、pygame がキーボード イベントの発行を停止するのはなぜですか?
キー処理について:KEYSTATE_FIRE, KEYSTATE_TURNLEFTプログラムには、 などの多くの変数があります。
KEYDOWNイベントが処理されると、対応する変数が True に設定さKEYSTATE_*れます。- イベントが処理される
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 を使用する際の複数キー制御の問題を処理する最良の方法は何ですか?