AS3在Timer变量上获得错误#1009

时间:2011-02-22 19:54:29

标签: flash actionscript-3 flash-cs5

我遇到错误#1009:无法访问空对象引用的属性或方法。我不确定如何自己解决这个问题,我已经跟踪过,看看对象变量enemySpawnTimer:Timer是否实际为空,而不是。所以我不明白为什么我会收到这个错误。

无论如何这里是我的代码,它是我用来产生从屏幕顶部落到底部的块的类,一旦到达屏幕底部就会从舞台上移除。

package scripts
{
    import flash.events.Event;
    import flash.display.Stage;
    import flash.events.Event;
    import flash.events.TimerEvent;
    import flash.utils.Timer;
    import flash.display.DisplayObject;

    public class EnemySpawner
    {
        var stageRef:Stage;
        var target:Player;

        //vector variables
        public static var vectorBlock:Vector.<Block> = new Vector.<Block>();

        //enemy variables
        public static var block:Block;

        //timer variables
        var enemySpawnTimer:Timer = new Timer(250);

        //score variables
        public static var pointsBlock:Number = 0;

        public function EnemySpawner(stageRef:Stage, target:Player)
        {
            this.stageRef = stageRef;
            this.target = target;

            enemySpawnTimer.addEventListener(TimerEvent.TIMER, SpawnBlocks, false, 0, true);
            enemySpawnTimer.start();
        }

        private function SpawnBlocks(e:TimerEvent):void
        {
            block = new Block(stageRef);
            pointsBlock = block.pointsGiven;

            vectorBlock.push(block);
            stageRef.addChild(block);

            block.addEventListener(Event.ENTER_FRAME, Update, false, 0, true);
        }

        private function Update(e:Event):void
        {
            //remove enemies when they pass the bottom of the stage
            for each(var block:Block in vectorBlock)
            {
                if(block.y > Bounds.rectH + block.height)
                {
                    RemoveFromList(block);
                }
            }

            target.addEventListener("playerDeath", StopSpawning, false, 0, true);
        }

        private function RemoveFromList(block:Block):void
        {
            vectorBlock.splice(vectorBlock.indexOf(block), 1);

            if(stageRef.contains(block))
            {
                stageRef.removeChild(block);
            }
        }

        private function StopSpawning(e:Event):void
        {
            enemySpawnTimer.stop();
        }
    }
}

这是我得到的错误,不幸的是,使用flash中的脚本编辑器对于错误导致错误的位置或原因并没有太大帮助。

TypeError: Error #1009: Cannot access a property or method of a null object reference.
at scripts::EnemySpawner/SpawnBlocks()
at flash.utils::Timer/_timerDispatch()
at flash.utils::Timer/tick()

2 个答案:

答案 0 :(得分:1)

当某些东西为空时通常会发生这个错误,我最好的猜测是“stageRef” 尝试添加

stageRef = new Stage();

this.stageRef = stageRef;

为了更好的调试,你可以做的另一件事是允许它,这样做点击文件/发布设置/ flash 并勾选“允许调试”,然后重新发布它再次看到你的错误,这次它会让你知道导致错误的帧和行号。

答案 1 :(得分:0)

如果我正确理解错误的最后一点,那么它是否必须是SpawnBlocks()方法中的null?我会看看stageRef和vectorBlock,也许是block.pointsGiven。