Зачастую может возникнуть ситуация, когда необходимо управлять большим числом экземпляров клипа. Давать каждому экземпляру имя и писать для него отдельный код весьма трудоемко, и может плохо сказаться на читабельности кода. Гораздо проще назвать их таким образом, чтобы идентификаторы экземпляров клипа отличались только порядковым номером. Однако при этом возникает еще одна трудность: содержимое текстового поля всегда интерпретируется как строка. В этом случае на помощь может прийти функция 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() требует задания трех параметров:

Пример 8. Падающий снег (скачать исходный файл)

  1. Создайте новый проект.
  2. Нарисуйте небольшой кружок, выделите его и с помощью клавиши F8 преобразуйте в символ клипа. Задайте данному экземпляру имя «ball».
  3. Выделите первый кадр на главной временной шкале и откройте с помощью клавиши 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);
  1. Запустите предварительный просмотр и понаблюдайте за анимацией. Ее особенностью является то, что в данном случае характер падения снежинок является случайным.

Пример 8. Анимация «падающий снег»