2013-05-18 10 views
1

나는 액션 스크립트 2.0을 사용하여 간단한 platformer를 만들려고하는데 키보드에서 입력하는 데 문제가 있습니다. 키를 눌렀다 놓을 때마다 호출되는 두 개의 함수 "myKeyDown"및 "myKeyUp"이 있습니다.릴리스 된 코드의 코드 받기

keyListener.onKeyDown = function(){ 
myKeyDown(); 
} 
keyListener.onKeyUp = function(){ 
myKeyUp(); 
} 

기능은 Key.getCode() 메소드를 사용하여 눌려진 키를 확인합니다. 그것은 myKeyDown에서 작동하지만 myKeyUp에서는 버그가 있습니다. 버그는 (예를 들어) 먼저 A (왼쪽으로 이동), W (점프), W를 놓은 다음 A를 놓으면 발생합니다. 플레이어가 움직이지 않을 것입니다. A)

여기에서 문제를 이해합니다. Key.getcode 마지막으로 누른 키의 코드를 반환하고 내가 원하는 것은 마지막으로 릴리스 된 키의 코드입니다. 이런 식으로 몇 시간 씩 해왔지만 아무것도 찾지 못했습니다.

다음은 보유해야 할 때/해제 여러 개의 키가 조금 다른 접근 키 처리를위한 더 나은 것, 모두 myKeyDown 및 myKeyUp 기능

이런 경우에 대한
function myKeyDown(){ 
//A 
if(Key.getCode() == 65){ 
    velX=-3; 
}else 
//D 
if(Key.getCode() == 68){ 
    velX=3; 
}else 
//W 
if(Key.getCode() == 87){ 
    if(isInAir == false){ 
     jump(); 
    } 
} 

} 

function myKeyUp(){ 
//A 
if(Key.getCode() == 65){ 
    if(velX==-3){ 
     velX=0; 
    } 
}else 
//D 
if(Key.getCode() == 68){ 
    if(velX==3){ 
     velX=0; 
    } 
} 
} 
+0

이벤트 폴링, 항상 문제를 혼합. 당신이 그 열쇠의 상태를 저장하더라도, 당신은 eventhandler가 발생했을 때 자비를 보입니다. Google 액션 스크립트의 여러 키를 사용하면 몇 가지 아이디어를 얻을 수 있습니다. –

답변

0

에 대한 코드입니다.

당신이 할 수있는 일은 연속적인 이벤트가있을 때 눌려진 키를 확인하기 위해 onEnterFrame 이벤트 리스너를 사용하는 것입니다.

var my_keys:Array = new Array(); 
my_keys["jump"]=false; 
my_keys["right"]=false; 
my_keys["left"]=false; 

//keydown sets the variables to true 
keyListener.onKeyDown = function(){ 
    code=Key.getCode(); 
    if(code==65){ 
    my_keys["left"]=true; 
    } 
    if(code==68){ 
    my_keys["right"]=true; 
    } 
    if(code==87){ 
    my_keys["jump"]=true; 
    } 
    //etc, etc, anything else you wish 
    //of course, this doesn't prevent you from calling additional one-time events from the keydown! 
} 
//keyup unsets the button variables 
keyListener.onKeyUp = function(){ 
    code=Key.getCode(); 
    if(code==65){ 
    my_keys["left"]=false; 
    } 
    if(code==68){ 
    my_keys["right"]=false; 
    } 
    if(code==87){ 
    my_keys["jump"]=false; 
    } 
} 

예를 들어 이제 게임의 모든 단계에서 당신은 my_keys 배열에 저장 누르면 키 세트가있다. 물론 keyDown/keyUp 내에서보다 일반적인 함수를 사용하고 Key.getCode 자체를 캡션 배열 (예 : my_keys[Key.getCode()]=true;) 대신 색인으로 배열에 전달하면 쓰기가 더 짧아 질 수 있습니다. 그러나,이 예를 좀 더 설명하기 위해 발견, 자유롭게 필요에 따라 코드를 수정할 수

지금 원하는 것은 키를 눌렀을 때의 동작을 처리하는 함수입니다. 귀하의 경우

이, 예를 들어, 수 :

this.onEnterFrame=function(){ //you don't have to use "this" movieclip reference if you have other enterframe events in the movieclip. just don't forget to modify the objcet paths 
    if(my_keys["left"]){ 
    velX=-3; 
    } 
    if(my_keys["right"]){ 
    velX=+3; 
    } 
    if((my_keys["jump"])&&(!isInAir)){ //note that i added !isInAir instead of (isInAir==false). this is an equivalent expression, it's just shorter and nicer 
    jump(); 
    } 
}