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

5.5. Другие операторы AS

В разделе 5.3 мы рассмотрели наиболее часто встречающиеся операторы языка ActionScript. Однако такая "популярность" этих операторов связана до некоторой степени с тем, что они уже существовали в предыдущей версии Flash. Другие операторы ActionScript, пожалуй, ничуть не менее важны. В этом разделе помещено их краткое описание.

5.5.1. Операторы цикла

Начнем с операторов организации циклов. Самый простой из них - этот оператор for. Он обычно используется для организации циклов с заранее известным количеством повторов. Например, если нужно какую-либо последовательность операторов повторить 10 раз, достаточно написать:

for (а=1;а<=10;а++) {
   // операторы тела цикла
}

Здесь мы используем переменную a в качестве счетчика цикла. Сначала ей присваивается значение 1, которое увеличивается (в данном случае на 1) на каждом шаге цикла. Когда значение переменной a становится больше 10, происходит выход из цикла. На каждом шаге цикла выполняются все операторы, находящиеся внутри блока {}.

Приведем небольшой пример. Допустим, что нам нужно присвоить какой-либо переменной строковое значение, содержащее все значения кодов ASCII для букв латинского алфавита. Зная, что алфавит начинается с кода 65 (прописная буква "A"), а заканчивается (учитывая дополнительные символы) кодом 127, можно написать следующий код:

for (i=65;i<128;i++) {
   qqq = qqq+chr(i);
}

Поясним, что функция chr(), получая число в качестве аргумента, возвращает символ ASCII, соответствующий этому числу.

В приведенном примере изначально "пустая" переменная qqq постепенно заполняется символами - на каждом шаге цикла к этой строке прибавляется один символ. Вот как выглядит листинг переменных после выполнения этого цикла:

Variable _level0.i = 128
Variable _level0.qqq = "ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^ _`abcdefghijklmnopqrstuvwxyz{|}~ "

Как вы уже поняли, в операторе for необходимо указать начальное значение (счетчика цикла), условие выхода из цикла и действие, выполняемое при переходе к следующему шагу цикла. Обычно, это действие - увеличение счетчика (в данном примере - i++), однако это может быть и какое-нибудь другое действие. Например, уменьшение счетчика или вообще что-нибудь "отвлеченное".

Циклы с условием

Другой оператор цикла в ActionScript - это оператор цикла с предусловием while. Этот оператор содержит некоторое условие. Пока оно выполняется, выполняется и тело цикла, расположенное в блоке {}. Например:

while ((a<5)&&(q>340)) {
   // операторы тела цикла
}

В этом примере "операторы тела цикла" выполняются, пока переменная a меньше 5 и одновременно переменная q больше 340. Обычно подобные циклы подразумевают, что переменные, содержащиеся в условии, изменяются в теле цикла. Однако это совершенно необязательно. Например, если написать

while (true) {
   // операторы тела цикла
}

то мы получим классический бесконечный цикл. Правда, если оставить его действительно бесконечным, то он благополучно "завесит" проигрыватель Flash. Однако, предварительно выдается предупреждение, что сценарий сильно замедляет работу программы. Реагируя на это предупреждение, можно прекратить выполнение сценария.

У оператора while есть разновидность - так называемый оператор цикла с постусловием do...while. Его употребляют в том случае, если необходимо, чтобы операторы, содержащиеся внутри цикла, обязательно были выполнены хотя бы один раз. Например, можно написать так:

do {
   // операторы тела цикла
} while (а==0);

Цикл выполняется, пока переменная a остается равной 0. Однако в первый раз это условие проверяется только после первого выполнения тела цикла. Таким образом, если даже a сразу не равно 0, цикл заведомо выполняется хотя бы один раз.

Иногда для выхода из цикла применяют оператор break. Этот оператор осуществляет немедленный выход из цикла. Обычно он применяется совместно с оператором условного перехода if.

5.5.2. Условный оператор

Давайте рассмотрим этот оператор. Он проверяет условие и в случае его истинности выполняет блок {}, следующий за ним. В противном случае этот блок не выполняется. Вместо блока может быть использован одиночный оператор.

Иногда в паре с оператором if употребляется оператор else. В этом случае при ложности условия при операторе if выполняется блок {}, принадлежащий оператору else.

Например, можно написать такой код:

if (inputfield=="RightPassword") {
   gotoAndPlay ("MainMovie");
}
else {
   gotoAndPlay ("InputPassword")
}

Этот код проверит совпадение значения переменной inputfield (которая может соответствовать полю ввода) с каким-либо паролем ("секретным словом"). Если пароль задан правильно, начнется воспроизведение кадра MainMovie (в котором, например, может начинаться основной фильм). В противном случае ролик перейдет на кадр InputPassword (в котором, например, пользователя снова попросят ввести пароль).

