|
В этом уроке вы узнаете о том, как ActionScript «думает», выполняя операции сравнения. Обсуждаются также вопросы, связанные с условными инструкциями и операторами, которые обеспечивают механизм принятия решений, существующий в системе Flash. В текст урока включен также код программы, предназначенной для проверки хода загрузки фильма по сети.
Человек всегда
принимает те или иные решения, рассматривая и сравнивая несколько альтернативных
вариантов развития событий, а затем вырабатывая план действий на основе такого
сравнения. В одних обстоятельствах человек выбирает план А, в других — план
Б. Если у вас отпуск в июле, есть возможность провести его на пляже; если же
ваш отпуск приходится на январь, вряд ли вы будете рассматривать этот вариант;
более вероятно, что вы поедете на горнолыжный курорт.
Как в обычных
языках программирования, так и в языках сценариев предусмотрены структуры, позволяющие
реализовать механизм сравнений и записать ряд альтернативных вариантов действий,
и ActionScript в этом отношении не является исключением. В языке ActionScript
существуют три основные структуры условных инструкций: IF..., IF...ELSE и IF...ELSE
IF. Каждая из них служит некой вполне определенной цели и может применяться
в соответствующих ситуациях. Приведем краткую характеристику всех трех структур
с примерами их использования.
Структура
IF... предполагает исполнение единственной последовательности действий,
не имеющей альтернативы, при выполнении определенного условия. Допустим, вы
хотите сравнить значения двух переменных. Если эти значения равны, сценарий
должен перейти к определенному кадру. Другая типичная ситуация предполагает
необходимость перехода к некоторому кадру, если какое-то значение находится
в определенном интервале. Соответствующий сценарий может быть записан следующим
образом:
If (input <=10) {
gotoAndStop(10)
}
В данном
примере сценарий предписывает фильму необходимость осуществить переход к кадру
10 с последующей остановкой воспроизведения, если значение переменной input
не превышает 10. Предположим, переменная input связана с текстовым полем, в
которое пользователь вводит некоторое значение.
Когда это
значение меньше или равно 10, все понятно. Но что произойдет, если пользователь
введет число большее, чем 10? При использовании структуры IF... в этом случае
не произойдет вообще ничего. Если вы хотите, чтобы при невыполнении заданного
условия сценарий производил те или иные действия, следует добавить конструкцию
ELSE.
Как и во
многих других объектно-ориентированных языках, в ActionScript для оформления
операций, которые нужно выполнить при выполнении указанного условия, применяются
фигурные скобки ({}). В этой книге вы будете постоянно встречаться с такой нотацией,
пришедшей на смену устаревшей конструкции End If, применявшейся в сценариях
ActionScript пакета Flash 4. Вообще говоря, фигурные скобки используются для
объединения последовательности инструкций в целом ряде структур языка ActionScript.
Наряду с
пунктом If (Если) в списке Actions (Действия) в панели операций присутствует
пункт Else (Иначе). Выбирать данную конструкцию (путем двойного щелчка) следует
лишь после того, как вы вставили в текст сценария инструкцию If. На рис. 4.1
показано, что происходит, когда вы в обычном режиме работы редактора сценариев
добавляете конструкцию El se к инструкции If.
Рис.
4.1. При вставке конструкции Else создается альтернативный вариант
выполнения сценария
Вторая форма
условной инструкции в ActionScript — структура IF...ELSE — позволяет записать
в сценарии необходимость выполнить одну из двух последовательностей операций.
Предположим, сценарий должен выяснить, действительно ли значение некой переменной
меньше или равно 10. Если так, надо перейти к кадру 10; в противном случае,
то есть если значение переменной больше 10, нужно перейти к кадру 20. Следующий
сценарий реализует описанный алгоритм:
if (input <=10) {
gotoAndStop(10)
}
else {
gotoAndStop(20)
}
Данный сценарий
направляет воспроизведение фильма по одному из двух путей в зависимости от значения
переменной input. В конструкции El se структуры IF...ELSE не предусматривается
никаких дополнительных условий. Если таковые вам необходимы, следует использовать
третью структуру — IF...ELSE IF.
Если первоначальное
условие оказывается ложным, в конструкции El se также может оказаться необходимым
задать некое условие, то есть использовать инструкцию If. Рассмотрим следующее
высказывание:
«Если
солнечно, мы пойдем в парк, но если идет дождь и в кинотеатре показывают фильм
„Слизняк из космоса", то мы пойдем в кино».
Здесь мы
имеем дело с двумя условиями: «если солнечно» и «если идет
дождь и в кинотеатре показывают фильм "Слизняк из космоса"».
Но если первое условие выполняется, второе не играет никакой роли, потому что
сценарий должен просто обойти его стороной. Давайте запишем все это на языке
Action-Script, предполагая, что у нас есть кадры с именами Park (парк) и Movies
(кинотеатр), а также переменные SI ug (слизняк) и weather (погода). Переменная
weather связана с текстовым полем, в котором пользователь вводит сведения о
погоде.
Slug=new Boolean(
);
Slug=true;
if (weather
== "sunny") {
gotoAndStop ("Park");
}
else if (Slug
== true) {
gotoAndStop
("Movies"); }
Прежде всего
в этом сценарии создается логический объект с именем Slug, которому присваивается
значение логической константы true. (Как вы помните, логические значения представляются
константами true и false, 0 и 1 либо Yes и No.) Затем мы обнаруживаем первую
инструкцию If. В пакете Flash 4 для записи соответствующего условия нам пришлось
бы применить специальный оператор сравнения для строк eq, чтобы система ActionScript
смогла отличить его от оператора равенства для чисел (=), так как слово «sunny»
(солнечно) присутствует в тексте сценария в виде строковой константы. Однако
в версии Flash 5 оператор, состоящий из двух знаков равенства (==), можно применять
при сравнении как строк, так и чисел. Если указанное условие верно (на улице
действительно солнечно), данный сценарий переходит к кадру Park и его воспроизведение
на этом останавливается. Если же погода не является солнечной, в сценарии сначала
осуществляется проверка истинностного значения переменной Slug, соответствующего
факту показа вышеназванного фильма,
а затем, если этот фильм действительно идет в кинотеатре, сценарий отправляется
к кадру Movies и воспроизведение фильма останавливается.
Попытайтесь
самостоятельно создать описанный фильм.
Пример
фильма. Использование конструкции IF...ELSE IF
Фильм, который
мы разберем в данном разделе, демонстрирует механизм работы различных условных
конструкций. (Готовый фильм вы найдете в файле IfElself.fla на прилагаемом к
книге компакт-диске.) В фильме присутствуют три слоя:
На рис. 4.2
показана структура слоев нашего фильма, а также вид начального кадра и текст
сценария, определенного для кнопки. Во всех ключевых кадрах слоя Announce (Объявление)
содержатся различные объявления. Сценарий обработки условий находится в слое
IF ELSE IF. Текстовое поле для редактирования, используемое для ввода данных,
и кнопка относятся к слою Input (Ввод). Установите размер рабочей зоны фильма,
равный 300x350 пикселов, выполнив команду Modify > Movie (Модифицировать
> Фильм) и задав новые значения ширины и высоты рабочей зоны.
Рис.
4.2. Начальная страница, слои, кадры. Единственный сценарий, находящийся
вне кадров, — это сценарий символа кнопки, открытый в панели Object Actions
Слой Announce
В слое Announce
(Объявление) требуется ввести различный текст объявлений для всех ключевых кадров.
Сделайте кадры 8 и 20 ключевыми с помощью команды Insert > Keyframe (Вставка
> Ключевой кадр) либо нажатием клавиши F6. Только после определения
ключевых кадров можно набирать текст в рабочей зоне.
Слой IF
ELSE IF
Слой IF ELSE
IF включает в себя все сценарии ActionScript, определяемые для кадров. Единственный
сценарий, который находится за пределами этого слоя, — это сценарий кнопки.
stop();
Slug=new Boolean( );
Slug=true;
if (weather == "sunny")
{
gotoAndStop ("Park"):
} else if (Slug == true) {
gotoAndStop ("Movies");
}
Слой Input
В слое Input
(Ввод) присутствуют два разнотипных элемента, обеспечивающих ввод данных пользователем,
— это текстовое поле для редактирования, в котором пользователь вводит «прогноз
погоды», и кнопка, позволяющая возобновить воспроизведение фильма после
остановки в каком-либо кадре. В табл. 4.1 вы найдете данные, которые следует
использовать при создании текстового поля.
Таблица
4.1. Свойства текстового поля и имя переменной
Имя переменной |
Флажок Border/Bg |
Способ выравнивания |
||
Output |
Установлен |
По центру |
||
Чтобы создать
кнопку Go (Запустить), выберите соответствующую форму и разместите кнопку в
рабочей зоне; выделите изображение кнопки и выполните команду Insert > Convert
To Symbol (Вставка > Преобразовать в символ) либо нажмите клавишу
F8. Выделите кнопку и введите средствами редактора сценариев ActionScript приведенный
ниже текст. Когда вы выделяете кнопку и приступаете к вводу сценария, редактор
автоматически добавляет необходимый обработчик события.
on(release) {
play();
}
Этот фильм
был задуман как иллюстрация к инструкциям If и If...Else. Если пользователь
сообщает программе о том, что погода солнечная, то фильм отправляется «в
парк». Если после этого пользователь цовторно щелкнет на кнопке Go (Запустить),
сценарий продемонстрирует оставшуюся часть фильма и остановится в кадре 1. А
нельзя ли сделать так, чтобы фильм всегда сразу возвращался к началу, обходя
кадр с меткой Movies (Кинотеатр)? (Подсказка: используйте здесь кадр 11.)
Чтобы по-настоящему
узнать и научиться применять в сценариях все возможности условных конструкций,
вы должны хорошо разобраться в операторах языка ActionScript. Если вы знакомы
с другими языками сценариев или обычными языками программирования, большинство
операторов ActionScript покажутся вам знакомыми. Впрочем, опытные программисты
наверняка обратят внимание на тот факт, что для чисел и строк в ActionScript
применяются разные операторы. Однако эти различия будут для вас существенными
лишь в том случае, если вы хотите, чтобы ваши сценарии работали в проигрывателях
фильмов Flash 4. В табл. 4.2 приводится список операторов ActionScript.
Таблица
4.2. Операторы языка ActionScript
Оператор |
Назначение |
Числовые операторы | |
+ |
Сложение (и конкатенация) |
- | Вычитание |
* | Умножение |
/ | Деление |
% | Деление по модулю |
++ | Инкремент |
-- | Декремент |
Оператор |
Назначение |
||
Операторы сравнения |
|||
< | Меньше | ||
> | Больше | ||
<= | Не больше | ||
>= | Не меньше | ||
Логические операторы | |||
&& | Конъюнкция | ||
|| | Дизъюнкция | ||
! | Отрицание | ||
Операторы сравнения и присваивания | |||
= | Равно | ||
!= | Неравно | ||
= | Присваивание | ||
+= | Присваивание с приращением | ||
-= | Присваивание с уменьшением | ||
*= | Присваивание с умножением | ||
%= | Присваивание с делением по модулю | ||
/= | Присваивание с делением | ||
Прочие операторы | |||
() | Параметры функции | ||
. | Элемент структуры (оператор «точка») | ||
[] | Элемент массива |
Следующие
две категории операторов (табл. 4.3) вы можете пропустить, если не собираетесь
создавать средствами пакета Flash 5 фильмы в формате Flash 4 и не намереваетесь
связываться с двоичной математикой. Многие замечательные программисты прекрасно
обходятся без двоичной математики. Если же она вам все-таки настоятельно необходима,
вам придется поискать дополнительные книги по программированию и двоичным числам,
чтобы уяснить назначение поразрядных операторов, которыми так богат язык ActionScript,
и научиться правильно пользоваться ими.
Таблица
4.3. Строковые и поразрядные операторы, необходимые для фильмов,
которые должны работать в системе Flash 4
Оператор |
Назначение |
Строковые операторы |
|
"" |
Границы строки |
add |
Конкатенация |
Eq |
Равно |
ne |
Не равно |
It |
Меньше |
gt |
Больше |
le |
Не больше |
ge |
Не меньше |
Поразрядные операторы |
|
& |
Поразрядная
конъюнкция |
| |
Поразрядная
дизъюнкция |
Оператор |
Назначение |
^ |
Поразрядная исключительная дизъюнкция |
~ | Поразрядное отрицание |
<< | Сдвиг влево |
>> | Сдвиг вправо |
>>> | Сдвиг вправо с нулевым символом-заполнителем |
<<= | Присваивание с поразрядным сдвигом влево |
>>= | Присваивание с поразрядным сдвигом вправо |
>>>= | Присваивание с поразрядным сдвигом вправо, с нулевым символом-заполнителем |
^= | Присваивание с поразрядной исключительной дизъюнкцией |
| = | Присваивание
с поразрядной дизъюнкцией |
&= | Присваивание с поразрядной конъюнкцией |
Для начинающих
программистов важно изучить приоритет операторов. Приоритет соотносится
с порядком выполнения операторов в программе. Рассмотрим, к примеру, следующее
выражение:
output = 2 +
2 * (2*4)
В зависимости
от приоритета результат вычислений может быть различным. Если сначала сложить
2 и 2, получив 4. а затем умножить это число на 8 (дважды четыре), мы получим
32. Но если сначала умножить 2 на 4. получив 8, затем это число умножить на
2 (получится 16) и только после этого прибавить 2, выйдет 18. Каким же в данном
случае будет результат вычислений в системе Flash? Это будет число 18.
Первое правило,
которое вам нужно запомнить: сначала выполняются все арифметические операторы,
заключенные в скобки, начиная с самой внутренней пары скобок. После этого выполняются
операторы умножения и деления; наконец, производится сложение и вычитание. Если
какие-либо два оператора обладают одинаковым приоритетом, эти операторы выполняются
в линейном порядке — слева направо. Но важно отметить, что, прежде чем приступить
к вычислениям, система Flash выясняет тип обрабатываемых данных (числовой или
строковый), а также определяет знак числовых данных (положительные они или отрицательные).
В отличие от чисел и операторов строковые константы всегда заключаются в кавычки
("").
Выполним
рассматриваемые вычисления в несколько действий.
Для изменения
приоритета применяются скобки. Так, если вы хотите, чтобы в нашем примере сначала
складывались 2 и 2, следует написать так: output = (2 + 2) * (2*4) Теперь вместо
18 мы получим 32.
Таблица
приоритетов
В табл. 4.4
приводится список приоритетов в порядке их убывания. В списке отсутствуют устаревшие
строковые операторы Flash 4. а также двоичные операторы системы Flash 5. Ассоциативность
представлена аббревиатурами вида ЛП (слева направо) и ПЛ (справа налево).
Таблица
4.4. Таблица приоритетов
Оператор |
Описание |
Ассоциативность |
||
+ |
Положительное
число |
ПЛ |
||
- |
Отрицательное
число |
ПЛ |
||
! |
Логическое отрицание |
ПЛ |
||
++ |
Постфиксный
инкремент |
ЛП |
||
-- |
Постфиксный
декремент |
ЛП |
||
() |
Параметр функции |
ЛП |
||
[] |
Элемент массива |
ЛП |
||
.. |
Элемент структуры |
ЛП |
||
++ |
Префиксный инкремент |
ПЛ |
||
-- |
Префиксный декремент |
ПЛ |
||
new |
Размещение объекта |
ПЛ |
||
delete |
Уничтожение
объекта |
ПЛ |
||
typeof |
Тип объекта |
ПЛ |
||
* |
Умножение |
ЛП |
||
/ |
Деление |
ЛП |
||
* |
Деление по модулю |
ЛП |
||
+ |
Сложение |
ЛП |
||
add |
Конкатенация
строк |
ЛП |
||
- |
Вычитание |
ЛП |
||
< |
Меньше |
ЛП |
||
<= |
Не больше |
ЛП |
||
> |
Больше |
ЛП |
||
>== |
Не меньше |
ЛП |
||
== |
Равно |
ЛП |
||
!= |
Не равно |
ЛП |
||
&& |
Логическая конъюнкция |
ЛП |
||
|| |
Логическая дизъюнкция |
ЛП |
||
?: |
Условие |
ПЛ |
||
= |
Присваивание |
ПЛ |
||
Все |
Все составные
операторы присваивания |
ПЛ |
||
Практикум
Чтобы лучше
разобраться в приоритетах операторов, лучше всего создать тестовую программу,
включающую в себя единственный кадр, и потренироваться, вводя различные выражения.
Процесс создания такого тестового фильма может выглядеть примерно так
output = 3 *
8 / (4 + 2)
output = (3
/ 2) * -4 /2
output = (2*3)/
((4 + 3) + (6 / 3))
output = (8
/ (-4 -2) * (12 / 3))
output = (18
/ 3) + -4 * (2 * 9 -3)
Применение
числовых операторов обычно вызывает меньше всего затруднений, поскольку они
действуют так же, как их математические аналоги. Просто вместо 5x3 вы должны
писать 5*3. Кроме этого, необходимо запомнить приоритет операторов в ActionScript.
Операторы
сравнения для чисел, такие как > и <, могут поначалу показаться необычными
для людей, не имеющих опыта программирования, но и здесь все довольно просто.
Как вы уже знаете по уроку 2, логические выражения могут принимать лишь два
значения. На выходе операторов сравнения могут быть лишь две константы — 0 или
1 (они же True и False; они же Yes и No). Некоторые затруднения может вызвать
лишь ситуация, когда при сравнении речь идет о широком диапазоне значений. Рассмотрим,
например, следующую инструкцию:
if (current>=7)
{
gotoAndStop
("FinishLine"); }
Здесь при
сравнении проверяется, действительно ли переменная current имеет значение не
меньшее, чем константа 7. Этому условию удовлетворяет любое число, большее или
равное 7.
Чтобы разобраться
в механизме работы строковых операторов, можно представить себе алфавит в виде
упорядоченного множества. Если предположить, что буква А соответствует числу
1, а буква Z — числу 26, то понятно, что буква L оказывается больше буквы G.
Higher = "Steeple";
Lower = "Basement";
if (Higher>Lower)
{
output = "Верно";
}
Приведенная
выше инструкция доказывает, что слово Steeple (Шпиль) больше, чем слово Basement
(Подвал). Обратите внимание, что имена переменных
Higher (выше) и Lower (ниже) не принимаются в рассмотрение при сравнении их
значений. Для инструкции If здесь существенны лишь значения переменных,
но не их имена. Заметьте также, что строковые константы всегда заключаются в
кавычки и этим отличаются от имен переменных.
Логические
операторы можно представить себе в виде средства, позволяющего выбрать одно
и только одно из двух предлагаемых блюд. Мама спрашивает: «Ты будешь мороженое
или торт?» Ребенок говорит: «И мороженое, и торт». Но строгая
мама отвечает: «Ты можешь выбрать ИЛИ мороженое, ИЛИ торт. Но НЕ то и
другое одновременно». Рассмотрим следующий пример сценария:
IC = "мороженое";
С = "торт";
if ((IC == "мороженое")
&& (С=="пирог")) {
output = "Как бы не так!";
} else If ((IC
== "мороженое") || (С == "пирог")) {
output = "Бери!";
}
В начале
этого сценария устанавливаются значения двух строковых переменных. После этого
проверяется условие, согласно которому значение первой переменной равно одной
строковой константе, а значение второй переменной совпадает с другой строковой
константой. Из текста сценария видно, что переменная С имеет значение "торт",
а не "пирог". Это значит, что, хотя первая часть условия истинна,
вторая ложна, то есть все условие также оказывается ложным. Таким образом, сценарий
проходит мимо инструкции output = "Вот еще!";. Однако при проверке
второго условия (в конструкции else if) достаточно, чтобы хотя бы одна из его
частей была истинной. Поскольку первая часть верна, на выходе мы получаем строку
"Бери!".
Формат оператора логического отрицания (!) выглядит иначе.
else if (! ((1C
== "мороженое") && (С == "пирог")))
Это выражение
будет истинным тогда и только тогда, когда выражение, объ-•единенное конъюнкцией
(&&), НЕ будет верным. Помните маму, которая сказала «Но НЕ то
и другое одновременно»? Именно для записи подобных высказываний и нужен
оператор отрицания. Логическое отрицание оказывается удобным в тех случаях,
когда вы не хотите, чтобы несколько условий выполнялись одновременно.
Составные операторы присваивания
В фильмах Flash довольно часто возникает необходимость увеличить значение переменной на определенную величину.
count=count
+ 1
Это выражение
увеличивает значение переменной count на единицу. Для подобных инструкций существует
сокращенная форма записи, которая носит название
«составной оператор присваивания», позволяющая выполнить определенные
вычисления и произвести присваивание одновременно. Приведенную выше строку можно
записать в следующем виде:
count += 1
Аналогичные
операторы существуют для вычитания, умножения, деления и деления
по модулю. Например, следующая строка сценария обеспечивает уменьшения
значения переменной demote на 2:
demote -= 2
Значение
переменной rabbit становится больше в 4 раза:
rabbit *= 4
Использовать
или нет составные операторы присваивания — дело вкуса; они носят
дополнительный характер. Без них вполне можно обойтись. Применяйте их,
если они кажутся вам удобными.
Составные
операторы присваивания доступны только в экспертном режиме редак-тора сценариев
ActionScript.
Пример фильма. Проверка факта загрузки
Рассматриваемый
в этом разделе пример фильма вы найдете на компакт-диске в файле preload.fla.
Один из ключевых вопросов, которые следует учитывать при создании фильмов для
Интернета, — это время загрузки. Время загрузки информации по обычному модему
может оказаться в 20, а то и в 100 раз больше значения этого параметра при использовании
специальных каналов или кабельного модема. Прежде чем фильм сможет начать воспроизводиться,
необходимо произвести загрузку всего фильма или хотя бы определенной его части.
Сценарий, который проверяет факт завершения загрузки, в простейшем случае должен
ориентироваться на факт передачи последнего кадра фильма (или того кадра, получение
которого вы как создатель фильма сочтете достаточным для начала воспроизведения).
Чтобы написать такой сценарий, можно использовать особую условную функцию Flash
— ifFrameLoaded(). Наш фильм состоит из двух слоев:
Загрузчик
выполняет две основные функции. Во-первых, он используется для загрузки «тяжелых»
материалов, таких как музыка и графическая информация. Во-вторых, он сообщает
зрителю о том, что загрузка еще не завершена и тому следует просто подождать;
с его компьютером, модемом и подключением к Интернету все в порядке. На рис.
4.3 изображен начальный экран фильма; с этим экраном пользователь имеет дело
в процессе загрузки. Кроме того, на рисунке присутствует структура слоев и открытое
окно Library (Библиотека), в котором отражены загружаемые компоненты.
Рис.
4.3. Загрузчик обеспечивает пересылку компонентов фильма, необходимых
для его качественного воспроизведения, и информирует зрителя о том, что загрузка
еще не завершена
Все сценарии
в данном фильме находятся в слое Scripts (Сценарии) в двух ключевых кадрах.
Обратите внимание на то, что в фильме всего 10 кадров; важно заметить также,
что в окне Library (Библиотека) отражаются сведения о необходимости загрузки
определенной графической информации.
IfFrameLoaded
(10) {
gotoAndStop ("RollEm");
}
gotoAndPlay ("Loaded?");
Кроме того, с помощью
инструмента Text (Текст) в рабочую зону добавлено сообщение Loading... (Загрузка).
Для больших фильмов рекомендуется включать в начальную страницу небольшой
клип или иным способом скрашивать зрителю ожидание.
Слой Heavy
Load (Тяжелый груз) — второй слой фильма — содержит всю информацию, которая
тяжелым грузом ложится на пропускную способность линий связи и загрузка которой
требует много времени. Окно Library (Библиотека) на рис. 4.3 содержит список
загружаемых графических изображений и символов. Кадры 3-5 включают в себя символы
графики. Все эти кадры необходимо загрузить до начала воспроизведения фильма;
они должны быть готовы к демонстрации. В кадре 6 находится пустой ключевой кадр,
предотвращающий «просачивание» в основной фильм изображений из предыдущих
кадров.
В режиме
тестирования фильма все его компоненты загружаются так быстро, что не удается
составить себе представление о том, как процесс загрузки будет выглядеть с точки
зрения пользователя, располагающего медленным модемом. Чтобы моделировать различные
параметры модемного соединения, следует воспользоваться командами View >
Bandwidth Profiler (Вид > Профилировщик полосы пропускания), View
> Show Streaming (Вид > Показать ход пересылки) и View > Streaming
Graph (Вид > Граф пересылки). Эти команды появляются в меню Flash
в режиме тестирования. Имеет смысл выполнить также команду Debug > 28.8 (2.3
KB/s) (Отладка > 28.8 (2.3 KB/s)), чтобы моделировать относительно
медленный модем. На рис. 4.4 показано, как будет выглядеть рассматриваемый фильм
после загрузки всех графических данных.
Проект. Реакция на различные входные данные
Через механизм
условных инструкций система ActionScript может получать от пользователя несколько
вариантов входных данных, адекватно реагируя на каждый из них. В рассматриваемом
в данном разделе фильме (файл condQuiz.fla на компакт-диске) вы увидите, как
сценарии, определенные для четырех кнопок, используются для установки значения
одной переменной. Пятая кнопка служит для оценки полученного значения и выдачи
одного из четырех возможных ответов. Это весьма полезная программа, так как
она моделирует ситуацию, когда в одном сценарии кнопки присутствует несколько
вариантов реакции на действия пользователя.
Рис.
4.4. Работа со средствами моделирования и анализа хода пересылки
данных. Эти средства позволяют увидеть, как долго будет загружаться фильм
Создайте три слоя:
Данный проект
задуман прежде всего как способ продемонстрировать применение в фильмах нескольких
конструкций If...Else If. В таком фильме бывает достаточно создать один кадр,
потому что все сценарии размещаются в кнопках. На рис. 4.5 изображен начальный
вид рабочей зоны и структура слоев.
Слой Background
(Фон) представляет собой основу для размещения окон и кнопок. Этот слой содержит
красный прямоугольник на желтом фоне. Прямоугольник является платформой, на
которой располагаются окно вопросов в верхней части рабочей зоны и такое же
окно ответов в нижней ее части. Кнопки находятся посередине между этими окнами.
Слой Question
(Вопрос) включает в себя текст (не редактируемое текстовое поле, а просто надпись),
который располагается в верхней части окна вопросов. Выделение особого слоя
для представления вопроса позволяет при необходимости легко заменить один вопрос
другим.
Рис.
4.5. Четыре кнопки выбора вариантов и кнопка ответа позволяют продемонстрировать
механизм неоднозначной реакции
В слое Buttons
(Кнопки) сосредоточена вся обработка сценариев. Кнопки содержат сценарии, обеспечивающие
установку значения некой переменной и вывод соответствующего сообщения в текстовом
поле через переменную response. Все четыре входные кнопки логически связаны
с разными ответами на поставленный вопрос; ответы условно обозначены на самих
кнопках обычными текстовыми символами. Для входных кнопок предусмотрено изменение
их внешнего вида в зависимости от действий пользователя. Такого эффекта легко
достичь в режиме редактирования символов. Пятая кнопка — с меткой Ans (Ответ)
— статична, это подчеркивает ее особый статус.
Все кнопки,
предназначенные для ввода данных, содержат сценарии, изменяющие значение переменной
answer, используемой для представления ответа. Выбор значений может быть произвольным;
поэтому кнопки просто пронумерованы (от 1 до 4).
on (release) {
answer = 1;
}
on (release) {
answer = 2; }
Кнопка
+ — экземпляр символа кнопки Choice
on (release) {
answer = 3; }
on (release) {
answer = 4: }
on (release) {
If (answer == 3) {
response = "That's exactly right."; }
else if (answer == 1)
{
response = "No. > compares 'greater than.'"; }
else if (answer == 2) {
response = "No. the <= operator compares 'less than and equal" +chr(13)+ "to' between values."; }
else if (answer == 4) { response = "No, parentheses are for reordering precedence.";
}
}
Верный ответ
— знак «плюс» (+). Когда пользователь щелкает на кнопке с изображением
плюса, значение переменной answer устанавливается равным 3. Сценарий выводит
соответствующую строку в текстовом поле, задавая значение переменной response,
и пользователь видит, что дал правильный ответ. Поскольку три других варианта
являются ошибочными, необходимо использовать структуру вида IF...ELSE IF. Если
ответ неверен, сценарий перебирает все возможные значения переменной answer,
чтобы определить, какое сообщение следует выдать на экран.
Параметры
текстового поля для рассматриваемого примера представлены в табл. 4.5.
Поскольку
пространство над кнопками ограниченно, наш макет не позволяет использовать более
длинные сообщения. Уменьшив размер кнопок и разместив текст сообщения под ними,
вы можете легко модифицировать фильм, определив другой набор вариантов с соответствующими
краткими пояснениями. На рис. 4.6 показано, как выглядит экран фильма при выборе
одного из неверных вариантов.
Таблица
4.5. Свойства текстового поля и имя переменной
Имя переменной |
Флажок Border/
Bg |
Способ выравнивания |
||
response |
Снят |
По центру |
||
Рис.
4.6. Щелкнув сначала на одной из кнопок выбора вариантов ответа,
а затем на кнопке Ans, пользователь немедленно получает от
фильма соответствующие разъяснения
Проект. Игра с крылатыми выражениями
В предыдущем
разделе мы рассмотрели один из возможных способов организовать механизм адекватной
реакции на различные действия пользователя. В рассмотренном примере использовалось
несколько связанных структур вида IF...ELSE IF. Образец фильма, который мы обсудим
в настоящем разделе, построен в форме игры с крылатыми выражениями. Зритель
видит на экране цитату и должен щелкнуть на расположенной рядом кнопке с именем
человека, которого он считает автором предъявленной фразы. В фильме присутствует
ряд кадров и кнопок, которые обмениваются друг с другом информацией через различные
переменные. Во всех таких кадрах устанавливается значение особой переменной,
представляющей ответ пользователя, и сценарии кнопок сравнивают ее значение
с эталонными. Если значения совпадают, ответ счи-
тается правильным.
Сценарий увеличивает сумму набранных пользователем очков, сообщает пользователю
о том, что тот дал верный ответ, а затем воспроизведение фильма приостанавливается
до щелчка на кнопке запроса следующей цитаты. На рис. 4.7 можно видеть описанный
фильм в рабочей зоне.
Рис.
4.7. Кнопки, надписи и текстовое поле в игре с крылатыми выражениями
СОВЕТ
СОВЕТ
ПО ОРГАНИЗАЦИИ СЦЕНАРИЕВ. Разработчики фильмов Flash применяют различные стратегии
организации объектов и сценариев фильма. Некоторые предпочитают размещать все
сценарии в одном слое. Это неплохой подход, так как он облегчает задачу нахождения
нужных сценариев. Многие пользуются другой, хотя и похожей на описанную выше,
стратегией, когда сценарии кадров располагаются в одном слое, а кнопки и их
сценарии — в другом. Автору больше нравится именно такой подход. Кадры в киноленте
воспроизводятся последовательно (разумеется, если в сценарии отсутствуют явные
переходы к определенным кадрам). В такой ситуации размещение всех сценариев
кадров в одном слое облегчает их отладку, так как сценарии кадров выполняются
последовательно, как блоки обычной программы. Однако сценарии, включенные в
кнопки, выпадают из общей последовательности, заданной кинолентой, поскольку
активизируются в зависимости от действий пользователя. Следовательно, вполне
логично выделить для сценариев кнопок отдельный слой.
Фильм, в
котором реализована описанная выше игра с крылатыми выражениями, вы можете найти
в файле Quotes.fla на компакт-диске. В этом фильме представлен один из способов
организации викторины с предлагаемыми пользователю вариантами ответов.
В нашем фильме
должно быть три слоя:
В первую
очередь необходимо позаботиться о фоне и заголовке.
Затем нужно
разместить в рабочей зоне символы и их экземпляры.
Слой Quotes
(Цитаты) содержит все сценарии кадров. Эти сценарии отличаются друг от друга
лишь двумя ключевыми значениями: цитатой, которая отображается в окне, и значением,
присваиваемым переменной, отражающей ответ пользователя (в качестве присваемого
значения использованы инициалы автора соответствующей цитаты).
Сценарий
кадра 1
В первом
кадре сумма очков, набранных пользователем, обнуляется, чтобы он мог начать
игру с самого начала.
score = 0
Сценарий
кадра 3
Следующие
семь кадров отличаются друг от друга лишь цитатами. Для длинных цитат может
понадобиться «перевод строки». Оператор конкатенации (+) позволяет
соединить код «возврата каретки» — chr(13) — с предыдущей и следующей
строками текста.
output = "It isn't pollution that's harming the environment."+
chr(13)+"It's the impurities in our air and water that are doing it."; answer = "dq";
stop ();
Сценарий
кадра 4
output = "As flies to wanton boys, are we to the gods;" +
chr(13) + "They kill us for their sport.";
answer = "ws";
stop ():
Сценарий
кадра 5
output - "There
is no sin except stupidity.";
answer = "ow";
stop ():
Сценарий
кадра 6
output = "If Hitler were to invade Hell. I would find occasion" +
chr(13) + "to make a favorable reference to the devil.";
answer = "we";
stop ();
Сценарий
кадра 7
output = "This is not a novel to be tossed aside lightly. " +
chr(13) + "It should be thrown with great force.";
answer = "dp":
stop ();
Сценарий
кадра 8
output = "The most beautiful thing we can experience is the " +
chr(13) + "mysterious. It is the source of all true art
and science.";
answer = "ae";
stop ();
Сценарий
кадра 9
output = "A single death is a tragedy." + chr(13) + "A million
deaths is a statistic.";
answer = "js";
stop ();
Сценарий
кадра 11
Сценарий
в кадре ведения счета делит значение переменной score на общее число вопросов,
умножает на 100 и преобразует результат в целое число с помощью функции into.
Оператор конкатенации (+) применяется для присоединения символа процента (%)
к строке, содержащей значение текущего счета.
output = "Your final score is" + int((score /7) *100) + "%.";
stop ():
Слой Buttons
(Кнопки) содержит все кнопки и их сценарии.
Сценарий
для экземпляра символа Select
on (release)
{
if (answer == "dp") {
score +=1;
output = "You
got it!"; } else {
output = "Sorry,
that was someone else's quotation.";
}
Другие
шесть экземпляров символа Select
Еще для шести
кнопок также следует использовать приведенный выше сценарий, подставляя во второй
строке (if (answer = "dp")) вместо строки dp следующие инициалы:
Экземпляр
символа Next
Эта кнопка
передает управление следующему кадру игры.
on (release)
{
play (); }
Текстовое
поле Output
Создайте
текстовое поле шириной 355 пикселов и высотой 50 пикселов непосредственно под
надписью, представляющей заголовок экрана. Для задания точных размеров воспользуйтесь
средствами панели Info (Информация). Выберите для этого текстового поля шрифт
Anal или Helvetica размером 14 пунктов. Здесь будут выводиться все цитаты, сообщения,
представляющие реакцию фильма на действия пользователя, и окончательный счет
игры. В табл. 4.6 вы найдете данные, которые следует использовать при создании
текстового поля.
Таблица
4.6. Свойства текстового поля и имя переменной
Имя переменной |
Флажок Border/Bg |
Способ выравнивания |
||
Output |
Снят |
По левому краю |
||
Готовую программу
можно использовать как в проигрывателе Flash на вашем компьютере, так и в Web.
На рис. 4.8 представлен внешний вид игры в окне браузера Microsoft Internet
Explorer. Обратите внимание на представление цитаты — она выполнена тем же шрифтом,
что и надписи рядом с кнопками.
Рис.
4.8. Фильм в формате Flash, воспроизводимый в Web-браузере, обеспечивает
интерактивное взаимодействие с пользователем
В этом уроке
мы научились...