AS3 - Ошибка № 1009: невозможно получить доступ к свойству или методу пустой ссылки на объект - PullRequest
1 голос
/ 26 марта 2012

При попытке запустить небольшой фрагмент кода, который я делаю для использования библиотеки эффектов частиц, я получаю следующую ошибку.

Ошибка # 1009: невозможно получить доступ к свойству или методу пустой ссылки на объект

Изначально весь мой код работал из Main, и он работал нормально, когда я решил поместить его в класс "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, который раньше был идентичным, просто назывался "Main" и из него запускался.

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();
      }
    }
  }
}

1 Ответ

0 голосов
/ 27 марта 2012

Скорее всего, он не добавлен на сцену;следовательно, stage является нулевым, когда код выполняется.

Прослушивание добавлено в stage, затем выполните этот код:

addEventListener(Event.ADDED_TO_STAGE, addedToStageHandler);

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

Ранее из вашего Main, он, вероятно, уже был добавлен в stage.

Из Main, я не вижу, как менеджер частиц добавляется в список отображения.Я считаю, что вам просто нужно добавить свой менеджер частиц в 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);
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...