我正在阅读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()
?