2011-09-19 15 views
0

のプロパティまたはメソッドにアクセスすることはできませんが、私の全体のデバッグエラーです:AS3:ここではnullオブジェクト参照

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

Wheelは車を拡張しますか?私は私の頭の中で動く奇妙なことを知っている。とにかく、それは 'null'ですcarObjですが、あなたが提供したコードのどこにもインスタンス化された方法を見ることができます... – RIAstar

+0

車輪は実際にはステアリングホイールであり、車のリモートコントロールとして動作します。 carObjは 'this.car'でなければなりません(私はOOPを初めて使っているので、私が知らない何かを見逃している可能性があります。 –

+0

はい、しかし、 'this.car'はどこでインスタンス化されていますか?それは明らかに「ヌル」であるからです。 – RIAstar

答えて

0

編集は:オブジェクト(またはその親のいずれか)のステージに追加されるまでstageプロパティは、nullに設定されています。したがって、wheelObjのステージを使用するか、最初にホイールをステージに追加します。 Wheelインスタンス自体を表示したくない場合は、MovieClipを拡張する必要はありません。あなたは、引数として機能しませ提供しなければならない

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

注:

private function clickHandler(event:MouseEvent):void 
{ 
    // event.currentTarget is the wheelObject here 
    event.currentTarget.stage.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

テスト段階が存在する場合(トレース(段階))、(あなたのムービークリップがDISPLAYLIST上にあり、ステージが存在する場合のMovieClip()。ステージが有効である必要があります)。また、super.Accelerate(2)への呼び出しが間違っています。あなたが車を拡張する場合は、Accelerate(2)を呼び出すことができます。

MovieClipが再び表示リストにある場合は、ステージにアクセスせずにENTER_FRAMEを聴くことができます。 this.addEventListener(Event.ENTER_FRAME、handleEnterFrame)。

0

また、クリックに応じてENTER_FRAMEイベントリスナを追加しません。

しかし、あなたがしなければ、あなたが複数のリスナーを追加しないことを確認してください:

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

そして追記として

、加速機能が今何をaccelratingされていません。それは一定のペースでカーを動かしています。アクションは、Run()などのようなものです。しかし、それはあなたの実際の質問とは関係ありません。 sidenote

+0

私はそれを実現し、拡張します:P。 –

関連する問題