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

5.2. Основные операторы

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

Чтобы научиться писать сценарии, нужно вначале ознакомиться с языком ActionScript, который используется в программе Flash. Язык этот весьма прост для изучения, а способ создания сценария, как видно из предыдущего раздела, приспособлен для того, чтобы сделать процесс создания сценария максимально удобным. Если, предположим, вы не помните, какие параметры следует задать для того или иного оператора, программа сама подскажет их.

Давайте, прежде всего, ознакомимся с основными операторами языка ActionScript. Основные операторы - операторы, встречающиеся наиболее часто, - даже вынесены в отдельную папку в левой части окна Frame Actions (Действия кадра) или Object Actions (Действия объекта). Эта папка называется Basic Actions (Основные действия). Интересно, что в этой папке, в отличие от папки Actions (Действия), операторы перечислены описательно, например, Get URL (Загрузить с адреса) или If Frame Is Loaded (Если кадр загружен) вместо getURL и ifFrameLoaded, как следует писать в коде.

5.2.1. Операторы выбора кадра

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

Например, оператор

gotoAndPlay (5);

осуществляет переход на пятый кадр текущей сцены. Обратите внимание на точку с запятой в конце строки. В языке ActionScript этот символ используется в качестве разделителя между операторами (как и во многих других языках). Поэтому привыкайте ставить точку с запятой после каждого оператора (хотя в обычном режиме ввода этот символ добавляется в код автоматически).

Если в кадре, на который осуществляется переход, определена метка, то вместо номера кадра в операторе gotoAndPlay можно указать метку кадра. Метка определяется в поле Label (Метка) на вспомогательной панели Frame (Кадр), и отображается прямо на шкале времени, если там достаточно места. Например, если в ролике есть кадр с меткой fade, то в другом кадре можно написать:

gotoAndPlay ("fade");

для осуществления безусловного перехода на этот кадр. Метка кадра пишется здесь в кавычках.

Указывать для перехода метку кадра обычно целесообразнее, чем номер кадра. Если в процессе дальнейшей работы удалить или вставить какие-либо кадры, вся нумерация кадров изменится. Соответственно, придется разыскивать и изменять вручную все номера кадров в операторах типа gotoAndPlay. А метки кадров будут сдвигаться вместе с самими кадрами. Поэтому, если в операторах типа gotoAndPlay использованы метки, в такой ситуации их не придется изменять вручную.

Можно, кстати, использовать в операторе gotoAndPlay вместо номера кадра выражение, с помощью которого он будет вычислен, например, х+(2*у). Подробнее о выражениях рассказано в разделе 5.4.

Во всех предыдущих случаях переход осуществляется на кадры текущей сцены. Если в ролике несколько сцен, то в операторе gotoAndPlay можно указать не один, а два параметра. В этом случае первый из них - название сцены, заключенное в кавычки, а второй - номер кадра, вычисляемое выражение или метка кадра (как описывалось выше). Например, оператор

gotoAndPlay ("Scene 1",28);

осуществляет переход на кадр 28 сцены Scene 1.

Как видно из названия, оператор gotoAndPlay подразумевает продолжение воспроизведения ролика после перехода. Чтобы после перехода на другой кадр ролик остановился, вместо оператора gotoAndPlay следует использовать оператор gotoAndStop, например, вот так:

gotoAndStop (10);

Все сказанное выше об операторе gotoAndPlay применимо и к оператору gotoAndStop.

Для безусловного перехода существует еще четыре оператора. Немедленный переход к следующей сцене осуществляет оператор

nextScene ();

а переход к предыдущей сцене - оператор

prevScene ();

Аналогично, для перехода к следующему и предыдущему кадру текущей сцены используются соответственно операторы

nextFrame ();

и

prevFrame ();

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

