2

我正在阅读Roguebasin python/libtcod roguelike 教程。我遇到的问题是,每次key = libtcod.console_wait_for_keypress(True)调用时,主循环都不会触发一次,而是触发两次。处理键盘输入的代码如下:

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'

代码从本教程的这一部分逐字提取(除了额外的四个空格缩进) 。请注意,该页面上有两个代码版本。我写了自己的版本,但即使直接复制/粘贴,我也会遇到问题。据我所知,这个问题贯穿了整个教程。

console_wait_for_keypress(True)应该等待一个键并将其放入“键”变量中,这样我就可以对其做出反应。所有其他输入都应该被刷新。然后再次调用主循环的新迭代console_wait_for_keypress(True),这应该等待新的输入,依此类推。相反,触发器的每第二次迭代都console_wait_for_keypress(True)无需等待新的输入。

游戏实际上运行良好,因为第二个输入不会触发任何console_is_key_pressed()条件,并且handle_keys()函数返回“didnt-take-turn”,它告诉游戏逻辑什么都不做。这仍然意味着对于每个周期,都会花费两个,这不是所需的行为。handle_keys()如果您打印每个循环的结果,问题很容易观察到。它在“None”和“didnt-take-turn”之间交替。

老实说,我对此感到困惑。简单地按住一个方向按钮似乎不会产生'didnt-take-turn'输出,但该功能应该用于单个按键。延迟不能太短,因为正常的按键总是会产生两个输出。libtcod 文档无法帮助我。

我应该怎么做才能使单次击键仅触发一次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 回答