2009-06-06 5 views
2

클래스 내에서 키보드 이벤트가 작동하는 데 문제가있는 것처럼 보입니다. 제대로 작동하는 ENTER_FRAME 이벤트가 있지만 키보드 이벤트가 호출되지 않습니다. 어떤 아이디어? 여기에 코드가 있습니다수업 내 AS3 키보드 이벤트?

package 
{ 
import flash.display.MovieClip; 
import flash.display.Stage; 
import flash.events.*; 
public class mainGame extends MovieClip 
{ 
    var myPlayer:player = new player(); 
    function mainGame():void 
    { 
     trace("arg!"); 
     addChild(myPlayer); 
     addEventListener(KeyboardEvent.KEY_DOWN, keyDown); 
     addEventListener(Event.ENTER_FRAME, update); 
    } 
    function keyDown(evt:KeyboardEvent):void 
     { 
          trace("This never happens"); 
      myPlayer.x++; 
     } 
     function update(evt:Event):void 
     { 
      trace("This happens fine"); 
     } 

} 
} 

감사합니다.

답변

16

AS2와 달리 AS3에서 키보드 이벤트는 전역 적이 지 않습니다. 그것들은 무대에 발행되며, 디스플레이 목록을 통해 표시 객체가 포커스를 가지고있는 곳으로 버블 링됩니다. 코드에서 이벤트 수신기는 mainGame에 추가되므로 mainGame이 무대에있을 때만 실행되며 사용자는 mainGame 무비 클립을 클릭 (또는 마우스 오버 라이트, 잊어 버렸습니다.)합니다.

내가 말했던 것처럼 키보드 이벤트를 전역으로 가져 오려면 버블 링하기 전에 스테이지로 시작해야하므로 스테이지에 이벤트를 등록하면 모든 키보드 이벤트가 발생합니다. kekoav 말했듯이 그래서, 그렇게 할 수있는 방법은

stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDown); 

그러나, 문제는 그 코드에 stage 전역 변수 아니라고이다. 모든 DisplayObjects에 공통적 인 속성이지만 객체가 표시 목록에 추가 될 때까지는 null입니다.

따라서 설명을 생략하려면 mainGame이 스테이지에 추가 된 후에 전화하면 위 코드를 사용할 수 있습니다.

function mainGame():void {  
     //... 
     addEventListener(Event.ADDED_TO_STAGE, stageAddHandler); 
     //... 
    } 

    private function stageAddHandler(e:Event):void { 
     stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDown); 
     removeEventListener(Event.ADDED_TO_STAGE, stageAddHandler); 
    } 
2

키보드 이벤트 리스너를 클래스가 아닌 스테이지에 추가하십시오.

stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDown); 
+0

작동하지 않는 경우, 그렇게 할 때 null 객체를 참조 할 수 없다고 알려줍니다. – Matt

+0

무대에 올 때까지 무대를 참조 할 수 없기 때문입니다. fenomas에는 그 해결책이 있습니다. –

+0

예, 스테이지가 아직 구성되지 않은 경우 추가 작업을 수행해야합니다. – Kekoa

2
import flash.events.Event; 
import flash.events.KeyboardEvent; 

장소 enterFrame 이벤트 내부 키보드 이벤트가, 그 방법은 매번 업데이트 : 당신이 그렇게 할 수있는 쉬운 방법이없는 경우에는 화재시에, 당신은 알고 다른 청취자 내부 키보드 리스너를 추가 할 수 있습니다 프레임이 업데이트됩니다.

  function update(evt:Event):void  
      {  
        trace("This happens fine"); 
        function keyDown(evt:KeyboardEvent):void  
        {  
         trace("This never happens");  
         myPlayer.x++;  
        }  
      }