Несмотря на всю примитивность этого примера, он наглядно демонстрирует способ применения операторов if и else. Кстати говоря, используя конструкцию if ( ) { } else if ( ) { } else if ( ) { }...else { }, можно выстроить цепочку, работающую как "переключатель" - своего рода аналог отсутствующего в языке ActionScript оператора switch, например:

if (a==l) {
   gotoAndPlay ("first");
}
else if (a==2) {
   gotoAndPlay ("second");
}
else if (a==3) {
   gotoAndPlay ("third");
}
else if (a==4) {
   gotoAndPlay ("fourth");
}
else {
   gotoAndStop ("end");
}

В этом фрагменте в зависимости от значения переменной a осуществляется переход на один из четырех поименованных фрагментов ролика.

5.5.3. Комментарии

Теперь вкратце расскажем еще о некоторых операторах ActionScript.

Оператор // служит для вставки в код сценария однострочного комментария. Все символы вплоть до конца строки, следующие за оператором //, игнорируются. Комментарии в сценариях Flash используются не так активно, как в сценариях JavaScript и VBScript, поскольку в программе Flash сама структура ролика и расположение сценариев обычно уже говорят о многом.

Тем не менее, комментариями пренебрегать не стоит. Чем сложнее сценарий, тем сложнее в нем разобраться, если по прошествии нескольких недель после его создания захочется что-то изменить.

5.5.4. Вызов сценариев и функции

Оператор call позволяет вызвать сценарий, расположенный в указанном кадре. Если какой-либо фрагмент кода необходимо повторять во многих кадрах, целесообразно написать этот фрагмент один раз. поместить его в отдельном кадре, дать этому кадру метку и затем вызывать оператором call.

Например, запись

call ("sub");

позволяет вызвать из любого места ролика выполнение сценария, расположенного в кадре с меткой sub. Это своеобразный Flash-аналог вызова подпрограммы.

Оператор function позволяет определить собственную функцию. Функция может принимать аргументы и возвращать значение. Для того чтобы явно определить возвращаемое значение, можно использовать оператор return.

Вот простой пример:

function fact(x) {
   r = 1;
   if ((x==1)||(x==0)) {
      return 1;
   }
   else {
      while (x>0) {
         r *= xx--;
      }
      return r;
   }
}

Этот код можно поместить, например, в самом первом кадре. Здесь определяется функция для вычисления факториала. Мы назвали ее fact. Аргумент x в данном случае не является реальной переменной. С его помощью мы определяем, что именно функция должна делать с принятым аргументом. Результат вычисления факториала мы записываем во временную переменную r. Поэтому, для того чтобы функция возвращала требуемое значение, использован оператор return r;.

Теперь, когда функция определена, ее можно вызывать просто по имени. Например, в этом же кадре или в любом другом мы можем написать

q = fact(8);

Просмотрев листинг переменных, можно увидеть что этот оператор присвоит переменной q значение 40320 (то есть как раз 8!). Создание функций помогает упорядочить структуру сценариев в ролике. Если вычислять какое-либо выражение приходится неоднократно, подумайте, нельзя ли его оформить в виде функции. В некоторых случаях это существенно упрощает структуру ролика.

5.5.5. Дополнительные операторы

Печать из ролика

Операторы print, printAsBitmap, printNum и printAsBitmapNum позволяют вывести какой-либо кадр или объект ролика на печать. Команда печатающему устройству посылается прямо во время воспроизведения ролика, однако, для того чтобы начать печать, пользователю все же придется щелкнуть на кнопке OK в стандартном диалоговом окне Печать. В этом операторе следует: указать имя объекта (или номер уровня) для печати и границы печатаемой области.

Оператор trace используется в основном во время отладки сценария. Он просто выводит в окно Output (Вывод) информацию, определенную его параметром. Обычно это значения каких-либо переменных или свойств объектов.

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

Работа с событиями

Оператор on определяет событие кнопки, при возникновении которого исполняется соответствующий блок {}. Этот оператор нельзя употреблять в кадрах и других флэш-символах (не кнопках). Его параметр - состояние устройств ввода, проверяемое в качестве условия.

Вот возможные значения параметра при операторе on:

Приведем маленький пример. Откройте новый ролик, создайте новый флэш-символ (CTRL+F8), сделайте его мувиком. Нарисуйте в его первом кадре круг, создайте ключевые кадры в позициях 10 и 20. В позиции 10 трансформируйте круг. Создайте в кадрах 1 и 10 морфинг и поместите в последний кадр (20) команду

gotoAndPlay (1);

Вернитесь в основной ролик. Создайте в нем еще один пустой флэш-символ, сделайте его кнопкой. Перетащите в его рабочую область только что созданный мувик из библиотеки. Опять вернитесь в основной ролик и поместите в него только что созданную кнопку. Нажмите на ней правую кнопку мыши и выберите пункт Actions (Действия), чтобы открыть окно сценария кнопки. Напишите в нем такой код:

