2011-09-19 127 views
0

這裏的屬性或方法是我的整個調試錯誤:AS3:無法訪問空對象引用

Car initiated: [object MovieClip] 
Wheel initiated: [object MovieClip] 
TypeError: Error #1009: Cannot access a property or method of a null object reference. 
    at com.George.MegaAmazingApp.Components::Wheel/clickHandler()[C:\Documents and Settings\reithg\My Documents\Classes\com\George\MegaAmazingApp\Components\Wheel.as:24] 
[UnloadSWF] GeorgesMegaAmazingApp.swf 
Test Movie terminated. 

Car.as:

package com.George.MegaAmazingApp.Components 
{ 

    import flash.display.MovieClip; 

    public class Car extends MovieClip 
    { 
     public var carObj:MovieClip; 

     public function Car(carObj:MovieClip) 
     { 
      trace("Car initiated: " + carObj) 
      this.carObj = carObj; 
     } 

     public function Accelerate(speed:Number) 
     { 
      carObj.y -= speed; 
     } 

    } 

} 

Wheel.as

package com.George.MegaAmazingApp.Components 
{ 
    import flash.display.Stage; 
    import flash.events.MouseEvent; 
    import flash.events.Event; 
    import flash.display.MovieClip; 

    public class Wheel extends Car 
    { 
     public var rotated:Number; 
     public var wheelObj:MovieClip; 

     public function Wheel(wheelObj:MovieClip, carObj:MovieClip) 
     { 
      super(carObj); 
      this.carObj = carObj; 
      this.wheelObj = wheelObj; 
      trace("Wheel initiated: " + wheelObj); 
      wheelObj.addEventListener(MouseEvent.CLICK, clickHandler); 
     } 
     private function clickHandler(event:MouseEvent):void 
     { 
      stage.addEventListener(Event.ENTER_FRAME, super.Accelerate(2)); 
     } 

    } 

} 

和我的SWF啓動它:

import com.George.MegaAmazingApp.Components.*; 

var wheelObj:Wheel = new Wheel(this.wheel,this.car); 

任何人都知道最新錯了嗎?

+0

車輪延伸車?我看到我頭腦裏開着的奇怪事物。無論如何,這是carboj是'空',但在你提供的代碼中沒有任何地方可以看到它是如何實例化的... – RIAstar

+0

車輪實際上是方向盤並作爲汽車的遙控器工作。 carObj應該是'this.car'(我是OOP的新手,所以很可能我錯過了一些我不知道的東西,像幾個小時新的新東西)。 –

+0

是的,但是'this.car'在哪裏實例化?因爲它顯然是'null'。 – RIAstar

回答

0

編輯stage屬性設置爲null,直到對象(或其父項之一)被添加到舞臺。所以要麼使用wheelObj的階段,要麼先把輪子加到舞臺上。如果您不想顯示Wheel實例本身,則無需擴展MovieClip

private function clickHandler(event:MouseEvent):void 
{ 
    // event.currentTarget is the wheelObject here 
    event.currentTarget.stage.addEventListener(Event.ENTER_FRAME, Accelerate); 
} 

反正你也不需要偵聽器添加到舞臺上,將其添加到方向盤本身將努力:

private function clickHandler(event:MouseEvent):void 
{ 
    event.currentTarget.addEventListener(Event.ENTER_FRAME, Accelerate); 
} 

注意,你必須提供一個函數作爲參數,而不是一個函數調用。所以你也需要改變accelerate的功能。

private var speed:int = 2; 

public function accelerate(e:Event) // best practice:use camelCase function names 
{ 
    carObj.y -= speed; 
} 
+0

@George你還需要在'Car'中導入事件類。 'import flash.events.Event;' – Kapep

0

測試此階段存在(跟蹤(階段)),(如果你的影片剪輯是在顯示列表和舞臺是存在的MovieClip()階段應該是有效的)。你的電話super.Accelerate(2)也是錯誤的。如果你擴展汽車,你可以叫加速(2)。

如果您的MovieClip再次位於顯示列表上,您可以在不訪問舞臺的情況下監聽ENTER_FRAME。 this.addEventListener(Event.ENTER_FRAME,handleEnterFrame)。

0

此外,我不會添加一個ENTER_FRAME eventlistener來響應點擊。

但是,如果你這樣做,確保你不添加多個監聽器:

private function clickHandler(event:MouseEvent):void 
{ 
    if(!hasEventListener(Event.ENTER_FRAME)) 
    { 
     addEventListener(Event.ENTER_FRAME, Accelerate); 
    } 
} 

而作爲一個旁註,將加速功能不是現在accelrating什麼。它正在以不變的速度移動汽車。這個動作更像Run()或類似的東西。但這與您的實際問題無關...... 注意事項

+0

我意識到,並將擴展它:P。 –

相關問題