Създаване на екземпляри на клип
Клиповете имат много интересно двойно наследяване. От една страна, те са инстанции на класа MovieClip, от друга страна, те наследяват характеристиките, присъщи на съответния символ в библиотеката. Поради тази причина клиповете се създават по много различен начин от обектите. В този раздел ще говорим за програмни начини за решаване на този проблем.
Как фигурите се преобразуват в символи и как да плъзнете и пуснете екземпляр на символ от библиотеката няма да бъдат обсъждани в тази книга. Този вид знания са основни и вие, ако решите да изучавате ActionScript на сериозно ниво, без съмнение ги имате.
Методът duplicateMovieClip()Методът duplicateMovieClip() ви позволява да създадете копие на някой клип във филма.
Синтаксисът му е: clip.duplicateMovieClip("име", дълбочина), където:
• clip е името на клипа, който ще се копира; • "name" — низ с име, което трябва да бъде присвоено на създаденото копие; • дълбочина — виртуален слой (по-просто казано — дълбочина), върху който трябва да бъде поставен екземплярът.
Колкото по-голям е, толкова по-високо ще се показва клипът спрямо другите обекти във филма.
Ако вече има клип на дълбочината, на която е поставен екземплярът, той ще бъде премахнат (затова е важно да се гарантира, че стойността на дълбочината е уникална).
Създаденото копие ще бъде поставено от метода duplicateMovieClip() в същата точка като родителския клип.
Следователно обикновено използването на този метод изисква последващо предефиниране на свойствата _x и _y на дубликата:
// Начертайте кутия и я преобразувайте в клип, поле с име box.duplicateMovieClip("box1",0); // Дублиран клип на кутия с име // box1 включендълбочина 0 box1._x+=50; // Преместване на дубликата box1._y+=50;
Flash MX въвежда възможността за комбиниране на създаването на дублирани клипове със заменящи свойства на клипа. За да направите това, вместо третия параметър на метода duplicateMovieClip(), трябва да посочите обектен литерал, като двойки свойство-стойност, на които трябва да бъдат записани свойствата на клипа, които трябва да бъдат предефинирани с техните стойности:
Методът duplicateMovieClip() поставя създаденото копие на клип на същата времева линия като клипа, който го е извикал. Ако трябва да добавите екземпляр на клип към друга времева линия, можете да използвате по-общия метод attachMovie().
Дубликатите и родителският клип имат еднаква не само позиция. Те имат еднакви стойности на абсолютно всички свойства (с изключение на името).
Това означава, че ако увеличите клип в сравнение с шаблон в библиотеката или го проверите с определена степен, тогава дубликатът, получен от него, ще бъде увеличен или завъртян със същото количество. Последващите промени във външния вид на родителския клип няма да повлияят на дубликата по никакъв начин (и обратното - дубликатът няма да повлияе на родителския клип по никакъв начин).
Ако родителският клип има свои собствени свойства или методи, те няма да бъдат предадени на дубликата:
box.prop = "Здравей"; // Присвояване на свойството родителски клип box.duplicateMovieClip("box1", 0); // Дублиране на trace(box1.prop); // Изходи: недефинирано (свойството не е предадено)
Ако дублираният клип съдържа множество кадри, кадрите на новия екземпляр ще започнат отначало, независимо от това къде е била главата на възпроизвеждане на времевата линия на родителския клип по време на създаването на дубликата.
Функции за динамично дублиране на клиповевече съществуваха във Flash 4. Тогава техният носител беше функцията dupiicateMovieClip(). За обратна съвместимост тази функция присъства и в съвременния ActionScript. Тъй като възможностите на функцията dupiicateMovieClip() са ограничени в сравнение с подобен метод (например не ви позволява да предавате желаните стойности на дублиращите се свойства), нейното използване не се препоръчва.
метод attachMovie().Задаване на идентификатор за програмно експортиране
Подобно на метода dupiicateMovieClip(), методът attachMovie() ви позволява динамично да инстанцирате клипове.
Въпреки това, attachMovie() е много по-гъвкав, тъй като не изисква родителски клип. Този метод създава екземпляр, базиран директно на символа в библиотеката.
За да може методът attachMovie() да свърши работата си, трябва да му бъде казано кой знак трябва да се използва като шаблон. Можете да направите това, като дадете на символа специален идентификатор за експортиране на ActionScript. За да направите това, трябва да изпълните следната последователност от стъпки:
1. Отворете библиотеката, като натиснете . 2. Изберете реда с името на желания символ и щракнете с десния бутон. 3. В контекстното меню, което се показва, изберете Свързване. 4. В диалоговия прозорец, който се отваря, проверете опцията Експортиране за ActionScript в менюто Свързване. Това ще направи достъпен низът на идентификатора. Трябва да въведете произволна последователност от знаци в него, която след това ще се използва като "име" на символа.
В менюто Свързване на диалоговия прозорец Свойства на свързването, в допълнение към горното, има още три елемента. Две от тях - Експортиране за споделяне по време на изпълнение и Импортиране за споделяне по време на изпълнение - са необходими за създаванесподелени библиотеки. Тези библиотеки са полезни, ако няколко swf филма трябва да използват едни и същи клипове, бутони, шрифтове или звуци. Библиотеките за споделяне ви позволяват да намалите количеството изтеглена информация, така че те се използват активно при създаване на сайтове.
Настройката Експортиране в първия кадър се активира автоматично, когато поставите отметка в квадратчето Експортиране за ActionScript. Това ще означава, че филмът няма да започне да се възпроизвежда, докато не бъде изтеглен съответният символ. Въпросът е, че по подразбиране swf филмът се изтегля кадър по кадър и символът няма да бъде зареден, докато опашката не достигне кадъра, съдържащ неговия екземпляр. Ако кадрите на филма не съдържат екземпляри на символа, той ще бъде зареден последен. Представете си сега, че филмът се предава поточно. Ако даден кадър съдържа изречение с attachMovie() и необходимият символ все още не е зареден поради факта, че неговите екземпляри никога не са били виждани във филма, тогава, разбира се, клипът няма да бъде създаден. За да се предотврати този вид ситуация, винаги, ако екземпляри на символа ще бъдат създадени програмно, той трябва да бъде изтеглен, преди филмът да започне да се възпроизвежда.
Тъй като филмите, които се възпроизвеждат в мрежата в реално време, са много редки, почти винаги няма значение дали експортирането към първия кадър е активирано или не. Много опитни мигачи изключват тази настройка, тъй като се смята, че прекомерното претоварване на първия кадър влияе негативно на работата на предварителното зареждане.
Сега, след като разбрахме как да зададем идентификатор за ActionScript експорт, нека се върнем към метода attachMovie(). Този метод има следния синтаксис:
clip.attachMovie("идентификатор", "име", дълбочина, [prop_obj]), където:
• клип - клипът, на чиято времева линия трябва да бъде поставен инстанцията; • "идентификатор" е идентификаторът за експортиране на символа, който трябва да бъде създаден. Трябва да се посочи като низ; • "име" — име на новия клип в низово представяне; • дълбочина — номер на виртуалния слой, върху който трябва да се постави инстанцията; • [propobj] — контейнерен обект със свойства, въз основа на които свойствата на създадения екземпляр ще бъдат заменени.
Пример: // Създайте щипка за топка като кръг и му дайте идентификатор за експортиране // топка за (var i = 0; i + ) и запазете получения шаблон такъв, какъвто е. Ако след това създадете такъв клип с помощта на метода attachMovie(), почти напълно ще симулирате работата на метода createEmptyMovieClip().
На теория всички методи и свойства на класа MovieClip могат да се приложат към празен клип.
Друг проблем е, че например използването на инструментите за контрол на времето няма никакъв смисъл, като се има предвид, че празният клип съдържа само един кадър. Докато графика не се появи в празен клип (може да бъде създаден чрез позоваване на методи за програмно рисуване) или клипове не бъдат импортирани в неговата времева линия, няма смисъл да се използват методите hitTest() (проверява дали два клипа се пресичат) и startDrag() (прави клипа да се плъзга) срещу него. Като цяло, използването на по-голямата част от методите и свойствата на класа MovieClip може по някакъв начин да се прояви само ако има видими елементи в клипа.
Важна характеристика на празните клипове, създадени с помощта на метода createEmptyMovieClip(), е, че началната точка на техните координати се поставя в горната частлевия ъгъл на филма, независимо къде се намира регистрационната точка на медийния клип. С други думи, координатната система на празния клип е същата като координатната система на основната времева диаграма:
// Създаване на клип под формата на кръг и, като го кръстите топка, го поставете в средата // работно поле // Създаване на празен клип ball.createEmptyMovieClip("new_clip", 0); проследяване([топка._x, топка._y]); // Изходи: 251.6, 184.4 // (координати на центъра на топката клип) trace([ball.new_clip._x, ball.new_clip._y]); // Изходи: 0, 0 (координати // на центъра на празния клип)
Поставянето на празна точка за регистрация на клип не ограничава практическата му употреба: ако е необходимо, тя може лесно да бъде преместена чрез просто предефиниране на свойствата _x и _y.
Единствената основна разлика между празните клипове и обикновените клипове е, че те не са свързани със символ в библиотеката.
Най-често празните клипове се използват като платна за програмно рисуване. Това приложение ще бъде обсъдено в края на тази глава. По-рядко клип, създаден от метода createEmptyMovieClipO, се използва като контейнер за външен филм, зареден от функцията loadMovie(). Понякога са необходими празни клипове, за да се комбинират няколко клипа в един. Те могат да се използват и като излъчватели на събития или контейнери за свойства. Следващият раздел ще демонстрира как можете да премахнете статични графики, съдържащи се в клип, като използвате празни клипове.