2012-03-26 25 views
1

パーティクルエフェクトライブラリを使用するための短いコードを実行しようとすると、次のエラーが発生します。AS3 - エラー#1009:nullオブジェクト参照のプロパティまたはメソッドにアクセスできません

エラー#1009:nullのオブジェクト参照のプロパティまたはメソッドにアクセスすることはできません

私はもともとメインから実行している私の全体のコードを持っていたし、私は "にそれを置くことを決めたとき、それは、うまく働きましたParticleManager "クラスこのエラーが発生し始めました。

エラー自体は、ここで起こる -

stage.addEventListener(MouseEvent.CLICK, _onStageMouseDown); 

    function _onStageMouseDown(e:MouseEvent):void 
    { 
     //Draws an explosion on to the screen at the position of the mouse click. 
     var emitter:Emitter3D = new ParticleExplosion(new Vector3D(mouseX- width/2, mouseY- height/2, 0)); 
     renderer.addEmitter(emitter); 
     emitter.start(); 
     trace(e); 
     trace(renderer.mouseX) 
     trace(renderer.mouseY) 
    } 

} 

それが最初の行で発生します。そして、私はそれを研究しようとしましたが、これはステージが何にも設定されていないために起こりますが、どうすれば回避できますか?なぜ手前でメインから走っていたのですか?

ありがとうございます!

編集 - 追加情報が必要です。

メインクラス

package 
{ 
    import flash.display.Sprite; 

[SWF(width='800', height='600', frameRate='60', backgroundColor='#000000')] 

    /** 
    * ... 
    * @author 
    */ 
public class Main extends Sprite 
    { 
     private var pManager:ParticleManager; 

public function Main() 
    { 
     pManager = new ParticleManager; 

    } 
    } 
} 

前に同一であったParticleManagerクラスは、単に「メイン」と名付けられ、そこから実行します。

package 
{ 
//Flint imports 
    import flash.events.Event; 
    import flash.events.MouseEvent; 
    import org.flintparticles.common.emitters.Emitter; 
    import org.flintparticles.common.actions.ScaleImage; 
    import org.flintparticles.common.events.EmitterEvent; 
    import org.flintparticles.common.events.ParticleEvent; 
    import org.flintparticles.threeD.emitters.Emitter3D; 
    import org.flintparticles.threeD.particles.Particle3D; 
    import org.flintparticles.threeD.renderers.BitmapRenderer; 
    import org.flintparticles.threeD.renderers.controllers.FirstPersonCamera; 
    import org.flintparticles.threeD.zones.LineZone; 
    //Flash imports 
    import flash.display.Sprite; 
    import flash.filters.BlurFilter; 
    import flash.filters.ColorMatrixFilter; 
    import flash.geom.Rectangle; 
    import flash.geom.Vector3D; 



    /** 
    * ... 
    * @author 
    */ 
    public class ParticleManager extends Sprite 
    { 
     private var orbitter:FirstPersonCamera; 
     private var renderer:BitmapRenderer; 


    public function ParticleManager() 
    { 

    //Sets up the "BitMapRenderer" a rectangle where the particle effects will be drawn on to 
     renderer = new BitmapRenderer(new Rectangle(0, 0, 800, 600), false); 
     renderer.x = 0; 
     renderer.y = 0; 
     renderer.addFilter(new BlurFilter(2, 2, 1)); 
     renderer.addFilter(new ColorMatrixFilter([ 1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0.95,0 ])); 
     addChild(renderer); 


     renderer.camera.position = new Vector3D(0, 0, -400); 
     renderer.camera.target = new Vector3D(0, 0, 0); 
     renderer.camera.projectionDistance = 400; 

     //Mouse click 

     function addedToStageHandler(event:Event):void 
     { 
      stage.addEventListener(MouseEvent.CLICK, _onStageMouseDown); 
     } 


     function _onStageMouseDown(e:MouseEvent):void 
     { 
      //Draws an explosion on to the screen at the position of the mouse click. 
      var emitter:Emitter3D = new ParticleExplosion(new Vector3D(mouseX- width/2, mouseY- height/2, 0)); 
      renderer.addEmitter(emitter); 
      emitter.start(); 
      trace(e); 
      trace(renderer.mouseX) 
      trace(renderer.mouseY) 
     } 

    } 

    public function removeEmitter(ev:EmitterEvent):void 
    { 
     Emitter3D(ev.target).removeEventListener(EmitterEvent.EMITTER_EMPTY, removeEmitter); 
     renderer.removeEmitter(Emitter3D(ev.target)); 
    } 

    public function destroy():void 
    { 
     for each(var e:Emitter in renderer.emitters) 
     { 
     e.stop(); 
     } 
    } 
    } 
} 

答えて

0

ほとんどの場合、ステージに追加されません。したがって、コードが実行されるとき、stageはnullです。

ステージに追加するために、そのコードを実行聞く:あなたのメインから以前

addEventListener(Event.ADDED_TO_STAGE, addedToStageHandler); 

function addedToStageHandler(event:Event):void 
{ 
    stage.addEventListener(MouseEvent.CLICK, _onStageMouseDown); 
} 

を、それはおそらく、すでにステージに追加されました。

メインからは、パーティクルマネージャが表示リストにどのように追加されているかわかりません。私はあなただけのメインのお粒子マネージャを追加する必要があると考えている:

package 
{ 
    import flash.display.Sprite; 

    [SWF(width = '800', height = '600', frameRate = '60', backgroundColor = '#000000')] 
    public class Main extends Sprite 
    { 
     private var pManager:ParticleManager; 

     public function Main() 
     { 
      pManager = new ParticleManager; 
      addChild(pManager); 
     } 
    } 
} 
+0

その追加されたことで、私はもはや、エラーを取得していないのFlashPlayerがロードされ、その後、ちょうどそれが正常に動作します以前のようにwhitescreen、と座っています。 – user1293902

+0

エラーがありますか?実装を完全に理解するためには、コード抜粋以上のものが必要です。 –

+0

エラーはありません。オリジナルの投稿を更新して、MainとParticalManagerの完全なクラスを表示しました。以前は、ParticalManagerクラスはMainクラスに過ぎませんでした。 – user1293902

関連する問題

 関連する問題