Удаление MovieClip в AS3 - PullRequest
       2

Удаление MovieClip в AS3

0 голосов
/ 20 июля 2011

Прошлой ночью я создал небольшой проект для развлечения, который включает в себя создание множества маленьких кругов (звезда).Чтобы представить эту звезду, я создал звездный класс.Здесь приведены наиболее подходящие методы

public class Star extends MovieClip
{

public function Star(r:Number)
        {
            starRadius = r;
            this.animated = false;
            this.graphics.beginFill(0xFFFFFF);
            this.graphics.drawCircle(0,0,starRadius);
            this.graphics.endFill();

            this.addEventListener(Event.REMOVED, onRemoval);
        }
public function animate():void
        {
            if( isNull(angle)|| isNull(speed)){
                throw new Error("Angle or speed is NaN. Failed to animate");
            }
            if(animated){
                throw new Error("Star already animated");
            }
            if(this.parent == null){
                throw new Error("Star has not been added to stage yet");
            }

            this.addEventListener(Event.ENTER_FRAME, doAnimate, false, 0);
            animated = true;
        }

private function doAnimate(e:Event):void{

            if(isNull(cachedDirectionalSpeedX) || isNull(cachedDirectionalSpeedY)){
                cachedDirectionalSpeedY = -speed * Math.sin(angle); 
                cachedDirectionalSpeedX = speed * Math.cos(angle);
            }

            this.x += cachedDirectionalSpeedX;
            this.y += cachedDirectionalSpeedY;


            if(this.x > this.parent.stage.stageWidth || this.y > this.parent.stage.stageHeight){
                this.dispatchEvent(new Event("RemoveStar",true));
                this.removeEventListener(Event.ENTER_FRAME, doAnimate);

            }


        }

Чтобы дать вам краткую информацию о том, что он делает, в основном при инициализации он добавляет к себе прослушиватель, который в основном просто обнуляет все переменные экземпляра.Когда вызывается animate (), он добавляет слушателя к себе, который оживляет в определенном направлении.Этот слушатель также проверяет, находится ли его местоположение за пределами сцены, и останавливает его движение, когда оно уже есть.Кроме того, он отправит событие, чтобы родитель знал, когда его удалить.

Итак, в "основном" классе у меня есть

this.addEventListener("RemoveStar", removeStar);

и

private function removeStar(e:Event):void
        {
            starCount--;
            this.removeChild(Star(e.target));
        }

У меня есть другой слушатель, который в основном печатает число дочерних элементов, которое у него есть каждый раз, но я не собираюсь помещать код здесь.У меня проблема в том, что ... похоже, что слушатель, удаляющий звезду, не работает "все время".При создании 1000 звезд во время запуска и больше ничего количество детей уменьшается в самом начале, и оно застревает на определенном количестве, что наводит меня на мысль, что некоторые фрагменты ролика не удаляются.Кто-нибудь знает, что здесь происходит?

1 Ответ

0 голосов
/ 20 июля 2011

Проверьте, удаляете ли вы все прослушиватели событий, например, removeStar ... Я не вижу, как вы прикрепляете прослушиватель removeStar к "Main", но функция remove star правильно ссылается на свойство e.target как звезду...

По сути, вам нужно "убить" все ссылки на объект, чтобы он был "освобожден" когда-нибудь в будущем, когда GC сделает это.

Причина, по которой выне "удаление" всех звезд, вероятно, в вашем коде "удаления проверки" проверены только правый и нижний края ... возможно, некоторые звезды идут влево или вверх ... добавьте дополнительные условия для левого и верхнего, и это может исправить себя... (this.x <0 || this.y <0) </p>

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