on (rollover) {
   tellTarget ("_level0.instance1.instance2") {
      play ();
   }
on (rollOut) {
   tellTarget {"_level0.instancel.instance2") {
      stop ();
   }
}
on (release) {
   getURL ("http://www.altavista.com");
}

Как вы, наверное, догадались, _level0.instance1.instance2 - это имя, которое наш экземпляр мувика получает по умолчанию. К именам экземпляров и, их идентификации мы вернемся в главе 6, а пока что просто примите это имя как данность.

Теперь в первый (и единственный) кадр основного ролика вставьте такой сценарий:

tellTarget ("_level0.instance1.instance2") {
   stop ();
}

Просмотрите ролик. Мы получили кнопку, которая становится анимированной при наведении на нее указателя мыши. Это достигается за счет остановки и пуска воспроизведения мувика при наведении указателя мыши на кнопку - on (rollOver) и при выведении его с кнопки - on (rollOut). При этом никто не запрещает назначить действия для других событий, например, для традиционного щелчка мышью. В приведенном примере он загружает страницу поисковой машины Altavista. Сценарий в первом кадре основного ролика служит для первоначальной остановки воспроизведения "анимации кнопки".

Как мы уже говорили, оператор on может определять события только для объекта с поведением кнопки. Однако в сценариях других флэш-символов можно (и даже необходимо) употреблять другой аналогичный оператор - onClipEvent. Блок {} при этом операторе исполняется, если возникает определенное событие. Правда, на сей раз это событие возникает не в данном флэш-символе, а самом ролике.

Для иллюстрации сказанного несколько изменим предыдущий пример. Удалим в нем экземпляр кнопки из основного ролика (или даже образец кнопки из библиотеки). Поместим в единственный кадр основного ролика наш мувик (трансформирующийся круг).

Нажмите на нем правую кнопку мыши и выберите пункт Actions (Действия), чтобы открыть окно сценария объекта. Введите такой код:

onClipEvent (mouseDown) {
   play ();
}
onClipEvent (mouseUp) {
   stop ();
}
onClipEvent (load) {
   stop ();
}

Просмотрите ролик. Вы увидите, что первоначально анимация не воспроизводится. Нажатие кнопки мыши в любом месте окна (не обязательно на мувике) запускает анимацию, а отпускание кнопки останавливает ее. Это осуществляют операторы onClipEvent (mouseDown) - нажатие кнопки мыши и onClipEvent (mouseUp) - отпускание кнопки мыши. Для первоначальной остановки анимации использован оператор onClipEvent (load), который выполняет блок {} при загрузке объекта. В качестве параметра оператора onOipEvent можно использовать также ключевые слова: unload (выгрузка объекта), enterFrame (переход в кадр), keyDown (нажатие клавиши), keyUp (отпускание клавиши). Интересно, что, в отличие от оператора on оператор onClipEvent одинаково реагирует на нажатие всех алфавитно-цифровых клавиш и не реагирует на нажатие специальных клавиш (типа ENTER). Зато здесь можно назначить разные действия на нажатие и отпускание клавиши.

Существует еще целый ряд важных операторов. Это, например, setProperty, duplicaleMovieClip, removeMovieClip, startDrag, stopDrag и еще некоторые. Однако рассказ о них мы совместим с соответствующими примерами. Этим мы займемся в главах 6 и 7.

5.5.6. Пример использования сценария

Заканчивая эту главу, все же хочется привести какой-нибудь полноценный, хотя и несложный пример. Помните, как в главе 3 мы создали анимацию с рисованным шариком, "прыгающим" по растровому изображению дороги? Давайте сейчас попробуем добавить к этой анимации кнопку, первое нажатие на которую останавливает анимацию, повторное - возобновляет и так далее. Разумеется можно взять и любую другую анимацию.


Рис. 5.3. Добавим к ролику кнопку для остановки и пуска анимации

Откроем этот ролик снова и создадим в нем слой для кнопки, назовем его butt. Нарисуем в нем кнопку (рис. 5.3). Главная задача - добиться того чтобы эта кнопка по очереди выполняла разные действия. Для этого введем переменную-флаг cond.

Пусть, если анимация остановлена, значение cond равно нулю, а если воспроизводится, то единице. Тогда можно в зависимости от значения переменной cond назначить кнопке действия play или stop. После каждого из этих действий следует соответственно изменить значение переменной cond. Мы можем, таким образом, написать такой код:

on (release) {
   if (cond!=1) {
      play ();
      cond = 1;
   }
   else {
      stop ();
      cond = 0;
   }
}

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

stop ();
cond = 0;

Просмотрите ролик. Теперь он с самого начала функционирует корректно.

А теперь перейдем к рассмотрению объектов ActionScript, которые намного упрощают жизнь флэшерам.

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