Python / LibTCOD - 每次输入触发两次libtcod.console_wait_for_keypress(True)

时间:2012-11-27 13:11:59

标签: python keyboard roguelike libtcod

我正在浏览Roguebasin python/libtcod roguelike tutorial。我遇到的问题是,每次调用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'

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

console_wait_for_keypress(True)应该等待一把钥匙并将其放入" key"变量,所以我可以对它做出反应。所有其他输入应该被刷新。然后主循环的新迭代再次调用console_wait_for_keypress(True),它应该等待新的输入,依此类推。相反,console_wait_for_keypress(True)的每次迭代都会触发,而不会等待新的输入。

游戏实际上运行正常,因为第二个输入不会触发任何console_is_key_pressed()条件,而handle_keys()函数会返回“没有转弯”,这告诉我们游戏逻辑什么都不做。这仍然意味着每个周期都会花费两个,这不是理想的行为。如果您在每个周期打印handle_keys()的结果,则很容易观察到该问题。它在“无”和“无”之间交替。并且'没有转弯'。

老实说,我很难过。简单地按下方向按钮似乎不会产生“没有转向”的状态。输出,但该功能应该用于单个按键。延迟时间太短,因为正常的按键始终会产生两个输出。 libtcod文档无法帮助我。

我应该怎样做才能使一次按键触发只有一个console_wait_for_keypress()

1 个答案:

答案 0 :(得分:0)