2012-03-26 132 views
1

当我尝试运行我为使用粒子效果库所做的一小段代码时,出现以下错误。AS3 - 错误#1009:无法访问空对象引用的属性或方法

错误#1009:

我本来我从主运行整个代码和它工作得很好,当我决定把它变成一个“无法访问空对象引用的属性或方法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) 
    } 

} 

它发生在第一行出现。我试图研究它,并发现这是因为舞台没有设置任何东西,但我该如何解决这个问题?为什么事先从Main手中运行正常?

谢谢!

编辑 - 请求的其他信息。

主类

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为空。

倾听添加到舞台上,然后执行该代码:

addEventListener(Event.ADDED_TO_STAGE, addedToStageHandler); 

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

此之前,人们可能已经加入到舞台。

从Main中我看不到粒子管理器是如何添加到显示列表中的。我相信,你只需要你的粒子经理加入公司主营:

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 2012-03-26 20:53:09

+0

是否有错误?不仅需要您的代码摘录才能完全理解您的实现。 – 2012-03-26 21:20:03

+0

没有错误。我已更新我的原始帖子以显示完整的Main和ParticalManager类。在此之前,ParticalManager类仅仅是Main类。 – user1293902 2012-03-26 21:29:10

相关问题