Roguebasin python/libtcod ローグライク チュートリアルを進めています。私が遭遇する問題は、 が呼び出されるたびkey = libtcod.console_wait_for_keypress(True)
に、メイン ループが 1 回ではなく 2 回起動することです。キーボード入力を処理するコードは次のとおりです。
def handle_keys():
#key = libtcod.console_check_for_keypress() #real-time
key = libtcod.console_wait_for_keypress(True) #turn-based
if key.vk == libtcod.KEY_ENTER and key.lalt:
#Alt+Enter: toggle fullscreen
libtcod.console_set_fullscreen(not libtcod.console_is_fullscreen())
elif key.vk == libtcod.KEY_ESCAPE:
return 'exit' #exit game
if game_state == 'playing':
#movement keys
if libtcod.console_is_key_pressed(libtcod.KEY_UP):
player_move_or_attack(0, -1)
elif libtcod.console_is_key_pressed(libtcod.KEY_DOWN):
player_move_or_attack(0, 1)
elif libtcod.console_is_key_pressed(libtcod.KEY_LEFT):
player_move_or_attack(-1, 0)
elif libtcod.console_is_key_pressed(libtcod.KEY_RIGHT):
player_move_or_attack(1, 0)
else:
return 'didnt-take-turn'
コードは、チュートリアルのこの部分からそのまま引用されています (余分な 4 スペースのインデントを除いて) 。そのページには 2 つのコード バージョンがあることに注意してください。独自のバージョンを作成しましたが、直接コピーして貼り付けても問題が発生します。私が知る限り、問題はチュートリアル全体に浸透しています。
console_wait_for_keypress(True)
単一のキーを待って「キー」変数に入れることになっているので、それに反応できます。他のすべての入力はフラッシュされるはずです。console_wait_for_keypress(True)
次に、新しい入力を待機することになっているメインループ呼び出しの新しい繰り返しなど。console_wait_for_keypress(True)
代わりに、新しい入力を待たずにトリガーの 2 番目の反復が実行されます。
console_is_key_pressed()
2 番目の入力は条件をトリガーせず、handle_keys()
関数は「didnt-take-turn」を返し、ゲーム ロジックに何もしないように指示するため、ゲームは実際には正常に動作します。これは、サイクルごとに代わりに 2 つが費やされることを意味しますが、これは望ましい動作ではありません。handle_keys()
すべてのサイクルの結果を印刷すると、問題は簡単に確認できます。「None」と「didnt-take-turn」を交互に繰り返します。
私は正直にこれに困惑しています。単に方向ボタンを押したままにすると、「didnt-take-turn」出力が生成されないように見えますが、この機能は単一のキー押下に使用されることになっています。通常のキー押下では常に正確に 2 つの出力が生成されるため、遅延が短すぎることはありません。libtcod のドキュメントは役に立ちません。
1回のキーストロークで1回だけトリガーするにはどうすればよいconsole_wait_for_keypress()
ですか?