2012-11-27 2 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)은 하나의 키를 기다렸다가 "키"변수에 넣어서 응답 할 수 있습니다. 다른 모든 입력은 플러시 (flush)되어야합니다. 그런 다음 메인 루프의 새로운 반복은 새로운 입력을 기다리는 것으로 가정 된 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()을 하나만 트리거하도록하려면 어떻게해야합니까?

답변

관련 문제