Skip to main content
 首页 » 编程设计

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

2025年05月04日7mayingbao

我正在浏览 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”变量中,以便我可以对其使用react。所有其他输入都应该被刷新。然后主循环的新迭代再次调用 console_wait_for_keypress(True),它应该等待新的输入,等等。相反,console_wait_for_keypress(True) 的每两次迭代都会触发,而无需等待新的输入。

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

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

我应该怎么做才能使单个击键仅触发单个 console_wait_for_keypress()?

请您参考如下方法: