Войти
ПрограммированиеФорумОбщее

Flash, AS3 - удаление спрайта

#0
14:32, 7 фев. 2010

Начал изучать Flash, и возник вопрос об удалении спрайта.

Что есть: символ с анимацией, в первом кадре которой прописано trace("test"), привязанный к классу.

Во время выполнения программы создаю экзмпляр класса - на экране появляются надписи "test". Когда надо - удаляю: removeEventListener + removeChild + ссылке в главной программе присваиваю null.

Но после этого на экран все еще выводится "test".

Понимаю, что в AS3 нельзя вызвать деструктор, но все-же интересно: все-ли я делаю правильно и то, что я вижу - нормально; или же я где-то ошибся (например, оставил ссылку на обьект в главной программе)?


#1
18:14, 7 фев. 2010

Если сделал все ремувы, то ничего выводится не должно.

>Но после этого на экран все еще выводится "test".
Может ты что-то путаешь?
trace("test") - добавляет надпись в окошко output.
Output - это что-то типа лога, оттуда ничего не исчезает, только добавляется.

#2
19:22, 7 фев. 2010

Спасибо за ответ.

Если сделал все ремувы, то ничего выводится не должно.

Хорошо, тогда что делаю не так в простом примере?

У меня есть символ, в первом кадре которого прописано trace("yes");

Код класса приложения:

package  
{
  import flash.display.MovieClip;
  import sprite.RocketBonusSprite;
  import game.*;
  import sprite.*;

  public class newMain extends MovieClip 
  {
    public function newMain():void 
    {      
      Graphics.STAGE = stage;
      var test:MovieClip = new RocketBonusSprite();
      addChild(test);
      removeChild(test);
      test.removeListeners();
      test = null;
    }
  }
}

Код класса символа:

package sprite 
{
  import flash.display.MovieClip;
  import flash.events.Event;
  import game.*;
  public class RocketBonusSprite extends MovieClip
  {
    
    public function RocketBonusSprite() :void {
      Graphics.STAGE.addEventListener(Event.ENTER_FRAME, rotateBonus);
    }

    private function rotateBonus(e:Event):void {
      bonus.rotation += 10;
    }

    public function removeListeners():void {
      Graphics.STAGE.removeEventListener(Event.ENTER_FRAME, rotateBonus);
    }
  }
}

Запускаю - вижу появляющиеся "yes" в Output.

Может ты что-то путаешь?

Нет, под "выводится" я имел ввиду "добавляется" ;)
#3
0:22, 8 фев. 2010

Честно говоря, даже не знаю.
Вообще, вбивать код прямо в кадры AS3 - плохая практика. Стараюсь этого избегать, а потому точно не подскажу, но,
возможно, код в кадре обрабатывается, как ещё один eventListener для ENTER_FRAME, а потому клип и не удаляется.

#4
1:34, 8 фев. 2010

Объект в виртуалке Flash существует пока на него есть ссылки и он используется в клипе (является дочерним от stage или его детей). Когда ссылки пропадают, через некоторое время за объектом придёт мусорщик. Поставленная на выполнение функция (если она записана как поле объекта) - одна из ссылок на объект, так что он по идее будет существовать. И правильно уже заметили, если в коде есть trace() и программа в ходе выполнения натыкается на него, в лог он будет записан и был уничтожен объект после этого или нет, из лога эта запись не исчезнет.
Настойчиво не советую писать игры с динамическим созданием объектов во Flash CS. Используй для этого среды разработки приложений, а не анимаций. К примеру FlashDevelop и создавать в нём AS3 Project или AS3 Project with Preloader. Там будет максимальный контроль над ресурсами, вменяемый дебаг, подсветка и интеллисенс.

#5
11:58, 8 фев. 2010

Вы забыли сделать test.stop(). Ваш клип проигрывается, trace() вызывается каждый раз при переходе на кадр, да и мусорщик такой потерянный null клип скорее всего не удалит. У timeline свои правила перемешивая их, во Flash IDE, с as3 нужно быть аккуратным. Важно понимать не только логику-порядок, но и моменты времени при выполнении скриптов.

#6
0:56, 9 фев. 2010

Всем спасибо за ответы.

Я использу FlashDevelop, в CS4 писать код очень трудно. Правда, у меня Flash IDE Project, пока буду доделывать приложение таким образом, в будущем задумаюсь над переменами.

ПрограммированиеФорумОбщее

Тема в архиве.