[ предыдущая страница ] [ следующая страница ] [ содержание ]

6. Некоторые особенности применения языка сценариев ActionScript

6.1. Идентификация экземпляров

Итак, приступим к рассмотрению различных особенностей применения сценариев ActionScript. Одновременно будем обращать внимание на элементы языка, не описанные ранее.

6.1.1. Имена экземпляров флэш-символов в ролике

Начнем с небольшого примера. Он покажет, как управлять экземплярами флэш-символов из основного ролика или из любого встроенного объекта.

Описание ролика

Предположим, имеется ролик, в котором объекты движутся по экрану навстречу друг другу (рис. 6.1). Поскольку рисунок в книге не может воспроизвести анимацию, опишем этот ролик немного подробнее. Графический объект Wheel-static содержит изображение колеса. Этот объект помешен в мувик Wheel. В позиции 35 мувика Wheel создан ключевой кадр с тем же изображением и кодом

gotoAndPlay (1);

В первом кадре создана анимация движения и задан режим поворота по часовой стрелке (CW) 1 раз.

Второй мувик, Car-static, содержит изображение силуэта машины и два мувика Wheel в качестве колес. Анимацию движения машины обеспечивает мувик Car. Он содержит мувик Car-static. В позиции 60 имеется еще один ключевой кадр, в котором мувик Car-static сдвинут далеко вправо. Между этими кадрами создана анимация движения.


Рис. 6.1. В этом ролике управление объектами осуществляется с клавиатуры

В основной ролик помещены шесть экземпляров мувика Car, Три из них сдвинуты за границу рабочей области влево, а три - вправо. Те, что справа, развернуты в горизонтальной плоскости командой Flip Horizontal (Отразить по горизонтали).

Теперь мы хотим нажатием на разные клавиши останавливать движение некоторых машинок. Для чего это может потребоваться - сейчас неважно. Пофантазируйте сами.

Например, пусть клавиши 1, 2 и 3 останавливают, соответственно, верхнюю, среднюю и нижнюю машинки из движущихся слева направо. Для этого экземплярам мувика Car надо дать имена. Вообще говоря, тем экземплярам мувиков, которым имена не даны, программа присваивает их самостоятельно. В этом можно убедиться, нажав во время просмотра ролика клавиши CTRL+L. Это сочетание открывает список объектов. Вот как он выглядит для только что описанного ролика.

Level #0: Frame=1
   Movie Clip: Frame=21 Target="_level0.instance1"
   Movie Clip: Frame=1 Target="_level0.instancel.instance2"
Shape:
   Movie Clip: Frame=21 Target="_level0.instance1.instance2.instance3"
Shape:
   Movie Clip: Frame=21 Target="_level0.instance1.instance2.instance4"
Shape:
   Movie Clip: Frame=21 Target="_level0.instance5"
   Movie Clip: Frame=1 Target="_level0.instance5.instance6"
Shape:
   Movie Clip: Frame=21 Target="_level0.instance5.instance6.instance7"
Shape:
   Movie Clip: Frame=21 Target="_level0.instance5.instance6.instance8"
Shape:
   Movie Clip: Frame=21 Target="_level0.instance9"
   Movie Clip: Frame=1 Target="_level0.instance9.instance10"
Shape:
   Movie Clip: Frame=21 Target="_level0.instance9.instance10.instance11"
Shape:
   Movie Clip: Frame=21 Target="_level0.instance9.instanae10.instance12"
Shape:
   Movie Clip: Frame=21 Target="_level0.instance13"
   Movie Clip: Frame=1 Target="_leve10.instance13.instance14"
Shape:
   Movie Clip: Frame=21 Target="_level0.instance13.instance14.instance15"
Shape:
   Movie Clip: Frame=21 Target="_level0.instance13.instance14.instance16"
Shape:
   Movie Clip: Frame=21 Target="_level0.instance17"
   Movie Clip: Frame=1 Target="_level0.instance17.instance18"
Shape:
   Movie Clip: Frame=21 Target="_level0.instance17.instance18.instance19"
Shape:
   Movie Clip: Frame=21 Target="_level0.instance17.instance18.instance20"
Shape:
   Movie Clip: Frame=21 Target="_level0.instance=21"
   Movie Clip: Frame=1 Target="_level0.instance21.instance22"
Shape:
   Movie Clip: Frame=21 Target="_level0.instance21.instance22.instance23"
Shape:
   Movie Clip: Frame=21 Target="_level0.instance21.instance22.instance24"
Shape:

Как видите, каждому экземпляру каждого мувика дано имя, состоящее из слова instance (экземпляр) и номера экземпляра. Однако согласитесь, что разобраться в том, какое имя какому мувику соответствует, нелегко. К тому же, приведенный выше листинг соответствует очень простому ролику, а в более сложном ролике дело может обстоять еще хуже. Поэтому лучше, если имена экземплярам даст автор ролика, причем имена осмысленные. В данном случае вполне подойдут имена car1, car2 и car3. Напишем их в соответствующих полях вспомогательной панели Instance (Экземпляр).

Теперь можно добавить в единственный пока кадр основного ролика такой код:

if (key.isDown(ord(1))) car1.stop ();
if (key.isDown(ord(2))) car2.stop ();
if (key.isDown(ord(3))) car3.stop ();

Он проверяет, не нажата ли одна из клавиш 1, 2 или 3, и, если это так, останавливает соответствующий мувик. Осталось только добавить в основной ролик обычный кадр в позицию 2, чтобы обеспечить цикличность исполнения кода в первом кадре.

Для проверки знаний попробуйте самостоятельно решить задачку: как останавливать вместе с машинкой и ее колеса, которые (если вы сделали все так, как описано) продолжают крутиться после остановки машины?

