Удаление экземпляров клипов и фильмов

Клипы — это особые, привилегированные структуры данных. Поэтому удалить их, как обычные свойства или переменные, используя оператор delete, невозможно. Не будет выгружен клип, подобно объекту, в том случае, если на него не имеется ссылок. Для того чтобы удалить клип или, тем более, фильм, нужно использовать более мощные средства.

Существует три основных способа, позволяющие удалить клип:

• Удаление вручную. Создание ключевого кадра, не содержащего экземпляр, присущий предшествующему кадру, обеспечит его удаление из памяти при проигрывании фильма. По этой причине нельзя обратиться к объекту, размещенному на одном из расположенных ранее текущего кадров, — его уже просто не существует, хотя явного его удаления и не проводилось.

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

• Удалением или выгрузкой клипа сопровождаются некоторые проводимые при помощи ActionScript операции. Так, помещение на виртуальный слой, занятый клипом, нового экземпляра при помощи методов attachMovie() или duplicateMovieClip() вызовет его удаление. Загрузка в клип фильма с использованием метода loadMovie() сопровождается удалением его старого содержимого.


Глобальная функция loadMovieNum(), помещая на некоторый уровень фильм, выгружает фильм, занимавший его ранее.

Ручное удаление экземпляров интуитивно, поэтому подробно его рассматривать нет особого смысла. Удаление же клипов как побочный эффект других операций редко используется как самоцель. С точки зрения программирования в ActionScript, нам наиболее интересен второй из описанных способов удаления клипов. Реализуется он при помощи методов removeMovieClip(), unloadMovie() и глобальной функции unloadMovieNum().

Удаление экземпляров. Метод removeMovieClip()
Метод removeMovieClip() полностью удаляет вызвавший его экземпляр клипа.

Например:
createEmptyMovieClip("clip",0); // Создаем новый клип
clip.removeMovieClip(); // Пробуем удалить клип
trace(clip); // Выводит: undefined (удаление
// прошло успешно)

В официальном словаре ActionScript сообщается, что удалить при помощи метода removeMovie-Clip() можно только экземпляры, созданные программно. На самом деле это не совсем так. Данный метод может удалить любой экземпляр, но при условии, что он размещается на неотрицательной глубине. Так как созданные вручную экземпляры находятся на виртуальных слоях с отрицательными номерами, то считается, что их удалить нельзя.


Однако это с легкостью можно сделать, просто переместив перед удалением клип на положительную глубину, использовав метод swapDepths():

// Создайте вручную клип и назовите его mov
mov.removeMovieClip{}; // Пробуем удалить созданный вручную клип
trace(mov); // Выводит: _level0.mov (клип удален не был)
mov.swapDepths(10000); // Меняем глубину клипа на доступную для метода
// removeMovieClip()
mov.removeMovieClip(); // Повторно пробуем удалить клип
trace(mov); // Выводит: undefined (клип успешно удалился)

Метод removeMovieClip() не может удалять экземпляры не только с отрицательных, но и с очень больших глубин. Чтобы удаление прошло успешно, клип должен размешаться на виртуальном слое с номером от 0 до 0xFFFFF (1048575). По этой причине использовать очень большие глубины не рекомендуется:

// Создаем клип на недопустимо большой глубине
createEmptyMovieClip("clip", 0xFFFFF+1);
clip.removeMovieClip(); // Пробуем удалить клип
trace(clip); // Выводит: _level0.clip (клип удален не был)

Выгрузить из плейера текущий или любой другой фильм, используя метод removeMovieClip(), невозможно.


Для этого нужно обратиться к методу unloadMovieO или функции unloadMovieNum().

Возможность динамического удаления клипов появилась еще во Flash 4. Поэтому наряду с методом имеется и глобальная функция removeMovieClip(). Так как по сравнению с методом она не дает никаких преимуществ, однако при этом более подвержена ошибкам при использовании, то применять ее не стоит. О существовании функции removeMovieClip() нужно помнить лишь в одном аспекте: оно означает, что для одноименного метода обязательно явно задавать вызывающий клип.

Выгрузка содержимого экземпляров. Метод unloadMovie()
Метод unloadMovie(), в отличие от removeMovieClip(), не удаляет клип полностью, а лишь выгружает его содержимое. В результате на временной диаграмме остается пустой клип-контейнер, подобный тому, который можно создать, используя метод createEmptyMovieClip(). Пример:

// Создайте экземпляр клипа и назовите его mov
mov.unloadMovie(); // Выгружаем содержимое клипа - визуально он исчезает
trace(mov); // Выводит: _level0.mov (клип как объект данных
// продолжает существовать)

Метод unloadMovie() позволяет выгружать содержимое клипа вне зависимости от того, какое значение глубины ему соответствует.


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

После выгрузки содержимого клип сохраняет такие спои характеристики, как масштаб осей, прозрачность, поворот, цветовые смешения. Если на клипе размещается обработчик события в стиле Flash 5, то он будет продолжать свою работу. Аналогично работоспособность сохранят все ссылки на клип. Однако все собственные свойства и методы клипа будут удалены. Это означает, что уничтожатся и обработчики событий в стиле Flash 6, из-за чего, например, напрямую нельзя отследить событие onLoad.

Сходство названий подсказывает, что метод unloadMovie() должен использоваться совместно с методом loadMovie(). Однако на практике это происходит не очень часто. Дело в том, что метод loadMovie() не нуждается п предварительной «зачистке» клипа. Если экземпляр, в который он подгружает фильм, уже имеет содержимое, то оно будет удалено автоматически. Поэтому более важно применение метода unloadMovie() для выгрузки фильмов (о нем мы поговорим в следующем подразделе). Впрочем, изредка он используется и для удаления содержимого клипа — если загрузка в него фильма не должна происходить непосредственно после его очистки.

Возможности, носителем которых является метод unloadMovie(), появились еще во Flash 3.


Поэтому в ActionScript имеется и одноименная ему глобальная функция. Использовать ее не стоит, так ее синтаксис более благоприятствует допущению ошибок, чем синтаксис аналогичного метода.

Наличие функции unloadMovie() означает, что для соответствующего метода всегда нужно явно задавать вызывающий клип.

Выгрузка фильмов
Чтобы выгрузить из плейера некоторый фильм, нужно задействовать метод unloadMovie() по отношению к свойству leveln, указывающему на уровень, на котором он располагается:

_levell, unloadMovie(); // Фильм с уровня 1 будет удален

Так как произвести удаление фильма, используя метод removeMovieClip(), невозможно, то данная задача становится основной из решаемых при помощи метода unloadMovie().

Аналогично тому, как для импортирования фильма на уровень помимо метода loadMovie() может быть использована глобальная функция loadMovieNum(), возможности метода unloadMovie() по выгрузке фильмов в ActionScript дублируются функцией unloadMovieNum(). Данная функция удаляет из памяти фильм, основываясь на номере занимаемого им уровня:

unloadMovieNum(1) // Улаляется фильм с уровня 1

Оцените статью: (0 голосов)
0 5 0

Статьи из раздела Action Script на эту тему:
Виртуальные слои клипов
Задание формулы цвета
Имена экземпляров клипов
Импорт внешних фильмов и изображений
Клипы как носители кода

Вернуться в раздел: Action Script / 10. Клипы