Московский физико-технический институт
Опубликован: 23.12.2005 | Доступ: свободный | Студентов: 2868 / 252 | Оценка: 4.61 / 4.44 | Длительность: 27:18:00
ISBN: 978-5-9556-0051-2
Лекция 9:

Классы и клипы

Счетчики уровня

Вернемся к параметру depth. Этот параметр отвечает за уровень, на который будет помещен объект. (Если вы внимательно читали третью лекцию, то помните, что это такое. Однако эти сведения очень важны, так что позволим себе их повторить).

Зачем нужны уровни? С их помощью мы управляем тем, какой объект визуально должен быть расположен "выше", а какой "ниже". Кроме того, у них есть такое важное свойство: на одном уровне не может лежать больше одного объекта (они затирают друг друга).

Объясним более детально.

Мы знаем, что объекты можно поместить на сцену непосредственно либо динамически (с помощью duplicateMovieClip или attachMovie ). Каждый объект, независимо от способа помещения на сцену, лежит на своем уровне, и чем больше номер уровня, тем "выше" лежит объект.

Если объект помещается на сцену непосредственно, то уровень объекта зависит от:

  • слоя, в который помещен объект;
  • порядка размещения объектов в одном слое, которым можно управлять из меню Modify->Arrange.

Числовые значения уровней объектов, помещенных на сцену непосредственно, мы получить не можем, но про них известно две вещи:

  • в данном клипе они всегда меньше, чем все значения уровней динамически помещенных объектов (если вы не использовали метод swapDepths );
  • они никогда не перекрываются, то есть всегда имеют разные значения, и те объекты, которые мы положили выше, имеют большие значения уровня, чем те, которые лежат ниже. Об этом заботится Флэш-среда.

Если объекты помещаются на сцену динамически, то уровень объекта зависит только от параметра depth. Значение этого параметра должно быть целым числом и может быть как положительным, так и отрицательным. Чуть ниже мы рассмотрим, зачем может понадобиться отрицательная величина depth.

Все эти уровни, как правило, располагаются выше уровней объектов, помещенных на сцену непосредственно (даже если вы зададите отрицательное значение depth ). Дело в том, что непосредственно нарисованные объекты имеют очень большие по модулю отрицательные значения depth (в районе -16384).

SwapDepths

Если это зачем-то нужно, уровни двух объектов можно поменять местами с помощью метода swapDepths :

my_mc1.swapDepths (my_mc2);

Этот метод можно использовать для всех объектов, как помещенных на сцену непосредственно, так и динамически, в том числе менять местами уровни двух объектов разного "типа" (в смысле способа помещения на сцену).

Пример:

Пусть у нас в библиотеке есть клип " Symbol2 " (синий кружок). Один его экземпляр вытащен на сцену непосредственно, назван s1 и раскрашен в красный цвет. Остальные создаются с помощью следующего кода:

attachMovie ("Symbol2", "s2", 1);
s2._x = 100;
s2._y = 200;
attachMovie ("Symbol2", "s3", 0);
s3._x = 70;
s3._y = 200;
s2._alpha = 30;

Вот что получается (здесь внизу - s1, слева - s3, справа - s2 ):


Все, как мы и ожидали, s2 - выше всех, s1 - ниже всех.

Теперь можем выполнить команду s1. swapDepths (s3);

После чего получим такую картинку:


Мы видим, что s2, как и раньше, выше всех, а s1 и s3 поменялись местами.

А сейчас представьте, что мы захотели добавить к нашей композиции фон (также динамически). Добавим такой код:

attachMovie ("Background", "bkg", -1);
   //обратите внимание, отрицательный depth
bkg._x = 50;
bkg._y = 200;

Результат получим следующий:


Все правильно, под клипом bkg теперь находится только синий кружок, который мы (с помощью swapDepths ) поменяли местами с красным кружком, непосредственно помещенным на сцену. А у красного кружка до выполнения swapDepths был уровень непосредственно помещенного на сцену клипа, который по определению размещается на глубоких отрицательных уровнях. Вот почему bkg оказался выше синего кружка, хоть у него (у bkg ) и отрицательный depth.

Реализация автоматического счетчика

Иногда бывает нужно динамически создать много объектов. В таких случаях пользуются счетчиками уровней, чтобы по ошибке не положить два объекта на один и тот же уровень. Такими счетчиками можно пользоваться также для генерирования уникального суффикса имени (ведь имена объектов тоже нельзя дублировать).

Пример:

this.depthCounter = 0;
//....
for (var i = 0; i < 10; i++)
   this.attachMovie ("SomeSymbol", "symbol"+(depthCounter++),
depthCounter);

Интересным здесь является также тот момент, что счетчик хранится в клипе, в который кладутся новые объекты. То есть, если когда-нибудь позже мы вернемся к созданию новых объектов в клипе, в котором до того уже создавали динамические объекты, мы продолжим считать уровни со старого значения счетчика, сохраненного в этом клипе.