2012-02-08 16 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のリスナーのいずれかをコメントアウトした場合、それは正常に動作しますが、ちょうどそこにそのようにそれらを持つことがエラーになり、リターン

これは私のコードを自分のチャーを作るように変換して以来起きているそれが完全にうまく動作する前に、ステージ上に投げるのではなく、コードで産み出すことができます。

+1

ステージがヌルではありませんか?これをチェックしてください。http://www.redcodelabs.com/2009/07/flex-null-stage/代わりにthis.systemManager.stageを使用してください。 –

答えて

0

stageを外部クラスから参照するのはベストプラクティスではなく、displayobjectをサブクラス化せずにstageを参照することができない場合があります。ですから、displayObjectsを使う方が良いでしょう。

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{ 
       // 
      } 
     } 
    } 

//メイン

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

実は、あなたはステージ上で、すでにある任意の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

関連する問題