Давайте рассмотрим очень простой пример на использование оператора gotoAndPiay. Допустим, мы хотим, чтобы градиентный заголовок веб-странички выезжал слева и затем начинал переливаться всеми цветами радуги. Сначала переименуем единственный пока слой как header. Создадим текстовое поле, напишем в нем сам заголовок, выберем его шрифт и преобразуем в мувик. Клавишей F6 вставим в позицию 36 ключевой кадр. Вернемся в первый кадр, сдвинем заголовок влево за границу рабочей области, уменьшим его горизонтальный размер и наклоним влево для того, чтобы создать впечатление "встречного ветра". На самом деле этот эффект можно сделать гораздо более реалистичным, скомбинировав несколько анимаций и используя параметр Easing (Замедление). Создадим анимацию движения.

Создадим новый слой, назовем его gradient. Нарисуем в нем прямоугольник без контура, по размерам несколько превосходящий рабочую область. Зальем его сложным линейным градиентом (например, из 7 цветов). Преобразуем слой header в слой-маску, а слой gradient - в маскированный. Перейдем на этот слой, скопируем градиентный прямоугольник, поставим копию рядом с "оригиналом" и перевернем по горизонтали командой Modify Transform Flip Horizontal (Изменить Преобразование Отразить по горизонтали).

Выделим оба прямоугольника вместе и преобразуем их в мувик. Создадим в позиции 36 ключевой кадр клавишей F6. Если сейчас просмотреть ролик, мы увидим, что градиентный заголовок "приезжает", приближаясь с левой стороны.

Создадим вторую анимацию. Перейдем в слой gradient и вставим ключевые кадры клавишей F6 в позиции 96 и 156. Вернемся в кадр 96 и сдвинем мувик влево, так, чтобы рабочую область закрывал правый прямоугольник. Создадим анимацию движения в кадрах 36 и 96. Мувик будет перемещаться влево и обратно вправо.

Перейдем в слой header, отметим позицию 156 и вставим там обычный кадр клавишей F5. Опять просмотрим ролик. Теперь заголовок выезжает, потом переливается, резко исчезает, опять выезжает и переливается и так далее. Осталось сделать самое главное. Чтобы заголовок "выезжал" только один раз, а потом постоянно проигрывал анимацию "переливов цвета", отметим 36 кадр и поставим на нем метку begin. Перейдем в 156 кадр и вставим в него код:

gotoAndPlay ("begin");

Вот теперь ролик готов. Из последнего кадра переход осуществляется не на первый, а на тридцать шестой кадр, за счет чего зациклен не весь ролик, а только нужная его часть, а "вступление" проигрывается только один раз.

5.2.2. Операторы воспроизведения и остановки

Перейдем к рассмотрению других операторов.

Самые простые операторы - это оператор воспроизведения ролика после остановки

play ();

и оператор остановки воспроизведения

stop ();

Оба эти оператора не имеют параметров. Их мы уже рассматривали выше.

Если почему-либо требуется сразу остановить воспроизведение всех звуков, которые в данный момент можно услышать в ролике, используйте оператор

StopAllSounds ();

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

5.2.3. Оператор загрузки страницы

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

getURL ("http://www.mmv.ru/p/rusmodern")

В этом случае указанная страница загружается в окно браузера. Если браузер не открыт, он запускается автоматически. На практике этот оператор является аналогом Flash для обычной гиперссылки (тега HTML <A> с атрибутом HREF=).

А у обычной гиперссылки, скажете вы, есть атрибут TARGET=, указывающий, в какое окно надо загрузить страницу. По аналогии с этим атрибутом оператор getURL имеет второй, необязательный параметр, в котором точно таким же образом можно указать имя окна для загрузки страницы! Это имя может представлять собой либо имя уже открытого окна или фрейма браузера, либо одно из ключевых слов _top, _self, _blank и _parent. Ключевое слово _top загружает страничку в самый верхний в иерархии фрейм, ключевое слово _self - в то же окно, откуда сделан вызов, ключевое слово _blank - в новое окно браузера, а ключевое слово _parent - в окно, являющееся родительским по отношению к данному. Если вы знаете атрибуты тега HTML <А>, то все это покажется до боли знакомым.

