2011-09-19 145 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。 –

相关问题