On-Line Библиотека www.XServer.ru - учебники, книги, статьи, документация, нормативная литература.
       Главная         В избранное         Контакты        Карта сайта   
    Навигация XServer.ru








 

Дублирование клипов при помощи прототипа

Каждый из нас рано или поздно сталкивается с проблемой дублирования клипов. Задача эта довольно несложная, но у начинающих она зачастую вызывает ряд вопросов. Особенно, когда дело касается дублирования клипов с кнопками и присваивания каждой из кнопок своего собственного заголовка. Решает ее каждый по-своему, и этот, найденный единожды вариант решения, с небольшими необходимыми модификациями кочует из программы в программу.
Между тем, можно создать единый метод, позволяющий дублировать клипы при помощи всего одного простого действия. Этот метод предполагает использование прототипов.
Я не стану подробно вдаваться в то, что такое прототип и с чем его едят. В самом деле, намного ли станет понятнее, если написать, что-то вроде 'прототип - это метод объекта'? Поэтому постараюсь попроще. Если есть у нас нечто, называемое объектом (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