2010-02-12 2 views
2

저는 Flash Actionscript 3.0 프로그래밍의 초보자입니다. 게임에서 플레이어가 움직일 수 있도록 부드러운 키보드 컨트롤을 만들려고합니다.Flash Actionscript 3.0에서는 플레이어 동작을위한 부드러운 키보드 컨트롤을 어떻게 만듭니 까?

저는 현재 addEventListener (KeyboardEvent.KEY_DOWN)를 사용하여 키보드 키를 청취 한 다음 .x 또는 .y 속성에 숫자를 추가하여 그래픽을 이동하는 핸들러 함수 내에서 사용합니다.

이렇게하면 처음에는 느리고 완고한 저크가 생성됩니다. 더 부드럽고 반응이 좋은 방법이지만 어디서부터 시작해야할지 모르겠습니다. 어떤 도움을 주시면 감사하겠습니다!

답변

0

어디에서 청취자를 배치합니까? 응용 프로그램 또는 이동해야하는 스프라이트에 있습니까? 키를 누르면 스프라이트에 포커스가 있습니까?

또한 이벤트 리스너를 추가 할 때 캡처를 사용하고 있습니까? 즉, 당신은 응용 프로그램 자체가 이벤트를 수신하는 경우에 당신이 그것을 할 필요가 어떻게 캡처를 사용하는 경우, 당신은 어떤을 얻을 것이다

addEventListener(KeyboardEvent.KEY_DOWN, yourHandler, true) 

같이 true로 세번째 인수를 설정하고있다 대기 시간이 길어지고 인터페이스가 더 복잡할수록 대기 시간은 길어집니다. 이러한 이벤트가 방대한 계층 구조를 따라 움직여야하는 경우 눈에 띄게 될 수 있습니다. 스프라이트가 많으면 문제가 악화 될 수 있습니다.

당신이 할 수있는 일은 컨트롤러 클래스가 각 스프라이트를 청취하는 커스텀 이벤트를 포커스를 가지는 스프라이트로 만드는 것입니다. 컨트롤러 클래스에는 event.currentTarget을 이동시키는 핸들러가 있지만 처리를 완료 할 계획입니다.

또한 사용자 정의 이벤트 및 SystemManager를 사용하여 리스너를 동적으로 추가 및 제거하는 방법에 대해 읽습니다 (http://livedocs.adobe.com/flex/3/langref/index.html).

2

부드러운 키의 경우 타이머 또는 onEnterFrame을 사용하여 부드러운 컨트롤을 얻기에 충분한 키를 폴링하는 것이 좋습니다. 일을 끝내게되지만, 일정한 비용으로 끝날 것입니다.

var key:int = NaN; 

stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyPress,false,0,true); 
stage.addEventListener(KeyboardEvent.KEY_UP, onKeyRelease,false,0,true); 
this.addEventListener(Event.ENTER_FRAME,update,false,0,true); 

function onKeyPress(event:KeyboardEvent):void { 
    key = event.keyCode; 
    event.stopPropagation(); 
} 
function onKeyRelease(event:KeyboardEvent):void { 
    key = NaN; 
    event.stopPropagation(); 
} 
function update(event:Event):void{ 
    if(key) trace(key); 
} 

내가 이벤트가 전파의 중지하여 거품을하지 않도록, 그리고이 있어야 무대에 설정되어 : 모든 고급 로직의 나머지를 가지고 있다면,이 확인에 맞게해야 최상위 레벨, 이벤트 현명. 또한 나는 키가 다운 된 경우에만 키를 사용하고 그렇지 않으면 enterFrame 핸들러에서 키를 무시합니다.

HTH, 조지

+2

이렇게하십시오. 명확히 말하면, 질문자 버전의 문제는 키가 실제로 눌려지면 움직이기 때문에 처음 키를 누를 때 한 번 움직이며 OS가 반복적 인 이벤트를 발행 할 때만 더 이동한다는 것입니다. 키를 누르고있다. 캐릭터가 움직이기를 원하지 않는다. * 키를 눌렀을 때 * 키를 누른 상태에서 프레임 업데이트 *를 움직이기를 원한다. 따라서 키 누르기 핸들러가 아닌 ENTER_FRAME 핸들러에서 움직임이 일어나야한다. – fenomas

0

이의 가장 간단한 예를 들어이 될 것입니다.
여기에 제어 가능한 Ship 클래스 (Ship.as)가 있습니다.

import flash.display.MovieClip; 
import flash.events.KeyboardEvent; 
import flash.events.Event; 

public class Ship extends MovieClip { 

    private var speedX; 
    private var speedY; 

    public function Ship() { 
     //constructor 
     stage.addEventListener(KeyboardEvent.KEY_DOWN ,keyDown); 
     stage.addEventListener(KeyboardEvent.KEY_UP ,keyUp); 
     stage.addEventListener(Event.ENTER_FRAME, update); 
    } 

    public function keyDown(e:KeyboardEvent) { 
     if(e.keyCode == 37) { 
      speedX = -5; 
     } 
     if(e.keyCode == 38) { 
      speedY = -5; 
     } 
     if(e.keyCode == 39) { 
      speedX = 5; 
     } 
     if(e.keyCode == 40) { 
      speedY = 5; 
     } 
    } 

    public function keyUp(e:KeyboardEvent) { 
     if(e.keyCode == 37 || e.keyCode == 39) { 
      speedX = 0; 
     } 
     if(e.keyCode == 38 || e.keyCode == 40) { 
      speedY = 0; 
     } 
    } 

    public function update(e:Event) { 
     x += speedX; 
     y += speedY; 
    } 

} 
관련 문제