我要检查一下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(),我应该做些什么
发布于 2012-11-28 03:00:09
它在最后一个svn中修复:http://doryen.eptalys.net/forum/index.php?topic=1500.msg8507#msg8507
https://stackoverflow.com/questions/13585011
复制相似问题