我正在通過Roguebasin python/libtcod roguelike tutorial。我遇到的問題是,每次調用key = libtcod.console_wait_for_keypress(True)
時,主循環都不是一次,而是兩次。該代碼處理鍵盤輸入如下:Python/LibTCOD - 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)
應該等待一個密鑰並將其放入「密鑰」變量中,以便我可以對其作出反應。所有其他輸入應該被刷新。然後,主循環的新迭代再次調用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()
?
啊,所以它被竊聽。謝謝。我想我會改用wait_for_event,但現在我知道代碼沒有問題。你的幫助非常好。 – Mainframe