我正在浏览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()
?
答案 0 :(得分:0)