Особенности пересылки параметров

Кроме того, оператор getURL имеет еще и третий, тоже необязательный, параметр - способ передачи переменных загружаемой страничке. Переменные могут быть переданы либо методом GET, либо методом POST, так что значением этого параметра должно быть одно из этих двух ключевых слов. Для тех, кто не знаком с синтаксисом протокола HTTP, кратко поясним, что при передаче переменных методом GET их значения как бы "дописываются" в конец строки адреса и передаются вместе с ней, а тело запроса HTTP остается пустым. Это ускоряет передачу данных, однако при попытке передать слишком много данных таким способом можно столкнуться с ограничениями на длину строки запроса, действующими на многих серверах. Поэтому для передачи большого объема данных безопаснее пользоваться более медленным, но в некотором смысле более надежным методом POST, при котором все данные помещаются в тело запроса HTTP.

К чему я это все говорю? Дело в том, что при отправке переменных с помощью оператора AS getURL по указанному адресу передаются все переменные, существующие на данный момент в ролике, и если их много, то при использовании метода GET могут возникать непредвиденные ошибки.

Вот как может, например, выглядеть такой оператор:

getURL ("http://www.mysite.ru/cgi-bin/sub.cgi","_blank","GET");

Однако есть способ передать на указанный адрес только те переменные, которые действительно необходимы. Например, если нужно передать только значения переменных x и y, зачем передавать все переменные ролика, которых может быть несколько десятков? Передавая только необходимые данные, можно существенно ускорить обмен пользователя с сервером.

Чтобы передать только те данные, которые необходимы, нужно вообще не включать в строку оператора getURL третий параметр (чтобы программа думала, что передачи переменных не происходит), но при этом в строку адреса их следует включить вручную. Например, если нужно передать переменные x и y, значения которых на данный момент равны, например, 37 и 67, нужно модифицировать оператор следующим образом:

getURL ("://www.mysite.ru/cgi-bin/sub.cgi?x=37&y=67","_blank");

При этом, разумеется, переменные передаются методом GET. Опытные флэшеры обычно называют такой способ передачи данных наиболее предпочтительным в большинстве случаев. Обычно передача параметров имеет смысл, если запрашиваемая страница является сценарием CGI. Правда, в некоторых случаях таким образом передают данные и клиентским сценариям (например, JavaScript), содержащимся на странице HTML. Читателю, заинтересовавшемуся вопросами программирования CGI, можно порекомендовать книгу А. Павлова "CGI-программирование".

5.2.4. Операторы загрузки ролика

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

Поясним сказанное. В роликах Flash определена так называемая многоуровневая структура. Уровни ролика нумеруются, начиная с 0. На каждом уровне может находится только один ролик, не являющийся флэш-символом. При этом основной ролик считается находящимся на уровне 0. Если мы загрузим на уровень 0 какой-либо другой ролик, то он заменит собой предыдущий. Например, если в каком-либо кадре написать

loadMovieNum ("auto2.swf",0);

то в этот момент ролик auto2.swf загружается вместо текущего. Такие команды хорошо применять в кнопках, чтобы использовать их как своеобразные гиперссылки (наряду с оператором getURL).

Если же написать

loadMovieNum ("auto2.swf",1);

то в этот момент ролик auto2.swf загружается на уровень 1. При этом он заслоняет собой основной ролик, но если его впоследствии выгрузить оператором

unloadMovieNum (1);

под ним "обнаружится" старый ролик. Более того, если во вновь загруженном ролике имеются прозрачные элементы, то старый ролик будет сквозь него просвечивать. Как вы уже, наверное, поняли, оператор unloadMovieNum служит для выгрузки ролика с указанного уровня. При этом, правда, выгружаются и ролики, лежащие "выше" выгружаемого. Например, если загрузить ролики на уровни 1 и 2, а затем выполнить оператор

unloadMovieNum (1);

