2013-06-17 1 views
2

저는 키 입력을 받아들이 기 위해 AIR를 사용하여 표준 키보드 제어 게임을 얻으려고합니다. 이 게임은 한 방향으로 달리고 다른 방향으로 빨리 돌아갈 수있는 능력이 필요합니다. 그러나 키 "A"에서 "D"로 연속해서 전환 할 때 잠시 동안 내 캐릭터가 멈추고 마치 ON_KEY_DOWN 이벤트에서 내 캐릭터를 움직이는 것처럼 계속됩니다. 부울 값을 사용하여 문자를 이동하는 데 ENTER_FRAME을 사용하는 방법을 이해하고 다른 사람들이 자습서를 본 적이 있습니다. 자습서에서도 이와 똑같은 문제가 있음을 알았습니다. 이-SOLVED- 신속하게 키를 전환 할 때 방금 누르는 키에 대해 내 KEY_UP 이벤트가 실행되는 이유는 무엇입니까?

public static function initialize(s:Stage, autoClear:Boolean = true):void { 
     if(initialized) { 
      return; 
     } 
     initialized = true; 
     if(autoClear) { 
      s.addEventListener(Event.ENTER_FRAME, handleEnterFrame, false, -1000, true); /// Very low priority. 
     } 
     s.addEventListener(KeyboardEvent.KEY_DOWN, handleKeyDown, false, 0, true); 
     s.addEventListener(KeyboardEvent.KEY_UP, handleKeyUp, false, 0, true); 
     s.addEventListener(MouseEvent.MOUSE_UP, handleMouseUp, false, 0, true); 
     s.addEventListener(MouseEvent.MOUSE_DOWN, handleMouseDown, false, 0, true); 
     s.addEventListener(MouseEvent.MOUSE_MOVE, handleMouseMove, false, 0, true); 
     s.addEventListener(Event.MOUSE_LEAVE, handleMouseLeave, false, 0, true); 
     s.addEventListener(Event.DEACTIVATE, handleDeactivate, false, 0, true); 
     stage = s; 
    } 

    /** 
    * Record a key down, and count it as a key press if the key isn't down already. 
    */ 
    public static function handleKeyDown(e:KeyboardEvent):void { 
     if(!keysDown[e.keyCode]) { 
      keysPressed[e.keyCode] = true; 
      keysDown[e.keyCode] = true; 
     } 
    } 

    /** 
    * Record a key up. 
    */ 
    public static function handleKeyUp(e:KeyboardEvent):void { 
     keysUp[e.keyCode] = true; 
     delete keysDown[e.keyCode]; 
    } 
(이 이상한 문제를 연구하는 시도 마태 복음 부시에서 차용 한) 입력 클래스의 조각이

private function OnEnterFrame(e:Event = null):void 
{ 
    if (Input.kd("W")) 
    { 
     this.y -= runSpeed; 
     SetAnimation(RUNUP); 
    } 
    else if (Input.kd("S")) 
    { 
     this.y += runSpeed; 
     SetAnimation(RUNDOWN); 
    } 
    else if (Input.kd("A")) 
    { 
     this.x -= runSpeed; 
     SetAnimation(RUNLEFT); 
    } 
    else if (Input.kd("D")) 
    { 
     this.x += runSpeed; 
     SetAnimation(RUNRIGHT); 
    } 
    else 
     SetAnimation(IDLE); 
} 

:

는 Player.as 클래스의 코드 조각입니다 이제

Key Down: 68 //Holding D 
Key Down: 65 //Let go of D and pressed A 
Key Up: 68 //D KeyUp fires 
Key Up: 65 //A KeyUp fires, but I only just pressed A and didn't let it go 

, 더 명확한 설명을위한 시나리오 : 여기

그리고 출력입니다 : 캐릭터를 오른쪽으로 돌리려면 D를 누르고 있다고합시다.이 시점에서 모두 괜찮습니다. 나는 빨리 D를 놓아주고 A를 눌러 다른 방향으로 돌리면 문제가 발생합니다. handleKeyUp에서 추적하는 동안, 그것은 A와 A 모두가 동시에 A를 눌렀음에도 불구하고 동시에 풀려 났다고 말합니다. 결코 풀어지지 않았습니다. 이렇게하면 내 보류 된 키 사전에서 D와 A가 모두 사라지고 플레이어가 스플릿 순간에 멈추게되며 handleKeyDown이 시작되면 바로 올바른 방향으로 뛰기 시작합니다. 이것에 대해 내가 뭘 할 수 있니? 추가 설명이나 추가 코드가 필요한 경우 알려 주시기 바랍니다.

+0

자신 만의 문제를 해결할 때 자신의 질문에 대한 해답을 설명하는 것이 좋습니다. – Marty

+0

죄송합니다. 그런 식으로 답변 할 수있는 방법을 찾았지만 직접 질문에 답장을 보내지 못했습니다. –

답변

1

실제 문제가 무엇인지 발견했습니다. 직장에서 퇴근했을 때, 내 게임은 현재 코드로 완벽하게 작동했으며 오늘 다시 돌아와 게임이 제대로 작동하지 않았습니다. 문제는 내 키보드로 특별히 밝혀졌습니다. USB 변환기에 연결된 Ps/2 케이블이있는 이전 키보드를 사용하고 있습니다. 키보드를 USB 키보드로 교체했을 때 아무런 문제가 없었습니다. 나는이 문제를 무시하고 싶지 않기 때문에 Ps/2 케이블 키보드에서이 문제를 해결할 방법을 찾고있다.

관련 문제