Создание экземпляров клипов динамически

Для динамического создания экземпляра фильма-символа предназначены три метода объекта MovieClip:

Каждый из этих методов мы с вами применим в ходе выполнения упражнений этого урока.

duplicateMovieClip()

Мы уже познакомились с этим методом на лекции – Автоматизация скриптов с помощью циклов, однако сделали это бегло, не вдаваясь в детали.

Метод duplicateMovieClip() служит для Flash указанием создать дубликат имеющегося на сцене экземпляра фильма-символа, дав ему новое имя. Если указанный экземпляр клипа на сцене не присутствует (находится в одном из предыдущих или последующих кадров), то Flash не сможет дублировать его. Другое ограничение состоит в том, что дубликат может быть создан только на том же самом монтажном столе, где находится оригинал. Для динамического создания экземпляра клипа на любом монтажном столе следует применять метод attachMovie() – мы еще поговорим о нем.

Создаваемый дубликат наследует все физические свойства, которые имел оригинал на момент дублирования.

Дубликат фильма-символа наследует следующие свойства оригинала:

Дубликат фильма-символа не наследует:

 

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

Синтаксис дублирования экземпляра фильма-символа таков:

myClip.duplicateMovieClip(имя, глубина, объект);

Эта строка ActionScript начинается с указания имени (с адресацией) фильма-символа, который следует дублировать, после чего следует вызов метода duplicateMovieClip() объекта MovieClip. В результате создается новый экземпляр, именем которого будет значение параметра имя, на глубине глубина. Параметр объект – не обязательный. Пример:

name = "ball2";depth = 100;ball.duplicateMovieClip(name, depth);

Эти три строки создают дубликат экземпляра клипа ball; экземпляр-дубликат получает имя ball2 и располагается на глубине 100.

Примечание Говоря здесь о глубине (depth), мы подразумеваем порядок наложения экземпляров клипов на монтажном столе. Во Flash, если два экземпляра клипов перекрываются, верхним будет тот, который имеет большее значение глубины. Каждый экземпляр фильма-символа имеет уникальное значение глубины, определяющее его положение по отношению к другим объектам на сцене. При дублировании новому экземпляру клипа присваивается значение глубины – любое положительное число. Чем больше это число, тем выше "над сценой" будет расположен экземпляр. Вы, возможно, даже не подозревали, что все экземпляры фильмов-символов, которые вы помещаете на монтажный стол в процессе разработки проекта, тоже автоматически получают глубину, при этом значения глубин начинаются с отрицательного числа -16384. Это означает, что динамически созданный экземпляр, помещенный на глубину 1, перекроет все, что было помещено на сцену вручную.

Каждый монтажный стол в фильме имеет диапазон глубин от -16384 до 1048575, причем все отсчеты глубин ведутся относительно главного монтажного стола фильма. Иными словами, некий "экземпляр 1" может содержать дочерние экземпляры, расположенные на его монтажном столе на глубинах от -16384 до 1048575. Но если на основном монтажном столе "экземпляр 1" находится под "экземпляром 2", то всякий, даже самый верхний дочерний экземпляр "экземпляра 1" окажется ниже самого нижнего из дочерних экземпляров "экземпляра 2".

 

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

Итак, каждый монтажный стол имеет 1064960 уровней глубины (от -16384 до 1048575). При этом глубины разных монтажных столов никоим образом не пересекаются между собой.

Третий параметр метода duplicateMovieClip(), параметр объект, необязателен, но отнюдь не бесполезен. Свойства объекта, указанного в качестве этого параметра, станут элементами данных нового дубликата клипа. Если параметр опущен, он игнорируется. Расширим немного предыдущий пример:

myObject = new Object();myObject.ballColor = "red";name = "ball2";depth = 100;ball.duplicateMovieClip(name, depth, myObject);

Новый экземпляр-дубликат ball2 будет содержать все свойства объекта myObject. В данном случае в новом экземпляре будет создана переменная ballColor со значением "red".

Совет Если нужно скопировать переменные из оригинального экземпляра в дубликат, следует использовать в качестве третьего параметра имя оригинального экземпляра. Например:

ball.duplicateMovieClip(name, depth, ball);

attachMovie()

C помощью метода attachMovie() можно взять фильм-символ из библиотеки и динамически "присоединить" (attach) экземпляр его к любому монтажному столу из имеющихся в данный момент в сцене фильма – при этом, естественно, все содержимое этого экземпляра добавится к содержимому фильма, к которому он присоединяется. Присоединенный клип становится дочерним по отношению к монтажному столу, к которому он присоединен. Он наследует все графические трансформации, выполняемые над родителем (изменения размеров, прозрачности, повороты и т.п.), при этом сохраняя самостоятельность в отношении данных, видимости, текущего кадра и т.п.

 

В чем же состоят отличия этого метода от метода duplicateMovieClip()? Как уже было сказано, attachMovie() присоединяет экземпляр клипа из библиотеки к любому из монтажных столов в фильме. Поскольку присоединяемый клип берется из библиотеки (а библиотека содержит все клипы фильма), клип, к которому присоединяется экземпляр, не обязан находиться на сцене в момент присоединения. С методом duplicateMovieClip() все наоборот: экземпляр клипа, который подлежит дублированию, должен находиться на сцене. Более того, дубликат создается только на том же монтажном столе, что и оригинал. Еще одно различие состоит в следующем. Если дублируемый экземпляр имеет присоединенные к нему обработчики событий (data, enterFrame, mouseDown и т.п.), то дубликат автоматически наследует их. С присоединяемым клипом такого не происходит. Конечно, имеются способы добавить обработчики событий и к присоединяемому клипу, но этот процесс не столь прост, как при дублировании.

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