2012-11-27 20 views
2

我正在通過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()

回答