2012-02-08 40 views
0

我得到這個奇怪的錯誤,不知道爲什麼,我已經減少了代碼到最低限度,並找到問題的根源,但我不明白爲什麼它的錯誤。KeyboardEvent引發TypeError的監聽器?

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

你確定舞臺不是零?檢查這個http://www.redcodelabs.com/2009/07/flex-null-stage/也許你應該使用this.systemManager.stage來代替。 – 2012-02-08 08:19:09

回答

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對象的一個​​子類,它也是一個舞臺。隨着player1被實例化並添加到舞臺上,它還沒有對舞臺的引用。您可以收聽Event.ADDED_TO_STAGE,然後根據需要將您的活動連接到舞臺。

+0

S.如果外部類沒有對displayObject的任何引用? – Benny 2012-02-08 06:47:27

+0

如果是文檔類,是不是已經登臺了?自從我玩閃光燈以來,我已經很長時間了,我大部分都是彎曲的,我只是不記得哈哈。 – 2012-02-08 06:53:56

+0

我不問關於文檔類。一個不被任何displayObjects子類化的外部類? – Benny 2012-02-08 06:59:39