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

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

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

Метод duplicateMovieClip()
Метод duplicateMovieClip() позволяет создавать копию некоторого имеющегося в фильме клипа.

Его синтаксис:
clip.duplicateMovieClip("name", depth),
где:

• clip — имя клипа, копия которого должна быть создана;
• "name" — строка с именем, которое должно быть присвоено созданному экземпляру;
• depth — виртуальный слой (проще — глубина), на который должен быть помещен экземпляр.

Чем он больше, тем выше относительно остальных объектов фильма будет отображаться клип.

Если на глубине, на которую помещается экземпляр, уже имеется клип, то он будет удален (по-этому важно следить, чтобы значение depth было уникальным).

Созданную копию метод duplicateMovieClip() помешает в ту же точку, в которой находится порождающий клип.


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

// Нарисуйте квадратик и, переведя его в клип, назовите box
box.duplicateMovieClip("box1",0); // Создаем дубликат клипа box с именем
// box1 на глубине 0
bох1._х+=50; // Смещаем дубликат
box1._y+=50;

Во Flash MX появилась возможность совместить создание дубликата клипа с переопределением его свойств. Для этого на месте третьего параметра метода duplicateMovieClip() нужно задать литерал объекта, в качестве пар свойство — значение которого должны быть прописаны подлежащие переопределению свойства клипа с положенными для них значениями:

box.duplicateMovieClip("box1", 0, {_х:box._x+50, _у:box._у+50});

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

У дубликатов и порождающего клипа одинаково не только положение. У них совпадают значения абсолютно всех свойств (кроме имени).


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

Если порождающему клипу присущи собственные свойства или методы, то дубликату они переданы не будут:

box.prop = "Привет"; // Присваиваем порождающему клипу свойство
box.duplicateMovieClip("box1", 0); // Создаем дубликат
trace(box1.prop); // Выводит: undefined (свойство передано не было)

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

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

Метод attachMovie().
Задание идентификатора для программного экспорта

Подобно методу dupiicateMovieClip(), метод attachMovie() позволяет динамически создавать экземпляры клипов.


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

Чтобы метод attachMovie() мог выполнить возложенную на него задачу, ему нужно указать, какой символ должен использоваться в качестве шаблона. Сделать это можно, присвоив символу особый идентификатор для ActionScript-экспорта. Для этого необходимо выполнить следующую последовательность шагов:

1. Открыть библиотеку, нажав .
2. Выделить строку с именем необходимого символа и выполнить правый щелчок мышью.
3. В появившемся контекстном меню выбрать пункт Linkage(Связывание).
4. В открывшемся диалоговом окне установить флажок для пункта Export for ActionScript (Экс- портировать для ActionScript) меню Linkage. При этом станет доступной строка Identifier (Идентификатор). В нее нужно ввести любую последовательность символов, которая затем будет использоваться в качестве «имени» символа.

В меню Linkage диалога Linkage Properties, помимо рассмотренного, имеется еще три пункта. Два из них — Export for runtime sharing и Import for runtime sharing — необходимы для создания библиотек совместного доступа (shared libraries).


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

Настройка Export in first frame (Экспортировать в первый кадр) автоматически активизируется, если вы ставите флажок в окошко пункта Export for ActionScript. Это будет означать, что проигрывание фильма не начнется до тех пор, пока не будет скачан соответствующий символ. Дело в том, что по умолчанию swf-фильм закачивается покадрово, и символ не будет загружен до тех пор, пока очередь не дойдет до кадра, содержащего его экземпляр. Если кадры фильма не содержат экземпляров символа, он будет подгружен в самую последнюю очередь. Представьте теперь, что фильм проигрывается в потоковом режиме. Если некоторый кадр содержит предложение с attachMovie(), а необходимый символ еще не был подгружен по причине того, что его экземпляры еще ни разу не встречались в фильме, то, естественно, клип создан не будет. Чтобы предупредить такого рода ситуацию, всегда, если экземпляры символа будут создаваться программно, сам он должен быть скачан до начала проигрывания фильма.

Так как фильмы, проигрывающиеся в сети в режиме реального времени — это очень большая редкость, то практически всегда совершенно неважно, активизирован ли экспорт в первый кадр или нет.


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

Разобравшись с тем, как задается идентификатор для ActionScript-экспорта, вернемся к методу attachMovie(). Данный метод имеет следующий синтаксис:

clip.attachMovie("identifier", "name", depth, [prop_obj]),
где:

