влияет ли отображаемый индекс на объем объекта? - PullRequest
0 голосов
/ 29 января 2010

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

TypeError: Error #1009: Cannot access a property or method of a null object reference.
    at com.objects::Torret/updateObject()
    at com.objects::EngineApi/loop()

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

eApi.setChildIndex(this, (eApi.numChildren - 1));

Существует постоянный поток объектов, приходящих и уходящих на мою сцену, поэтому этот код удерживает мои объекты от падения под новым объектом. Есть только один объект, который выдает эту ошибку, и это мой класс Turret. Другой класс - мой класс корабля. Класс турели содержит ссылку на класс корабля, поэтому он может стрелять в него.

Класс Turret - единственный класс, который выдает эту ошибку. ниже мой код для обоих классов. И да, я знаю, что записал турель неправильно. БЛАГОДАРЯ

package com.objects{
    import flash.events.Event;

    public class Torret extends gameObject{

        public var currentAngle:Number;
        protected var newAngle:Number;
        public var shoot:Boolean = false;
        public var autoRotate:Boolean = false;
        public var updated:Boolean = false;
        public var target:Avatar;
        public var enemyLock:Boolean = false;
        public var attackDelay:Number;
        public var delay:Boolean = false;
        public var wielder;
        public var smokeDelay:Number = 500;

        public function Torret():void
        {
            health = 1;
            maxHealth = 1;
            currentAngle = rotation;
            newAngle = currentAngle;
            lastTime = getTime();
        }

        public function Hit(dmg:Number = .01):void {
            if(health > 0)
                health -= dmg;

            if(health < 0)
                health = 0;
        }

        override public function updateObject():void
        {
            eApi.setChildIndex(this, (eApi.numChildren - 1));
            if(health <= 0)
            {
                dead = true;
                blowUp();
            }

            if(y > 949)//If boss doesnt work, this is why
            {
                garbage = true;
            }
            if(!dead)
            {

                if(wielder)
                {
                    scaleX = wielder.scaleX;
                    scaleY = wielder.scaleY;

                }
                if(currentAngle != newAngle || autoRotate == true)
                {
                    rotation += 3;
                    currentAngle = rotation;
                    updated = false
                }
                else
                {
                    updated = true
                }

                if(shoot)
                {
                    if((getTime() - lastTime) > attackDelay && delay == true)
                    {
                        var stingerlaser = new StingerLaser();
                        stingerlaser.laserDir = rotation;
                        stingerlaser.x = x;
                        stingerlaser.y = y;
                        eApi.addGameChild(stingerlaser);
                        lastTime = getTime();
                    }
                }

                if(enemyLock)
                {
                    var dx = target.x - x;
                    var dy = target.y - y;
                    var angle = Math.atan2(dy,dx);
                    rotation = angle * 180/Math.PI;
                }
            }
        }

        protected function blowUp():void
        {
            if((getTime() - lastTime) > smokeDelay)
            {
                var smoke:MissileSmoke = new MissileSmoke();
                smoke.x = x;
                smoke.y = y;
                smoke.dir = -1;

                eApi.addGameChildAt(5,smoke);
                eApi.setChildIndex(smoke, (eApi.numChildren - 4));
                lastTime = getTime();
            }

        }

        protected function degreesToRadians(degrees:Number):Number {
            return degrees * Math.PI / 180;
        }

        protected function rotate(angle:Number):void
        {
            newAngle = angle;
        }
    }
}

Ниже мой класс корабля

package com.objects{

    import flash.display.MovieClip

    public class Avatar extends gameObject {

        public var targets:Array;
        public var delay:Number = 3000;
        public var weapon:Number = 1;

        public function Avatar():void
        {
            rotation = -90;
            lastTime = getTime();
            targets = new Array();
        }

        override public function Attack(dir:Number = -40):void
        {
            switch(weapon){

                case 1:
                    var bullet1:Bullet = new Bullet();
                    bullet1.wielder = this;
                    bullet1.x = x + 35;
                    bullet1.y = y + 30;
                    bullet1.bulletDir = rotation;
                    eApi.addGameChild(bullet1);

                    var bullet2:Bullet = new Bullet();
                    bullet2.bulletDir = rotation;
                    bullet2.wielder = this;
                    bullet2.x = x - 35;
                    bullet2.y = y + 30;
                    eApi.addGameChild(bullet2);
                break;
                case 2:
                    if((getTime() - lastTime) > delay)
                    {
                        var missle = new Missile();
                        missle.x = x;
                        missle.y = y;
                        missle.wielder = this;
                        eApi.addGameChildAt((eApi.numChildren - 2),missle);
                        lastTime = getTime();
                    }
                break;
                default:
            }
        }

        public function Hit():void
        {
            trace("ouch");
        }

        override public function updateObject():void
        {
            eApi.setChildIndex(this, (eApi.numChildren - 1));
        }
    }
}

Просто чтобы вы, ребята, знали, updateObject - это цикл для всех моих объектов. У меня есть один централизованный цикл, и в этом цикле он вызывает массив объектов, которые были размещены на сцене. все они содержат метод updateObject. обновить статус объекта. addGameChild () - это инкапсулированная addChild (), которая не только добавляет объект на сцену, но и помещает его в массив, чтобы можно было вызывать его метод updateObject (). он также используется для облегчения сбора мусора.

1 Ответ

0 голосов
/ 29 января 2010

Во-первых, я думаю, что использование addGameChildAt не является необходимым, так как вам не нужен дополнительный массив для хранения ваших объектов, чтобы вызвать на них updateObject.

for(var i:int;i<numChildren;i++) { gameObject(getChildAt(i)).updateObject(); }

тогда я предлагаю начать имена ваших классов с заглавных букв, т.е. GameObject, а имена методов должны начинаться с строчных букв, т.е. attack()

и я рекомендую вам проверить, существует ли ваша ссылка на объект eApi (не ноль), и ваш объект является частью eApi, прежде чем вы установите его индекс

if(eApi && eApi.contains(this)) { eApi.setChildIndex(this, (eApi.numChildren - 1)); }

Интересно, почему вы все равно используете setChildIndex, так как я понимаю, что есть постоянный цикл, который вызывает updateObject для объектов, которые в настоящее время являются потомками eApi, поэтому вы постоянно перемещаете объект, метод updateObject в настоящее время выполняется на вершине, что кажется бессмысленным?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...