2

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()ですか?

4

1 に答える 1

0

これは最後のsvnで修正されています: http ://doryen.eptalys.net/forum/index.php?topic = 1500.msg8507#msg8507

またはここ: https ://bitbucket.org/jice/libtcod

于 2012-11-27T19:00:09.167 に答える