Зачастую может возникнуть ситуация, когда необходимо управлять большим числом экземпляров клипа. Давать каждому экземпляру имя и писать для него отдельный код весьма трудоемко, и может плохо сказаться на читабельности кода. Гораздо проще назвать их таким образом, чтобы идентификаторы экземпляров клипа отличались только порядковым номером. Однако при этом возникает еще одна трудность: содержимое текстового поля всегда интерпретируется как строка. В этом случае на помощь может прийти функция eval(), которая фактически преобразует строку в исполнимый код. Запустив затем цикл, можно будет обратиться ко всем экземплярам, используя следующую форму:
eval("name"+n);
В функцию eval() можно поместить пользовательскую функцию, но при этом ее круглые скобки (оператор вызова) должны располагаться вне скобок eval():
function func2() {
return "Произошел вызов!!!";
}
trace(eval("func"+2)()); // Возвращает: Произошел вызов!!!
Функция eval() не совместима с оператором присваивания (точнее, выражение с ней не может являться левым операндом оператора «=»). Для того чтобы создать переменную или свойство с динамически формируемым именем, нужно использовать оператор «[]»:
eval("per"+i)="Привет"; // Эта строчка вызывает ошибку
this["реr"+i]="Привет"; // Оптимальный способ
Создать копию имеющегося в кадре клипа можно, воспользовавшись функцией duplicateMovieClip():
duplicateMovieClip(clip, "obj", n);
Функция duplicateMovieClip() требует задания трех параметров:
- clip – имя клипа, копия которого должна быть создана;
- «obj» – имя копии клипа, создаваемого динамически;
- n – глубина клипа. Уникальный параметр, задающий, выше или ниже других объектов будет располагаться клип.
- Создайте новый проект.
- Нарисуйте небольшой кружок, выделите его и с помощью клавиши F8 преобразуйте в символ клипа. Задайте данному экземпляру имя «ball».
- Выделите первый кадр на главной временной шкале и откройте с помощью клавиши F9 окно Action. Введите следующий код:
// скрываем клип, с которого создаются копии
// создаем функцию, в которой определяем начальные координаты
// каждой копии клипа, его ширину и высоту
ball._visible = false;
function start_clip(k) {
// координата Х определяется случайным образом
this["ball"+k]._x = Math.random()*550;
this["ball"+k]._y = -20;
t = Math.random()*6;
// ширина и высота также определяются случайно
this["ball"+k]._width = 1+t;
this["ball"+k]._height = 1+t;
}
// Создаем цикл с помощью которого получается 50 копий исходного клипа
for (k=0; k<50; k++) {
// идентификаторы новых клипов отличаются «номером» клипа
duplicateMovieClip("ball", "ball"+k, k);
this.start_clip(k); // вызываем функцию для задания начальных параметров новому клипу
}
// создаем функцию для перемещения всех созданных экземпляров клипа
function move() {
for (i=0; i<50; i++) {
// скорость зависит от размера «снежинки»
_root["ball"+i]._y += _root["ball"+i]._width/3;
// если «снежинка» уходит за экран, вызываем начальную
// функцию для переопределения ее параметров
if (_root["ball"+i]._y>350) {
_root.start_clip(i);
}
}
}
// вызываем функцию перемещения клипов 1 раз в 50 миллисекунд
setInterval(move, 50);
- Запустите предварительный просмотр и понаблюдайте за анимацией. Ее особенностью является то, что в данном случае характер падения снежинок является случайным.