• clip — клип, на временную шкалу которого должен быть помешен экземпляр;
• "identifier" — идентификатор экспорта символа, экземпляр которого необходимо создать.
Должен быть прописан в строковом виде;
• "name" — имя нового клипа в строковом представлении;
• depth — номер виртуального слоя, на который должен быть помещен экземпляр;
• [propobj] — объект-контейнер со свойствами, на основании которых будут переопределены свойства созданного экземпляра.

Пример:
// Создайте клип ball в виде кружка и присвойте ему идентификатор экспорта
// ball
for (var i = 0; i<100; i++) { // Создаем 100 случайно распределенных кружков
_root.attachMovie("ball", "ball"+i, i, {_x:550*Math.random(),
_y:400*Math.random()});
}

Созданный методом attachMovie() экземпляр помещается в точку отсчета координат своего клипаносителя. В случае _root это означает, что новый клип будет отображен в верхнем левом углу области фильма.

В качестве результата метод attachMovie() возвращает ссылку на созданный экземпляр. Если же кодер допустил ошибку, задавая параметры, и вызов метода оказался безрезультативным, то возвращено будет undefined:

trace(attachMovie("ball","new ball",0) // Выводит: level0.new ball

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

Кроме того, если в фильме должно присутствовать много экземпляров одного клипа, их удобно организовывать в массив:

var arr:Array = [];
for (var i = 0; i<100; i++) {
arr[i] = attachMovie("ball", "ball"+i, i, _x:400"Math.random(),
_y:550*Math.random()});
}

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

Никаких отличий между экземплярами клипов, созданными «вручную» и при помощи методов
duplicateMovieClip() и attachMovie(), не существует.

Метод createEmptyMovieClip(). Создание пустого клипа
Во Flash MX появилась возможность динамического создания пустого клипа. Ее носителем является метод createEmptyMovieClip(). Его синтаксис:

clip.createEmptyMovieClip("name", depth),
где:

• clip — клип, на временную шкалу которого необходимо поместить пустой клип;
• "name" — строка с именем создаваемого клипа;
• depth — глубина, на которую должен быть помещен пустой клип.

Аналогично attachMovie(), метод createEmptyMovieClip() возвращает ссылку на созданный клип.

Например:

trace(createEmptyMovieClip("clip", 0)); // Выводит: _level0.clip

Пустой клип — это клип из одного кадра, не содержащий никаких графических объектов. Создать пустой клип можно и «вручную», войдя в режим редактирования нового символа ( + ) и сохранив появившийся шаблон без изменений. Изготовив затем экземпляр такого клипа при помощи метода attachMovie(), вы практически полностью смоделируете работу метода createEmptyMovieClip().

Теоретически, к пустому клипу могут быть применены все методы и свойства класса MovieClip.

Другой вопрос, что, например, использование инструментов управления временной диаграммой не имеет никакого смысла с учетом того, что пустой клип содержит только один кадр. До тех пор пока в пустом клипе не появится графика (ее можно создать, обратившись к методам программного рисования) или на его временную диаграмму не будут импортированы клипы, по отношению к нему бессмысленно будет применять методы hitTest() (он проверяет, пересекаются ли два клипа) и startDrag() (делает клип протаскиваемым). Вообще, использование подавляющего большинства методов и свойств класса MovieClip может как-то проявить себя лишь при наличии в клипе видимых элементов.

Важной особенностью создаваемых при помощи метода createEmptyMovieClip() пустых клипов является то, что точка отсчета их координат помещается в верхний левый угол фильма вне зависимости от того, где располагается точка регистрации клипа-носителя. Иными словами, система координат пустого клипа совпадает с системой координат основной временной диаграммы:

// Создайте клип в виде кружка, и, назвав его ball, расположите посередине
// рабочего поля
// Создаем на временной диаграмме клипа ball пустой клип
ball.createEmptyMovieClip("new_clip", 0);
trace([ball._x, ball._y]); // Выводит: 251.6, 184.4
// (координаты центра клипа ball)
trace([ball.new_clip._x, ball.new_clip._y]); // Выводит: 0, 0 (координаты
// центра пустого клипа)

Особенности размещения точки регистрации пустого клипа не являются ограничителем его практического использования: при необходимости ее можно с легкостью сместить, просто переопределив свойства _х и _у.

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

Чаще всего пустые клипы используются как холсты для программного рисования. С этим их применением мы познакомимся в конце данной главы. Реже созданный методом createEmptyMovieClipO клип используют в качестве контейнера для подгружаемого функцией loadMovie() внешнего фильма. Иногда пустые клипы необходимы, чтобы объединить в одно целое несколько клипов. Также они могут быть применены как генераторы событий или контейнеры для свойств. В следующем разделе будет продемонстрировано, как можно удалить содержащуюся в клипе статичную графику, используя пустые клипы.

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

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

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