【发布时间】:2012-11-27 13:11:59
【问题描述】:
我正在查看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() 函数返回'didnt-take-turn',它告诉游戏逻辑什么都不做。这仍然意味着对于每个周期,都会花费两个,这不是所需的行为。如果您在每个周期都打印handle_keys() 的结果,则问题很容易观察到。它在“None”和“didnt-take-turn”之间交替。
老实说,我对此感到困惑。简单地按住一个方向按钮似乎不会产生'didnt-take-turn'输出,但该功能应该用于单个按键。延迟不能太短,因为正常的按键总是会产生两个输出。 libtcod 文档对我没有帮助。
我应该怎么做才能使单个击键仅触发单个console_wait_for_keypress()?
【问题讨论】:
标签: python keyboard roguelike libtcod