6.1.2. Доступ к переменным во флэш-символах

Отвлечемся на некоторое время от конкретных примеров и вернемся к теории. Мы видели, что экземпляры флэш-символов могут размещаться друг в друге. Далее, каждый мувик может иметь свои переменные. Причем, если основной ролик содержит переменную а, это совсем не значит, что какой-либо мувик не может содержать переменную с таким же именем. Для них в памяти выделяются различные области, и, следовательно, это совершенно разные переменные.

Например, пусть в основном ролике имеется следующий код:

a = 5;
b = 100;

Кроме того, имеется мувик, в первом кадре которого расположен такой код:

a = 38;
c = 123456;

Ни одного экземпляра мувика в основном ролике нет. Запустив просмотр ролика и нажав клавиши CTRL+ALT+V, мы увидим в списке только переменные a и b, размещенные в основном ролике.

Теперь поместим в основной ролик экземпляр нашего мувика с переменными и назовем его mymovie. Запустим просмотр ролика и в листинге переменных увидим следующее:

Level #0:
   Variable _level0.$version = "WIN 5,0,30,0"
   Variable _level0.a = 5
   Variable _level0.b = 100
Movie Clip: Target="_level0.mymovie"
Variable _level0.mymovie.a = 38
Variable _level0.mymovie.c = 123456

Путь доступа

Видно, что две переменные с одинаковым именем a совершенно не мешают друг другу и даже имеют разные значения. Это происходит потому, что они находятся в различных объектах. Объекты и переменные можно рассматривать как аналог папок (каталогов) и файлов. Как в различных каталогах диска могут одновременно существовать файлы с одинаковыми именами (например, C:\mytext.txt и C:\MyDocs\mytext.txt), так и внутри различных объектов могут существовать переменные с одинаковыми именами.

В данном случае одна из переменных находится в корневом объекте (ее полное имя, или, как говорят, полный путь - _level0.a), а другая - внутри экземпляра mymovie, который, в свою очередь, расположен в корневом объекте (_level0.mymovie.a).

Теперь если в основном ролике в каком-либо кадре встретится код

a = 6;

то новое значение получит переменная _level0.a, а если тот же код встретится внутри мувика, то изменится значение переменной _level0.mymovie.a. Более того, если в основном ролике написать далее

c = 111;

то внутри корневого объекта будет создана новая переменная c (_level0.c), а значение переменной c, расположенной внутри мувика, не изменится. А что делать, если все же потребовалось из основного ролика изменить значение переменной c, расположенной внутри мувика? Очень просто! Поскольку в основном ролике расположен экземпляр mymovie, то нужно обратиться к его переменной через его имя:

mymovie.c = 111;

Такой код в основном ролике изменит значение переменной c, расположенной внутри мувика.

Подобным образом можно добраться и до переменных основного ролика из мувика mymovie. Если в каком-либо кадре этого ролика потребовалось изменить значение находящейся в основном ролике переменной b, нужно использовать ключевое слово _parent. Оно позволяет подняться "на один уровень выше":

_parent.b = 333;

Чтобы сразу переместиться в корневой объект, можно использовать ключевое слово _root.

Кроме того, можно использовать и абсолютные имена переменных (те, что выводятся в листинге):

_level0.a = 22;
_level0.mymovie.a = 145;

Такой код, вне зависимости от его размещения, обращается к обоим переменным a: и к расположенной в основном ролике, к к той, что принадлежит мувику mymovie.

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

Level #0:
   Variable _level0.$version = "WIN 5,0,30,0"
   Variable _level0.a = 5
   Variable _level0.b = 100
Movie Clip: Target="_level0.mymovie"
Variable _level0.mymovie.a = 38
Variable _level0.myniovie.c = 123456
Movie Clip: Target="_level0.yourmovie"
Variable _level0.yourmovie.a = 38
Variable _level0.yourmovie.c = 123456

Итак, переменные a и c созданы внутри обоих мувиков, причем они имеют одинаковые значения. Это неудивительно, поскольку значения им присваивались в образце мувика. Однако если нам не нужно, чтобы внутри мувика yourmovie существовали эти переменные, никто не мешает при их создании использовать абсолютные (полные) имена:

_level0.mymovie.a = 38;
_level0.myrnovie.c = 123456;

Теперь, даже несмотря на то что код расположен в образце мувика, переменные создаются только внутри экземпляра mymovie. И, наконец, еще один момент. Можно ли, не используя абсолютные обращения, из мувика mymovie добраться до переменных мувика yourmovie?

Ответ весьма прост. Поскольку ключевое слово _parent поднимает нас на уровень выше, в данном случае из mymovie можно добраться до yourmovie через корневой уровень:

_parent.yourmovie.d = 0;

Этот код, расположенный внутри экземпляра mymovie, создаст переменную d внутри экземпляра yourmowie.

Теперь представим себе, что внутри нашего мувика с переменными имеется экземпляр другого, "маленького" мувика с именем small. Таким образом, у нас появились независимые объекты _level0.mymovie.small и _levd0.yourmovie.small. Теперь внутри этого последнего объекта потребовалось создать переменную newvar. Как должен выглядеть код для обращения к ней?

Во-первых, независимо от размещения кода, к этой переменной можно обратиться по абсолютному пути: _level0.yourmovie.small.newvar. Из основного ролика можно использовать обращение yourmovie.small.newvar, из мувика yourmovie - обращение small.newvar, а из мувика small, расположенного внутри yourmovie, - просто newvar. Кроме того, из мувика mymovie можно обратиться к этой переменной так: _parent.yourmovie.small.newvar. Продолжить цепочку примеров можете самостоятельно.

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

[ предыдущая страница ] [ следующая страница ] [ содержание ]
Hosted by uCoz