Каждый из нас рано или поздно сталкивается с проблемой
дублирования клипов. Задача эта довольно несложная, но у начинающих она зачастую
вызывает ряд вопросов. Особенно, когда дело касается дублирования клипов с
кнопками и присваивания каждой из кнопок своего собственного заголовка. Решает
ее каждый по-своему, и этот, найденный единожды вариант решения, с небольшими
необходимыми модификациями кочует из программы в программу. Между тем, можно
создать единый метод, позволяющий дублировать клипы при помощи всего одного
простого действия. Этот метод предполагает использование прототипов. Я не
стану подробно вдаваться в то, что такое прототип и с чем его едят. В самом
деле, намного ли станет понятнее, если написать, что-то вроде 'прототип - это
метод объекта'? Поэтому постараюсь попроще. Если есть у нас нечто, называемое
объектом (string, movieclip, date и т.д.) то прототип объекта - это некая
функция, которую можно применить ко всем объектам данного типа. Ко всем строкам,
ко всем мувикам и т.д. Причем, для ее применения достаточно знать лишь имя этого
объекта и список параметров прототипа. Нет, не стало намного
яснее. Давайте лучше разберем один весьма полезный прототип, предназначенный
для дублирования клипов. По мере продвижения вперед мы и разберемся в том, что
это есть и с чем его есть!
Начнем с постановки задачи.
Пусть у нас есть некий клип, в который помещена кнопка,
снабженная заголовком. И мы хотим продублировать эту кнопку, скажем, раз 5-6. И
хотим, чтобы у каждой такой кнопки был свой собственный заголовок. Ну,
саму-то кнопку мы рисовать умеем. А то?! И поместить внутрь нее заголовок умеем
тоже. Заголовок наш - это какое-то динамическое динамическое поле с каким-то
именем. Зафиксируем этот факт в памяти и пойдем дальше. Когда мы дублируем
кнопку (вернее, мувик с кнопкой, а может, и без кнопки и даже без заголовка), мы
хотим, чтобы этот мувик лежал в каком-то конкретном месте экрана и затем
повторялся по горизонтали или вертикали, а возможно - и то и другое
одновременно. Значит, нам нужно определиться с координатами первого мувика и
смещением новых мувиков по осям X и Y. Так и назовем наши координаты: x0,y0 -
начальная точка, dx,dy - смещения. Что еще? Имя есть, координаты тоже: Ах,
да, количество мувиков. Пусть будет n. Все? Почти. Забыли об именах.
Вспоминаем, что в мувике лежит какое-то динамическое поле с каким-то заголовком.
Так и назовем его в нашем будущем прототипе - captionName. И, наконец, сами
заголовки кнопок будем размещать в некоем массиве, который назовем
captions.
Итак, приступим к написанию прототипа. Начнем с
заголовка.
movieClip.prototype.DMC=function(n,x0,y0,dx,dy,captionName,captions){ }
В теле прототипа пока еще ничего нет, но зато мы знаем, что сам
прототип будет называться DMC и в него будут передаваться все те параметры, что
указаны в заголовке. Дело осталось за малым - написать содержимое. Что же,
напишем! Определим локальные имена
var name=this._name; var
basename=this._name; var yt=y0; var xt=x0;
Почему локальные? Чтобы при использовании прототипа
предотвратить возможные коллизии и не ограничивать себя в выборе переменных при
программировании.
Теперь спозиционируем первый клип и присвоим ему первый
заголовок из массива. this._x=x0; this._y=y0; this[captionname]=captions[0];
Ну, а теперь размножим этот клип и присвоим копиям свои
заголовки.
for
(i=1;i<n;i++){ name=basename+i; yt+=dy; xt+=dx; this.duplicateMovieClip(name,i); _parent[name]._y=yt; _parent[name]._x=xt; _parent[name][captionname]=captions[i]; }
Вроде бы, все: Но на самом деле - не совсем. Дело в том, что
при применении прототипа к реальному клипу имена новых клипов будут
формироваться путем прибавления порядкового номера к базовому имени, т.е., если
клип, подлежащий дублированию называется MyMovie, то дублированные клипы будут
иметь имена MyMovie1, MyMovie2, MyMovie3 и т.д. Это может быть не совсем
удобно для последующей обработки. Логичнее было бы исходный клип назвать
MyMovie0. Но тогда последующие имена будут MyMovie01, MyMovie02: Чтобы избежать
такой ситуации, необходимо проверить исходный клип на наличие в нем этого самого
нуля в конце и удалить его из новых имен.
Перепишем базовое имя.
var name=this._name; if
(name.charAt(name.length-1)=="0"){name=name.substr(0,name.length-1)} var
basename=name;
Вот теперь, кажется, все. Наш прототип будет выглядеть следующим
образом:
movieClip.prototype.DMC=function(n,x0,y0,dx,dy,captionName,captions){ var
name=this._name; if
(name.charAt(name.length-1)=="0"){name=name.substr(0,name.length-1)} var
basename=name; this._x=x0; this._y=y0; this[captionname]=captions[0]; var
yt=y0; var xt=x0; for
(i=1;i<n;i++){ name=basename+i; yt+=dy; xt+=dx; this.duplicateMovieClip(name,i);
_parent[name]._y=yt; _parent[name]._x=xt; _parent[name][captionname]=captions[i]; } }
Вроде бы, красиво. Осталось понять, что со всем этим делать
дальше. Тут есть два варианта.
Вариант первый. Копируем прототип в первый кадр первой
сцены. Создаем мувик с кнопочкой (или без нее), снабженной заголовком. Или
без заголовка. Как нравится. Назовем наш мувик, скажем, myButton0. Помните,
зачем в конце нолик? Впрочем, если его и не поставить - тоже
сработает. Определим заголовки через массив.
c=new
array("qwer","asdfg","qaz","wsx","qdbrhm");
Определяемся с начальными координатами, смещениями по x и y,
именем текстового поля внутри кнопки (пусть это будет text).
И, наконец, применяем наш прототип к нашему мувику.
myButton0.DMC(5,20,70,40,20,"text",c); stop();
Мы получим 5 кнопочек (или мувиков) с заголовками, записанными в
нашем массиве.
Ну, а если это не кнопки? Тогда не нужно указывать в обращении к
прототипу ни имени текстового поля внутри мува, ни имени массива.
В чем же фишка? А она во втором варианте. Перепишите текст
прототипа в файл с именем, скажем, mylib.as. В первом кадре первой сцены
вместо текста прототипа напишите такую вот строку: #include "mylib.as"
И-все! И ваш мувик будет дублироваться без всяких дальнейших
затрат, вам даже не требуется понимание того, как все это работает. Причем,
дублировать можно как клипы, находящиеся в 'руте', так и вложенные внутри
другого клипа.
Вот, собственно, и все, что я хотел рассказать про дублирование
клипов при помощи прототипа. Желаю удачи!
Литература по FLASH
|