2012-02-08 2 views
0

이 이상한 오류가 발생했습니다. 이유를 모르겠습니다. 코드를 최소로 줄였으며 문제의 원인을 발견했지만 왜 오류인지 이해할 수 없습니다.TypeError를 발생시키는 KeyboardEvent 리스너?

Main.as

package { 
    import flash.display.MovieClip; 
    public class main extends MovieClip{ 
     public function main(){ 
      var player1 = new playerTest(100 , 275); 
      addChild(player1); 
     } 
    } 
} 

Player.as

package { 
    import flash.display.MovieClip; 
    import flash.events.KeyboardEvent; 

    public class playerTest extends MovieClip{ 
     public function playerTest(xCoord:int, yCoord:int){ 
      x = xCoord; 
      y = yCoord; 
      stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDownEvent); 
      stage.addEventListener(KeyboardEvent.KEY_UP, keyUpEvent); 
     } 
     private function keyDownEvent(e:KeyboardEvent):void{ 
      // 
     } 
     private function keyUpEvent(e:KeyboardEvent):void{ 
      // 
     } 
    } 
} 

나는 KeyboardEvent입니다 청취자 중 하나를 주석 경우는 잘 작동하지만 그냥 그런 그들을 필요가 오류하게 돌아갑니다

TypeError: Error #1009: Cannot access a property or method of a null object reference. 
    at playerTest() 
    at main() 

이 단지 내 체인지를 만들기 위해 내 코드를 변환하기 때문에 일어나고 시작했다 코드가 무대에 던지기보다는 코드를 통해 생성 될 수 있습니다.

+1

스테이지가 null이 아니 었습니까? 이 http://www.redcodelabs.com/2009/07/flex-null-stage/를 확인하십시오. 아마도 this.systemManager.stage를 대신 사용해야합니다. –

답변

0

stage을 외부 클래스에서 참조하는 것이 가장 좋은 방법은 displayobject을 서브 클래스 화하지 않는 것일 수 있으며 stage을 참조 할 수 없습니다. 따라서 displayObjects를 사용하는 것이 좋습니다. // 주

package { 
     import flash.display.MovieClip; 
     public class main extends MovieClip{ 
      public function main(){ 
       var player1 = new playerTest(100 , 275 ,stage); 
       addChild(player1); 
      } 
     } 
    } 
4

package { 
     import flash.display.MovieClip; 
     import flash.events.KeyboardEvent; 
     import flash.display.DisplayObject; 

     public class playerTest extends MovieClip{ 
      public function playerTest(xCoord:int, yCoord:int,_stage:DisplayObject){ 
       x = xCoord; 
       y = yCoord; 
       _stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDownEvent); 
       _stage.addEventListener(KeyboardEvent.KEY_UP, keyUpEvent); 
      } 
      private function keyDownEvent(e:KeyboardEvent):void{ 
       // 
       trace("down"); 
      } 
      private function keyUpEvent(e:KeyboardEvent):void{ 
       // 
      } 
     } 
    } 

사실, 당신이 무대에 이미 모든 DisplayObject에서 단계에 액세스 할 수 있습니다. 그래서, 당신의 클래스에서,이 같은 키보드 리스너를 추가하는 단계에 추가 플레이어까지 기다릴 수 : 베니의 말씀에 반대

package { 
import flash.display.MovieClip; 
import flash.events.KeyboardEvent; 

public class playerTest extends MovieClip{ 
    public function playerTest(xCoord:int, yCoord:int){ 
     x = xCoord; 
     y = yCoord; 
     addEventListener(Event.ADDED_TO_STAGE,init); 

    } 
    private function init(e:Event) 
    { 
     stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDownEvent); 
     stage.addEventListener(KeyboardEvent.KEY_UP, keyUpEvent); 
    } 
    private function keyDownEvent(e:KeyboardEvent):void{ 
     // 
    } 
    private function keyUpEvent(e:KeyboardEvent):void{ 
     // 
    } 
} 
} 
2

을, 당신이 절대적으로 외부 클래스에서 단계를 사용할 수 있습니다, 그 클래스는 무대 인 DisplayObject (또는 DisplayObject의 서브 클래스) 여야합니다. player1이 인스턴스화 된 다음 스테이지에 추가되면 아직 스테이지에 대한 참조가 없습니다. 원하는 경우 Event.ADDED_TO_STAGE를 청취 한 다음 이벤트를 스테이지에 연결할 수 있습니다.

+0

S. 외부 클래스에 displayObject에 대한 참조가없는 경우? – Benny

+0

문서 클래스가 이미 스테이지에 있지 않습니까? 나는 플래시로 놀았으므로 오랜 시간이 걸렸지 만 나는 대부분 구부러졌다. 그리고 나는 단지 롤을 기억하지 않는다. –

+0

문서 클래스에 대해서는 묻지 않습니다. 어떤 displayObjects에 의해 서브 클래 싱되지 않는 외부 클래스입니까? – Benny

관련 문제