AS3 Получение ошибки # 1009 для переменной таймера - PullRequest
0 голосов
/ 22 февраля 2011

У меня ошибка # 1009: не удается получить доступ к свойству или методу пустой ссылки на объект. Я не совсем уверен, как решить эту проблему сам, я проследил, чтобы увидеть, является ли объект var врагиSpawnTimer: Таймер на самом деле ноль, и это не так. Поэтому я не понимаю, почему я получаю эту ошибку.

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

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

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

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 ]

1 голос
/ 23 февраля 2011

эта ошибка обычно возникает, когда что-то равно нулю, мое лучшее предположение - "stageRef" попробуйте добавить

stageRef = new Stage();

до

this.stageRef = stageRef;

еще одна вещь, которую вы можете сделать для лучшей отладки, это разрешить ее, для этого нажмите file / publish settings / flash и отметьте « allow debugging », а затем снова опубликуйте его чтобы увидеть вашу ошибку, на этот раз она сообщит вам номер кадра и строки, которые вызывают ошибку.

0 голосов
/ 23 февраля 2011

Если я правильно понимаю конечную точку ошибки, не должно ли это быть что-то в методе SpawnBlocks (), который является нулевым? Я бы посмотрел на stageRef и vectorBlock и, возможно, block.pointsGiven.

...