Условная логика – важнейший компонент
интерактивных приложений. Именно на этом
основано "разумное" поведение программ – та или
иная реакция в зависимости от перемещения или
положения указателя мыши, текущего дня недели,
многих других динамических условий, возникающих
в процессе воспроизведения фильма. С помощью
условной логики вы сможете перейти от простого
линейного воспроизведения презентаций и анимаций
к динамическим проектам, поведение которых будет
зависеть и от пользователя, и от разных внешних
обстоятельств.
В
этом уроке мы познакомим вас со способами
применения логических условий, рассмотрим приемы,
с помощью которых можно заставить фильм
реагировать на обстоятельства.
Внимание! Для
работы с этим уроком необходимы учебные
файлы, которые Вы можете загрузить
здесь.
Успешный
запуск ракеты зависит от многих
обстоятельств. Проект этого урока
продемонстрирует вам некоторые принципы и
приемы использования условной логики.
Управление
последовательностью выполнения скриптов
Обычно скрипты выполняются по порядку, строка за
строкой, от начала до конца. С помощью условной
логики можно управлять скриптами, разрешая
выполнять определенные действия только в том
случае, если выполняется некоторое условие.
Таким образом, ваши фильмы смогут "жить своей
жизнью", принимая решения и реагируя в
зависимости от обстоятельств. Для реализации в
скриптах условной логики служат условные
операторы.
Оператор if.
Ядром всей условной логики в ActionScript
является конструкция "если – то", реализуемая (в
различных вариациях) оператором
if. Давайте
рассмотрим такой пример:
if (moneySaved > 500)
{
buyStuff();
}
// дальнейшие действия…
В этом скрипте функция
buyStuff()
вызывается, только если переменная
moneySaved имеет
значение, большее 500. Если значение
moneySaved меньше
или равно 500, вызов функции
buyStuff()
игнорируется и выполнение скрипта продолжается
действиями, следующими за оператором
if.
В
приведенной конструкции условный оператор
проверяет, выполняется ли условие (то, что
заключено в круглые скобки). Если выражение в
скобках дает результат
true (истинно), действия в теле оператора
(внутри фигурных скобок) выполняются, если
false (ложно) –
они игнорируются. В общем, синтаксис условного
оператора расшифровывается так:
if (это – истина) {
Делать это;
}
Как
и в реальной жизни, порой оператор
if, прежде чем
предпринять действие или набор действий, должен
проверять сразу несколько условий. Вот пример.
if (moneySaved > 500
&& billsPaid == true) {
buyStuff();
}
Здесь в выражении условия появился еще оператор
И (&&), так что
функция buyStuff()
будет вызвана только в том случае, если
переменная moneySaved
имеет значение, большее 500 и
billsPaid равно
true. Если хотя бы
одно из этих утверждений ложно, вызов
buyStuff()
игнорируется. Другой вариант конструкции из двух
условий связан с применением оператора ИЛИ (||).
Вот пример:
if (moneySaved > 500
|| wonLottery == true) {
buyStuff();
}
Здесь функция buyStuff()
будет вызвана в том случае, если переменная
moneySaved больше
500 или wonLottery
имеет значение true,
то есть требуется выполнение хотя бы одного из
двух утверждений.
Эти
операторы можно применять вместе, создавая
изощренные условные выражения вроде этого:
if (moneySaved > 500
&& billsPaid == true || wonLottery == true)
{
buyStuff();
}
В
этом скрипте функция
buyStuff() будет вызвана в том случае,
если переменная
moneySaved больше 500 и
billsPaid равно
true, или если
wonLottery имеет
значение true.
Далее приведен общий список операторов (их
называют операторами сравнения), применяемых при
построении логических выражений, с кратким
описанием и примерами.
Оператор |
Описание |
Пример |
== |
Проверка на равенство |
if (name == "Derek")
означает: "Если значение name точно
равно Derek,
выполнить… |
!= |
Проверка на неравенство |
if (name != "Derek")
означает: "Если значение name иное,
чем Derek,
выполнить… |
< |
Меньше, чем… |
if (age < 30)
означает: "Если значение
age
меньше 30, выполнить… |
> |
Больше, чем… |
if (age > 30)
означает: "Если значение
age
больше 30, выполнить… |
<= |
Меньше или равно |
if (age <= 30)
означает: "Если значение
age
меньше или равно 30, выполнить… |
>= |
Больше или равно |
if (age >= 30)
означает: "Если значение
age
больше или равно 30, выполнить… |
&& |
Логическое И |
if (day == "Friday"
&& pmTime > 5)
означает: "Если
day
имеет значение
Friday,
а значение
pmTime больше 5, выполнить… |
|| |
Логическое ИЛИ |
if (day == "Saturday"
|| day == "Sunday")
означает: "Если
day
имеет значение
Saturday
или Sunday,
выполнить… |
Совет
Распространенная ошибка – при проверке на
равенство ставить одиночный знак (=)
вместо сдвоенного (==).
Помните, что одиночный знак равенства обозначает
оператор присвоения (например,
money = 300 – "присвоить
переменной money значение 300"). Сдвоенный знак
равенства (money == 300)
обозначает оператор сравнения, он ничего не
присваивает, а лишь проверяет, равны ли значения
слева и справа от него.
Совет
Со сравнением чисел все просто – в конце концов,
каждый понимает, что 50 меньше 100, другое дело
– сравнение текстовых значений. Строка "Derek"
отнюдь не равна строке "derek", хотя, казалось
бы, слово одно и то же. В текстовых значениях
буква A, например, "меньше", чем буква Z, и все
заглавные буквы "меньше", чем строчные.
Латинская буква A имеет внутреннее представление
(числовой код) 1, а буква z – 52 (ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz).
Оператор
if/else if
Оператор if/else if
("если/иначе, если") схож с базовым оператором
if, который мы
только что обсуждали, но отличается тем, что
позволяет задать несколько условий с разной
реакцией на них. Рассмотрим пример:
if (money > 500) {
buyTV("35 inch");
} else if (money > 300) {
buyTV("35 inch");
}
Данный скрипт выполняет различные действия в
зависимости от значения переменной money. Если
ее значение больше 500, вызывается функция
buyTV() со
значением аргумента "35
inch". Если money
меньше 500, эта часть игнорируется и проверяется
следующее условие: если значение
money больше 300,
функция вызывается buyTV()
со значением аргумента "27 inch". Таким образом,
если бы переменная money имела значение 450, то
первая секция оператора была бы проигнорирована
(450 не больше, чем 500), но вторая секция была
бы выполнена (поскольку 450 больше, чем 300).
Если же значение money
меньше 300, то обе секции будут проигнорированы.
Оператор if/else if
может содержать (при необходимости) много секций,
реагируя на десятки различных условий.
Оператор
if/else
Оператор if/else
("если/иначе") позволяет запрограммировать
действия, которые должны выполняться, если ни
одно из заданных в операторе условий не
выполняется. Возьмем такой пример:
if (money > 500) {
buyTV("35 inch");
} else if (money > 300) {
buyTV("35 inch");
} else {
workOvertime ();
}
В
этом скрипте, если money имеет значение меньше
300, и, стало быть, не удовлетворяет ни одному
из условий, вступает в действие секция
else – если
перевести синтаксис на русский язык, получится
следующее:
если (это верно) {
// выполнить это
} иначе, если (это верно) {
// выполнить это
} иначе, если не верно ни то, ни другое {
// выполнить это
}
Другие
условные операторы
Конструкции с использованием операторов
if и
else составляют
основу условной логики в ActionScript. Однако
этот способ не единственный; в некоторых случаях
такие конструкции могут с успехом заменить
другие условные операторы, и при этом сам текст
программы может оказаться более простым и
понятным.
Оператор switch
способен послужить заменой конструкции
if/else. Он очень
удобен, если имеется некий набор точных значений,
которым должны соответствовать те или иные
действия. Вот как выглядит конструкция с
использованием этого оператора:
switch (favoriteBand)
{
case "Beatles":
gotoAndPlay("Beatles");
break;
case "U2":
gotoAndPlay("U2");
break;
default:
gotoAndPlay("Slim Whitman");
}
Первым делом вычисляется выражение (чаще всего
это просто переменная) в первой строке, в
скобках. Затем значение этого выражения (или
переменной) поочередно сравнивается со значением
в каждой из секций case.
Если в одной из секций найдено совпадение,
выполняется блок действий, относящийся к данной
секции, если совпадений не встретилось –
выполняется секция
default (в конце). В конце блока каждой
из секций case
ставится break,
чтобы прекратить перебор секций, если совпадение
найдено. Значениями, которые указываются в
секциях case,
могут быть строки (как в примере), числа и
булевы значения. Впрочем, для булевых значений (их
ведь всего два – true
и false) гораздо
лучше подойдет следующий вариант условного
оператора.
Тернарный (или троичный) оператор –
?: – позволяет
записать простейшую конструкцию
if/else в одну
строку. Например:
myMood = (money >
1000000) ? "Happy" : "Sad";
Если условие в скобках дает результат
true, то
переменной myMood
будет присвоен результат первого выражения (в
нашем случае – значение
"Happy"), если
false – второго выражения (в нашем случае
"Sad"). Таким
образом, мы записали в одну строку то, что с
использованием оператора
if выглядело бы так:
if (money > 1000000) {
myMood = "Happy";
} else {
myMood = "Sad";
}
А
вот усовершенствованный пример использования
тернарного оператора:
myMood = "I’m " +
(money > 1000000) ? "happy" : "sad";
В
этом примере переменная
myMood получит значение либо
"I’m happy", либо
"I’m sad" – в
зависимости от того, больше ли значение
money, чем 1000000
или нет.
Тернарный оператор часто применяется для "переключения"
переменных, имеющих два состояния (значения).
Например:
playSound = (playSound)
? false : true;
Каждый раз при выполнении этой
строки скрипта значение переменной
playSound будет
изменяться с true
на false либо с
false на
true.
Выбор условий
В
проекте может быть использовано много различных
условий, управляющих работой приложения и
взаимодействием с пользователем. Условия могут
выглядеть по-разному, но в основе всегда лежит
одно правило: результатом условия может быть
true либо
false. Вот
несколько примеров ситуаций, в которых обычно
применяются условные операторы:
- Один
объект входит в контакт с другим объектом
- Что-либо
включается или выключается
-
Положение, размер или другое свойство
фильма-символа достигает определенного
значения (или становится больше этого
значения, или меньше)
-
Пользователь выполнил определенные действия
с мышью или клавиатурой
- Сравнение
двух числовых или текстовых значений
- Различные
комбинации перечисленных ситуаций
Программирование реакции на несколько условий
В
этом упражнении мы будем запускать ракету. Для
успешного запуска требуются определенные
условия. Одним из важнейших факторов является
погода, которая влияет на ускорение ракеты, а
также на ее управляемость. В этом упражнении мы
запрограммируем генерацию случайно выбранных
погодных условий, на которые наша ракета будет
так или иначе реагировать.
-
Откройте файл rocketLaunch1.fla из папки
Lesson09/Assets.
Этот файл содержит единственную сцену из семи
слоев, названных в соответствии с их
содержанием. Давайте рассмотрим элементы сцены.
Слой Weather содержит экземпляр фильма-символа,
размер которого такой же, как у всего фильма.
Этот фильм-символ представляет в нашей сцене
изображение неба. На его монтажном столе имеется
три метки: Sunny, Rainy
и Night/. На
каждой из этих меток кадры содержат
соответствующую фоновую картинку: на метке
Sunny – ясная
погода, на Rainy
небо затянуто тучами, на
Night небо темное, ночное.
Слой Ground/Central Graphics содержит
изображение стартового поля и гор на заднем
плане. Кроме того, в этом слое находится
экземпляр фильма-символа в виде маленькой
красной мигающей точки, отмечающей место запуска
на глобусе.
Слой Rocket содержит, само собой, нашу ракету –
экземпляр фильма-символа под именем
rocket. На
монтажном столе этого клипа две метки:
off и
on. На метке on
ракета изображена с хвостом пламени, на метке
off – без.
Слой Control Panel содержит несколько элементов,
из которых прежде всего бросается в глаза
красная кнопка запуска – Launch. Она, между
прочим, будет не только запускать ракету, но и
возвращать сцену в исходное состояние после
каждой попытки запуска. Ниже этой кнопки
расположен экземпляр фильма-символа под
названием thrustBoost
– он представляет собой надпись "Thrusters". У
этого клипа тоже имеется две метки,
on и
off. На метке on
надпись отображается буквами большими и красными
– стало быть, ускорители ракеты включены.
Последний элемент этого слоя – текстовое поле,
расположенное в правом нижнем углу сцены, имя
экземпляра – weatherText.
Здесь будет отображаться текстовая информация о
текущем состоянии погоды.
Слой Status содержит экземпляр фильма-символа по
имени status; на
сцене вы видите его, как маленький кружок
посреди "неба". Он так выглядит потому, что в
его первом кадре отсутствует какая-либо графика.
На монтажном столе этого фильма-символа три
метки: off, abort
и success. На
метке off клип
выглядит так, как сейчас – то есть никак. На
метке abort
появляется надпись "Launch Aborted" (запуск не
удался); на метке success
– надпись "Launch Successful" (успешный запуск).
Таким образом, этот клип отображает сообщение об
успехе или неудаче попытки запуска.
В
слое Guides находятся две красные полоски –
ракета должна пройти через пространство между
ними, чтобы запуск считался успешным.
Слой Sound Clips содержит экземпляр
фильма-символа под названием
sounds; в проекте
он тоже показан в виде маленького кружка, в
районе левого верхнего угла сцены. На его
монтажном столе имеются метки
intro, launch, abort
и success. В кадры
каждой из этих меток помещен соответствующий
звуковой клип, иллюстрирующий вступление,
запуск, неудачу и успех. Скрипты, отсылающие
этот фильм-символ к той или иной метке,
обеспечат звуковое сопровождение нашего проекта.
Приступим к написанию скриптов для проекта.
-
Откройте панель Действия, выделите экземпляр
фильма-символа weather и присоедините к нему
следующий скрипт:
onClipEvent (load) {
randomWeather = random (3);
if (randomWeather == 0) {
conditions = "Sunny";
_root.rocket.noThrust = 3;
_root.rocket.thrust = 6;
} else if (randomWeather == 1) {
conditions = "Rainy";
_root.rocket.noThrust = 2;
_root.rocket.thrust = 4;
} else {
conditions = "Night";
_root.rocket.noThrust = 1;
_root.rocket.thrust = 2;
}
}
Этот скрипт будет выполняться при загрузке
данного экземпляра фильма-символа. Первым
действием присваивается значение переменной
randomWeather –
случайно выбранное число (из трех возможных: 0,
1 или 2). После этого оператор
if начинает
анализировать значение
randomWeather, чтобы присвоить нужные
значения трем другим переменным. Если
randomWeather
имеет значение 0, то на текущем монтажном столе
(этого фильма-символа) создается переменная
conditions, и ей
присваивается строковое значение
"Sunny". Кроме
того, создаются две переменные на монтажном
столе фильма-символа
rocket: одна называется
noThrust, другая –
thrust; эти
переменные получают значения 3 и 6
соответственно. Если же значение
randomWeather не
равно 0, то эта секция условного оператора
игнорируется, и управление передается секции
else if, которая
проверяет значение
randomWeather на равенство единице. Если
условие выполняется, то создаются те же три
переменные, но на этот раз они получают значения
"Rainy", 2 и 4, соответственно. Если значение
randomWeather не
равно 1, то эта секция тоже игнорируется, и
выполняются действия из секции
else. Как вы
помните, в секции else
условного оператора помещаются действия, которые
должны быть выполнены в том случае, если ни одно
из условий предыдущих секций оператора не
выполнено. У нас в секции
else создаются все те же три переменные,
только в этом случае они получают значения
"Night", 1 и 2.
Переменной conditions
мы вскоре воспользуемся для графического
отображения на сцене различных погодных условий.
Две другие переменные послужат для задания
скорости движения ракеты (экземпляра
rocket) в
зависимости от погоды.
-
Добавьте в обработчик события load, сразу
после последней секции оператора if,
следующие строки:
gotoAndStop(conditions);
_root.weatherText.text = "Weather: " +
conditions;
Эти два действия будут выполнены сразу после
завершения работы условного оператора
if; оба они
используют значение переменной
conditions. Первое
действие перемещает данный экземпляр
фильма-символа к кадру с меткой, название
которой содержится в переменной
conditions. Если,
например, conditions
имеет значение "Rainy", экземпляр клипа
перемещается к метке
Rainy – кадру, который содержит
изображение дождливой погоды. Второе действие
создает надпись, отображаемую в текстовом поле
weatherText, что в
правом нижнем углу сцены. Пусть опять
conditions имеет
значение "Rainy", тогда в этом текстовом поле
отобразится надпись "Weather: Rainy".
-
Командой Управление > Проверить фильм
(Control > Test Movie) запустите тест
проекта.
Как только начнется воспроизведение фильма,
будет загружен фильм-символ
weather и выполнен
скрипт, который мы только что написали. В
зависимости от того, какое случайное число
сгенерирует наш скрипт, на экране будут
отображены те или иные погодные условия, а в
правом нижнем углу экрана появится
соответствующая надпись.
Примечание
Если закрыть тестовый фильм, а затем вновь
выполнить команду Управление > Проверить фильм,
то погода на экране может оказаться уже иной – в
результате генерации другого случайного числа.
-
По-прежнему находясь в среде тестирования,
выполните команду Отладка > Список
переменных (Debug > List Variables).
Откроется окно Выход (Output), в котором будут
перечислены все переменные, находящиеся на
разных монтажных столах. Отметьте про себя
значения переменных
thrust и noThrust
на монтажном столе
rocket. Вскоре мы ими воспользуемся.
- Закрыв
тестовый фильм, вернитесь в среду разработки
и сохраните свою работу как
rocketLaunch2.fla.
Мы
продолжим работать с этим файлом в следующем
упражнении.
Установление
граничных условий
Со
всевозможными граничными условиями мы
сталкиваемся в жизни постоянно. Границы могут
быть разными – физическими, финансовыми, могут
даже быть установлены внутри нашего сознания; в
конечном итоге всякая граница – просто
обозначение предела чего-либо. Давайте возьмем
какой-нибудь пример граничных условий в
действии. Представьте, что вы ведете автомобиль.
Линии разметки на дороге представляют собой
границы, внутри которых должен оставаться наш
автомобиль. Если мы слишком приблизились к левой
линии (левая граница), мы поворачиваем руль
вправо, чтобы удержать машину в пределах
дорожной полосы; если приближаемся к правой
линии, поворачиваем руль в противоположную
сторону – условная логика в действии! Если
записать алгоритм наших действий на
ActionScript, получится нечто вроде:
if (car._x >
leftOfRoad) {
turnWheel ("right");
} else if (car < rightOfRoad) {
turnWheel ("left");
}
Чтобы установить граничные условия во Flash,
нужно задать некие пределы, и затем использовать
их в операторе if, который будет проверять
ограничиваемый элемент всякий раз, когда
наступает событие, в результате которого он мог
бы выйти за установленные границы. По ходу
выполнения следующего упражнения этот процесс
станет для вас яснее ясного.
Граничные условия используются во Flash в
следующих ситуациях:
- Для
предотвращения превышения свойствами
экземпляра фильма-символа (x,
y, alpha, xscale, yscale и т.п.)
определенных значений
- Для
вызова действия (изменения значения свойства
или метода) в ситуации, когда что-либо
попадает внутрь установленных пределов или
наоборот, выходит за пределы
- Чтобы
значения каких-либо данных не выходили за
определенные пределы
В
этом упражнении мы динамически анимируем красные
полоски в верхней части экрана нашего проекта,
представляющие собой "окно запуска", в которое
должна попасть ракета, чтобы запуск считался
успешным.
-
Откройте файл rocketLaunch2.fla из папки
Lesson09/Assets.
Мы
продолжаем работать с проектом, начатым в
предыдущем упражнении.
-
Откройте панель Действия, выделите одну из
двух красных полос в верхней части сцены и
введите такой скрипт:
onClipEvent
(enterFrame) {
if (_x < 0) {
direction = "right";
} else if (_x > 550) {
direction = "left";
}
if (direction == "right") {
_x = _x + 3;
} else {
_x = _x - 3;
}
}
Очевидно, что обе красные полосы являются частью
экземпляра фильма-символа, к которому мы и
присоединяем этот скрипт. В скрипте использовано
два оператора if,
при помощи которых экземпляр перемещается влево
и вправо. Скрипт привязан к обработчику события
enterFrame, а это
значит, что он будет выполняться 24 раза в
секунду (такова частота кадров нашего фильма).
В
первом условном операторе анализируется позиция
данного клипа, с тем, чтобы выяснить, не вышел
ли он за левую или правую границу. Если
горизонтальная координата экземпляра меньше 0
(то есть его центр ушел за левый край сцены),
переменной direction
присваивается значение
"right". В противном случае, если
горизонтальная координата больше 550 (центр
клипа вышел за правый край сцены),
direction получает
значение "left".
Таким образом, значение переменной
direction меняется
только в том случае, если произошел выход за
одну из границ. Значит, экземпляр клипа будет
постоянно двигаться, как предписывает ему второй
оператор if. А он
говорит, что если
direction имеет значение
"right", то
горизонтальная координата экземпляра
увеличивается на 3 – клип перемещается вправо. В
противном случае (else;
если direction
имеет значение "left")
горизонтальная координата экземпляра у
меньшается на 3, и клип перемещается влево.
Таким образом, в результате выполнения 24 раза в
секунду данного скрипта – двух условных
операторов – красные полосы будут постоянно
находиться в движении, однако не смогут выйти за
установленные пределы.
Примечание
При программировании граничных условий важно
определить, какой обработчик события лучше
использовать для анализа положения элемента
условными операторами. Использовать событие
enterFrame не
всегда выгодно; например, если нужно отслеживать
положение экземпляра фильма-символа при
перетаскивании его мышью, то для этого идеально
подойдет обработчик события mouseMove.
Итак, наши два условных оператора работают
совместно: направление движения красных полос
зависит от того, какая граница была пересечена
перед этим (в тот момент переменная
direction получила
значение "left"
либо "right") –
полосы движутся в направлении противоположной
границы. Наконец, они доходят до этой границы,
пересекают ее, и процесс повторяется в
противоположном направлении. Проще говоря, если
direction имеет
значение "right",
то экземпляр движется вправо до тех пор, пока не
пересечет правую границу, в этот момент
direction получает
значение "left", и
начинается обратное движение.
Примечание
Начальное положение на сцене нашего экземпляра –
на 1 пиксель левее левой границы. Таким образом,
при первом выполнении скрипта
direction получит
значение "right", и экземпляр будет двигаться
вправо.
-
Командой Управление > Проверить фильм
(Control > Test Movie) запустите тест
проекта.
Как только началось воспроизведение фильма,
красные полосы пришли в движение. Дойдя до
какого либо из заданных нами ограничителей, они
начинают двигаться в противоположную сторону.
- Закрыв
тестовый фильм, вернитесь в среду разработки
и сохраните свою работу как
rocketLaunch3.fla.
Мы
продолжим работать с этим файлом в следующем
упражнении.
Включение/Выключение
Встречаются ситуации, когда определенные
действия могут быть выполнены только в том
случае, если чтолибо включено. Тот же пример с
автомобилем: не включив зажигание, чтобы завести
двигатель, вы вряд ли сможете далеко уехать.
Нечто подобное может происходить и в ваших
фильмах: к определенным частям скрипта можно
"приделать выключатель", который будет разрешать
или запрещать их выполнение.
Представьте это так: сам скрипт – это некий
механизм, "машина", выполняющая определенную
задачу. Происходящие в фильме события –
"двигатели" скриптов. Условную логику можно
использовать как "выключатель", который
позволит, когда наступит событие, выполнять все
или некоторые действия только при определенных
обстоятельствах.
Возьмем для примера такой скрипт:
onClipEvent
(enterFrame) {
clock._rotation = clock._rotation + 1;
}
Этот скрипт при входе в каждый кадр (событии
enterFrame) будет
поворачивать экземпляр фильма-символа
clock
(изображающий, допустим, стрелки часов) на 1
градус – независимо от других событий,
происходящих в фильме. А если нам захочется
иметь возможность пускать и останавливать часы,
тогда скрипт нужно переписать примерно так:
onClipEvent
(enterFrame) {
if (power == true) {
clock._rotation = clock._rotation + 1;
}
}
Теперь вращение будет происходить только в том
случае, если переменная power имеет значение
true. Переменной
power можно присваивать значение
false или
true, используя
другой скрипт, присоединенный к кнопке, кадру
или другому экземпляру клипа – это, по сути
дела, будет "выключатель" для первого скрипта.
Подобная концепция часто используется в
приложениях, давая возможность пользователю
включать и отключать те или иные возможности
программы в диалоговых окнах выбора настроек. В
проектах Flash, как правило, основной упор
делается на анимацию и мультимедиа, а значит,
"переключатели" (их еще называют триггерами)
тоже пригодятся – они позволят "отключать" те
скрипты (а значит, анимации и целые монтажные
столы), которые в данный момент не нужны.
В
следующем упражнении мы применим описанную
концепцию для того, чтобы позволить нашей ракете
начинать движение только после того, как будет
нажата и отпущена кнопа Launch.
-
Откройте файл rocketLaunch3.fla из папки
Lesson09/Assets.
Мы
продолжаем работать с проектом, начатым в
предыдущих упражнениях.
-
Откройте панель Действия, выделите экземпляр
фильма-символа rocket и введите такой
скрипт:
onClipEvent (load) {
speed = noThrust;
}
Этот скрипт будет выполнен сразу после загрузки
данного фильма-символа. Единственное
предназначение скрипта – присвоить переменной
speed значение
noThrust. Как вы
помните, скрипт, присоединенный нами к
экземпляру клипа weather
(это было в первом упражнении данного урока)
присваивает переменным
thrust и noThrust
значения в зависимости от значения
randomWeather.
Таким образом, при выполнении данного скрипта
noThrust будет
иметь значение 1, 2 или 3 – и это значение будет
присвоено переменной
speed, которую мы вскоре используем – она
будет определять начальную скорость движения
ракеты.
- После
предыдущего скрипта поместите следующий:
onClipEvent
(enterFrame) {
if (launch) {
_y = _y - speed;
if (_y < _root._y) {
launch = false;
gotoAndStop ("off");
_root.status.gotoAndStop ("success");
_root.sounds.gotoAndPlay ("success");
}
}
}
Этот скрипт будет выполняться 24 раза в секунду,
поскольку он помещен в обработчик события
enterFrame. Первая
часть скрипта гласит, что если переменная
launch имеет
значение true,
текущую вертикальную координату ракеты следует
уменьшить на значение
speed. Таким образом, экземпляр будет
перемещаться вверх, но только если переменная
launch равна
true; если же
false – не
произойдет ничего. Вскоре мы присоединим к
кнопке Launch скрипт, который (если кнопка
нажата и отпущена) будет присваивать значение
true переменной
launch, тем самым
приводя в движение экземпляр
rocket. Переменная
speed, как уже
было сказано, определяет скорость, с которой
ракета будет подниматься.
Совет В
приведенном скрипте запись
if (launch)
использована вместо if
(launch == true). Смысл один и тот же, но
запись короче. Точно так же, вместо записи
if (launch == false)
можно написать просто
if
(!launch).
Сразу после строки скрипта, перемещающей ракету
вверх, мы видим еще один оператор
if. Обратите
внимание – он находится внутри первого условного
оператора. А это значит, что он будет
выполняться, как и строка перед ним, только в
том случае, если launch
равно true. Дело в
том, что он проверяет, не вышел ли данный
экземпляр за верхний край сцены – а это может
случиться только тогда, когда ракета
поднимается. Ракета же движется только тогда,
когда launch равно
true. Поэтому мы и
вставили второй оператор
if внутрь первого, иначе его условие
проверялось бы постоянно, независимо от того,
движется ли ракета или нет (launch
равно true или
false), а нам ни к
чему загружать процессор лишней работой.
Итак, если выполнено условие вложенного
оператора if
(пересечена верхняя граница сцены), выполняются
четыре действия. Первое присваивает переменной
launch значение
false – а значит,
"отключает" весь этот скрипт. Следующее действие
отсылает экземпляр к кадру с меткой
off – на монтажном
столе фильма-символа это кадр, где ракета
изображена без хвоста пламени. Следующее
действие отсылает экземпляр клипа
status к кадру с
меткой success, в
результате чего в середине экрана появляется
надпись "Launch Successful". Последнее действие
отсылает к метке success
экземпляр фильма-символа
sounds, в результате чего воспроизводится
короткая звукозапись, иллюстрирующая успешный
запуск.
Как вы уже поняли, ни одно действие из этого
скрипта не будет выполнено, пока переменная
launch не получит значение true. Присваивать ей
такое значение будет кнопка Launch – сейчас мы
ее запрограммируем.
- При
открытой панели Действия выделите кнопку
Launch и добавьте к ней такой скрипт:
on (release) {
rocket.launch = true;
rocket.gotoAndStop ("on");
sounds.gotoAndPlay ("launch");
}
Когда эта кнопка будет отпущена после нажатия,
ActionScript выполнит три действия. Во-первых,
переменной launch,
находящейся на монтажном столе экземпляра клипа
rocket, будет
присвоено значение true
(что приведет ракету в движение – об этом мы
говорили на предыдущем шаге). Во-вторых,
экземпляр rocket
будет отослан к кадру с меткой
on, где ракета
изображена с хвостом пламени. В-третьих,
экземпляр sounds
будет отослан к кадру с меткой
launch, где
содержится звукозапись, иллюстрирующая работу
ракетного двигателя.
- После
предыдущего скрипта добавьте следующий:
on (press) {
rocket.launch = false;
rocket.gotoAndStop ("off");
status.gotoAndStop ("off");
sounds.gotoAndPlay ("intro");
rocket._x = 98;
rocket._y = 352;
}
Мы
хотим, чтобы при нажатии этой кнопки выполнялись
некоторые действия – все они предназначены для
сброса переменных и элементов сцены в начальное
состояние, чтобы запуск ракеты можно было
повторить. Первое действие присваивает
переменной launch,
находящейся на монтажном столе экземпляра
rocket, значение
false, что
прекратит движение ракеты вверх. Три следующих
действия возвращают экземпляры фильмов-символов
rocket, status и
sounds к кадрам
первоначального состояния. Последние два
действия помещают экземпляр
rocket вновь на
стартовую площадку.
-
Командой Управление > Проверить фильм
(Control > Test Movie) запустите тест
проекта.
Нажмите кнопку Launch. Как только вы ее
отпустите, переменная
launch получит значение
true. Тем самым
будет "включен" скрипт, присоединенный к
экземпляру rocket,
и ракета начнет подниматься. Как только она
пересечет верхний край сцены, упомянутый скрипт
"отключится", и произойдут события, показывающие
успешный запуск. Вновь нажав и удерживая кнопку
Launch, вы сбросите сцену в начальное положение.
Как только отпустите кнопку, процесс повторится.
- Закрыв
тестовый фильм, вернитесь в среду разработки
и сохраните свою работу как
rocketLaunch4.fla.
Мы
продолжим работать с этим файлом в следующем
упражнении.
Реакция на
действия пользователя
Взаимодействие между пользователем и вашим
фильмом осуществляется, главным образом, через
посредство двух устройств: мыши и клавиатуры,
причем вариантов их использования может быть
много. Пользователь может перемещать мышь,
нажимать и отпускать ее кнопки, пользоваться
клавиатурой. При помощи условной логики можно
запрограммировать фильм так, чтобы он так или
иначе реагировал на действия пользователя.
В
следующем упражнении мы добавим в наш проект
возможность интерактивного взаимодействия:
пользователь, нажав клавишу "пробел", сможет
включать "ускорители", чтобы ракета поднималась
быстрее.
-
Откройте файл rocketLaunch4.fla из папки
Lesson09/Assets.
Мы
продолжаем работать с проектом, начатым в
предыдущих упражнениях.
Для начала вспомним два важных момента. Первое:
при загрузке экземпляра клипа
weather
выполняется скрипт, результаты которого зависят
от значения переменной
randomWeather. Скрипт не только
отображает на экране изображение,
соответствующее тем или иным погодным условиям,
но также присваивает значения переменным
thrust и
noThrust.
Переменная thrust
во всех случаях получает значение, которое в два
раза больше, чем значение
noThrust. Так, если
noThrust получает
значение 2, то thrust
– 4. Второе: при загрузке экземпляра
rocket переменной
speed (находящейся
на монтажном столе этого экземпляра)
присваивается значение
noThrust; так, если
noThrust имеет
значение 2, такое же значение получит и
переменная speed.
Значение speed определяет скорость подъема
ракеты. В этом упражнении мы изменим это:
переменной speed
будет присваиваться либо значение
noThrust, либо
значение thrust –
в зависимости от того, удерживает ли
пользователь нажатой клавишу "пробел". Поскольку
значение thrust в
два раза больше, чем значение noThrust, при
нажатом пробеле ракета будет подниматься в два
раза быстрее.
-
Откройте панель Действия, выделите экземпляр
фильма-символа rocket и добавьте после
имеющегося скрипта следующий:
onClipEvent (keyDown)
{
if (launch && key.isDown(key.SPACE)) {
speed = thrust;
_root.thrustBoost.gotoAndStop ("on");
}
}
Этот скрипт будет выполнен при нажатии любой
клавиши на клавиатуре, при этом условный
оператор проверит выполнение двух условий. Если
launch имеет
значение true, и
при этом нажата клавиша "пробел", будут
выполнены два действия. Первое присваивает
переменной speed
значение thrust –
в результате ракета будет подниматься в два раза
быстрее. Второе действие приказывает экземпляру
фильма-символа
thrustBoost (на сцене он расположен под
кнопкой Launch) перейти к кадру с меткой
on – в нем
находится изображение выполненной большими
красными буквами надписи "Thrusters".
Естественно, теперь нам нужно создать механизм
отключения ускорителей и возврата ракеты к
нормальной скорости; это будет следующий скрипт.
- После
предыдущего скрипта добавьте следующий:
onClipEvent (keyUp) {
if (!key.isDown(key.SPACE)) {
speed = noThrust;
_root.thrustBoost.gotoAndStop ("off");
}
}
Скрипт по своему синтаксису похож на предыдущий,
только работает наоборот. Прежде всего, он
выполняется в том случае, если клавиша, нажатая
на клавиатуре, отпущена. Условный оператор
проверяет, чтобы клавиша "пробел" была не
нажата. Если это так, выполняются два действия.
Первое вновь присваивает переменной
speed значение
noThrust
(начальное значение). Второе действие
приказывает экземпляру фильма-символа
thrustBoost
перейти к кадру с меткой
off, где надпись "Thrusters" изображена
так, как было до включения ускорителей.
-
Командой Управление > Проверить фильм
(Control > Test Movie) запустите тест
проекта.
Нажмите и отпустите кнопку Launch. Как только вы
это сделаете, ракета начнет подниматься. Нажав
клавишу "пробел", вы заставите ракету двигаться
вдвое быстрее. Отпустите "пробел" – ракета опять
станет двигаться медленнее, с первоначальной
скоростью.
- Закрыв
тестовый фильм, вернитесь в среду разработки
и сохраните свою работу как
rocketLaunch5.fla.
Мы
продолжим работать с этим файлом в следующем
упражнении.
Выявление
столкновений объектов
Часто во Flash-приложениях, особенно в играх,
требуется выявлять ситуации, когда два объекта
"встречаются" между собой на сцене. Здесь тоже
находит применение условная логика.
Для обнаружения столкновения двух объектов
(экземпляров фильмов-символов) в ActionScript
имеется метод hitTest()
объекта MovieClip.
Используя этот метод в соединении с условной
логикой, вы сможете запрограммировать действия,
которые должны быть выполнены в случае встречи
одного фильма-символа с другим. Взгляните на
следующий скрипт:
onClipEvent
(enterFrame) {
if (hitTest ("wallOfCotton")) {
pain = 0;
} else if (hitTest ("wallOfCardboard")) {
pain = 5;
} else if (hitTest ("wallOfBricks")) {
pain = 10;
}
Если экземпляр фильма-символа, к которому
присоединен этот скрипт, встретится на сцене с
экземпляром под названием
wallOfCotton, переменная
pain получает
значение 0. Если встретится с
wallOfCardboard,
pain получит значение 5. Наконец, если
столкновение будет с экземпляром
wallOfBricks,
pain получит
значение 10. Как видите, в применении метода
hitTest() нет
ничего сложного.
В
этом упражнении мы воспользуемся методом
hitTest() в
соединении с условной логикой для выполнения
определенных действий, если экземпляр
rocket при
движении натолкнется на одну из красных полос,
ограничивающих наше "окно запуска". Если ракета
наткнется на одну из них, запуск будет считаться
неудавшимся, если пройдет между ними – запуск
успешный.
-
Откройте файл rocketLaunch5.fla из папки
Lesson09/Assets.
Мы
продолжаем работать с проектом, начатым в
предыдущих упражнениях.
-
Двойным щелчком на одной из красных полос в
верхней части сцены откройте этот клип для
редактирования на месте.
Само собой, обе красные полосы
входят в состав этого экземпляра клипа. Однако в
то же время обе полосы сами являются
экземплярами фильма-символа (один экземпляр
перевернут). А раз так, мы можем
запрограммировать реакцию на столкновение этих
экземпляров с экземпляром клипа
rocket.
-
Откройте панель Действия, выделите одну из
красных полос и введите следующий скрипт:
onClipEvent
(enterFrame) {
if (hitTest("_root.rocket")) {
_root.rocket._x = 98;
_root.rocket._y = 352;
_root.rocket.launch = false;
_root.rocket.gotoAndStop ("off");
_root.status.gotoAndStop ("Abort");
_root.sounds.gotoAndPlay ("abort");
}
}
Этот скрипт помещен в обработчик события
enterFrame, а
значит, оператор if
будет проверять условие 24 раза в секунду.
Условие состоит в том, чтобы данный экземпляр
столкнулся с экземпляром фильма-символа
rocket (_root.rocket).
Если это произошло, выполняются действия в теле
оператора. Первые два возвращают ракету на ее
начальную позицию. Следующее действие
присваивает переменной
launch (на монтажном столе экземпляра
rocket) значение
false, что
приводит к прекращению движения ракеты.
Следующее действие перемещает экземпляр
rocket к кадру с
меткой off (в этом
кадре ракета изображена без огненного хвоста).
Затем экземпляр клипа
status перемещается к кадру с меткой
abort – на экране
отображается сообщение о том, что миссия
закончилась неудачей. И, наконец, экземпляр
клипа sounds
отсылается к кадру с меткой
abort, в
результате воспроизводится звукозапись, и
ллюстрирующая неудачный исход запуска.
- Не
закрывая панель Действия, выделите вторую
красную полосу и присоедините к ней такой же
скрипт, что и к первой.
Если экземпляр rocket
встретится с этим экземпляром, тоже будут
выполнены действия, описанные на предыдущем
шаге.
-
Командой Управление > Проверить фильм
(Control > Test Movie) запустите тест
проекта.
Теперь наш проект функционирует полностью!
Нажмите кнопку Launch, но сразу не отпускайте –
посмотрите, не произойдет ли чего при этом.
Отпустив кнопку, запустите ракету. Примените
ускорители, стараясь, чтобы ракета прошла в
промежуток между двумя красными полосами. Если
получится, появится сообщение об успешном
запуске, если нет – о неудаче.
- Закрыв
тестовый фильм, вернитесь в среду разработки
и сохраните свою работу как
rocketLaunch6.fla.
Этот урок завершен.
Теперь, когда вы умеете использовать в скриптах
условную логику, сюжеты ваших фильмов могут
стать разветвленными, вплоть до того, что каждый
пользователь сможет пройти по фильму своим,
уникальным, путем.
|