то выгружены будут оба ролика. Кстати, из этого следует, что выгрузка ролика с уровня 0 не сулит ничего интересного - окно воспроизведения ролика полностью очищается.

Между прочим, можно загрузить ролик не только на один из уровней, но и вместо любого экземпляра мувика. Для этого нужно использовать оператор loadMovie. Например, если в ролике на сцене присутствуют несколько экземпляров мувика, один из которых имеет имя changeme, то после выполнения кода

loadMovie ("auto2.swf","changeme");

вы увидите вместо этого экземпляра ролик auto2.swf, который будет вести себя как флэш-символ!

В следующих главах в нескольких примерах будет проиллюстрировано применение операторов getURL и loadMovie/loadMovieNum.

Весьма интересным оператором языка ActionScript является также оператор fscommand. Он позволяет передать команду во внешнюю среду. Несколько примеров использования этого оператора мы рассмотрим в разделе 7.1.

5.2.5. Определение объекта назначения

Операторы tellTarget и его полный аналог with отличаются от прочих тем, что они не производят каких-либо действий с элементами ролика, а только переопределяют объект назначения. Это означает следующее. Оператор tellTarget (или with) обязательно содержит после себя фрагмент кода, заключенный в фигурные скобки ({}). Такой фрагмент кода принято называть блоком. Весь блок, содержащийся в операторе tellTarget, осуществляет действия не с тем объектом, в котором расположен сценарий, а с объектом, определенным в операторе tellTarget/with. В некотором смысле этот оператор аналогичен оператору with языка JavaScript.

Чтобы читателю было легче понять объяснение, данное в предыдущем абзаце, приведем пример. Допустим, мы открыли новый ролик и создали в нем мувик с анимацией. Для примера достаточно сделать что-нибудь простое, например, квадрат, превращающийся в круг и обратно.

Поместите в основном ролике экземпляр этого мувика. Выделив его, введите в поле Name (Имя) вспомогательной панели Instance (Экземпляр) имя для этого экземпляра, например, Quad. Имя, присвоенное именно экземпляру мувика, а не его образцу, очень важно. К этому вопросу мы еще вернемся в разделе 6.1.

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

После всей этой подготовки перейдем к основной части нашего примера. Создадим в основном ролике второй слой, назовем его Butt. Нарисуем в нем кнопку любого вида и вставим туда следующий код:

on (release) {
   stop ();
}

Пока вроде бы ничего нового. При просмотре ролика щелчок на кнопке остановит его воспроизведение. Однако обратите внимание на то, что по щелчку остановлен только основной ролик: движение по кругу прекратилось, но трансформация квадрата в круг и обратно продолжается, то есть мувик Quad по-прежнему воспроизводится. Это происходит потому, что кнопка расположена в основном ролике, следовательно, оператор stop останавливает именно его.

Однако с помощью оператора tellTarget можно перенаправить действие оператора stop на вложенный мувик. Заменим код кнопки следующим:

on (release) {
   tellTarger ("Quad") {
      stop ();
   }
}

Здесь оператор tellTarget перенаправляет действие всех операторов, находящихся внутри его блока, на мувик Quad. Если сейчас просмотреть ролик, то по щелчку на кнопке остановится трансформация квадрата в круг и обратно, а круговое движение объекта продолжится. Следовательно, остановилось только воспроизведение мувика Quad, а воспроизведение основного ролика продолжается.

Если же надо нажатием кнопки остановить и основной ролик, и вложенный мувик, ничто не мешает объединить обе команды остановки в одном сиенарии:

on (release) {
   stop ();
   with (Quad) {
      stop ();
   }
}

Как видите, синтаксис оператора with отличается только отсутствием кавычек у имени целевого объекта.

Впрочем, для данного случая наиболее простым решением было бы вообще сделать флэш-символ, названный нами Quad, не мувиком, а графикой. В этом случае при остановке основного ролика одновременно остановилась бы и анимация графического объекта.

5.2.6. Проверка завершения загрузки

И, наконец, последний из основных операторов языка AS, которые мы рассматриваем в этом разделе, позволяет проконтролировать, загружен ли уже в память компьютера тот или иной кадр. Поскольку ролики Flash чаще всего предназначаются для загрузки через Интернет, то естественно, что для полной загрузки ролика должно пройти какое-то время. Однако по умолчанию воспроизведение начинается, как только загружен первый кадр. В некоторых случаях это может дать нежелательные задержки внутри ролика, когда компьютеру приходится ожидать загрузки следующего кадра.

Чтобы этого избежать, можно использовать оператор ifFrameLoaded. Он проверяет, загружен ли указанный кадр (можно указать метку или номер кадра), и, если это так, выполняет свой блок операторов. В этом блоке можно дать указание перейти на начало воспроизведения ролика.

Приведем пример. Откроем новый ролик, создадим какую-нибудь анимацию, но начало ее передвинем на третий кадр. Дадим этому кадру метку begin. Последнему кадру дадим метку end. Поскольку анимация начинается не в первом кадре, впишем в последний кадр код

gotoAndPlay ("begin");

для перехода из последнего кадра к началу анимации, а не к пустому первому кадру. Теперь в первом кадре напишем:

ifFrameLoaded ("end") {
   gotoAndPlay ("begin");
}

а во втором кадре:

gotoAndPlay (1);

Теперь воспроизведение анимации не начнется до тех пор, пока не загружен ее последний кадр. Действительно, в первом кадре проигрыватель Flash проверит, загружен ли кадр с меткой end. Если он еще не загружен, то блок при операторе ifFrameLoaded не выполнится и программа перейдет ко второму кадру. А во втором кадре осуществляется переход обратно на первый кадр. Таким образом, сценарии первого и второго кадров выполняются по очереди, пока не будет загружен кадр с меткой end. Тогда в первом кадре выполнится блок при операторе ifFrameLoaded, в котором задан безусловный переход на начало анимации (кадр с меткой begin).

Проверка временных параметров загрузки

Чтобы просмотреть результат, после создания ролика нажмите клавиши CTRL+ENTER и затем еще раз CTRL+ENTER. Второе нажатие комбинации клавиш CTRL+ENTER включает режим Show Streaming (Показать поток), то есть эмуляцию загрузки данных через Интернет. При этом в меню Debug (Отладка) можно выбрать желаемую скорость "загрузки". Здесь можно установить шесть различных скоростей и по очереди попробовать каждую из них. По умолчанию в программе уже установлены скорости для эмуляции загрузки! через модемы со скоростями 14.4, 28.8 и 56 Кбит/с. Выбрав пункт Customize (Настроить), можно добавить свои варианты тестовых скоростей или изменить существующие.

Если теперь добавить в первый кадр надпись "Подождите, идет загрузка...", то пользователь, загружающий ролик через Интернет, будет созерцать эту надпись, пока не загрузится последний кадр и не начнется анимация. Собственно говоря, только что мы создали простейший предзагрузчик. Предзагрузчиком называют простую анимацию, которая быстро загружается и проигрывается, "развлекая" пользователя во время ожидания загрузки основного ролика. Конечно, приведенный пример весьма примитивен. К вопросу создания более развитых предзагрузчиков мы еще вернемся в разделе 7.9.

Вопрос для самоконтроля. В приведенном примере во время ожидания загрузки последнего кадра проигрываются первые два кадра ролика. При этом надпись "Подождите...", имеющаяся в первом кадре, все время видна на экране. Почему она не "мигает", ведь во втором кадре нет никакого изображения?

Весьма интересен оператор #include. Он загружает указанный файл ActionScript, обычно для того, чтобы текущий ролик мог использовать определенные во внешнем файле функции, объекты и т. д. Этот оператор используется при экспорте файла (создании файла .SWF), а также тестировании или публикации. О файлах .SWF и публикации мы подробнее поговорим в главе 7. Оператор #include заимствован из языка C.

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

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