Условная логика – важнейший компонент интерактивных приложений. Именно на этом основано "разумное" поведение программ – та или иная реакция в зависимости от перемещения или положения указателя мыши, текущего дня недели, многих других динамических условий, возникающих в процессе воспроизведения фильма. С помощью условной логики вы сможете перейти от простого линейного воспроизведения презентаций и
В этом уроке мы познакомим вас со способами применения логических условий, рассмотрим приемы, с помощью которых можно заставить фильм реагировать на обстоятельства.
В этом уроке:
if, if/else, if/else if
Успешный запуск ракеты зависит от многих обстоятельств. Проект этого урока продемонстрирует вам некоторые принципы и приемы использования условной логики.
На выполнение этого урока требуется примерно один час.
Файлы-носители:
Нет
Стартовые файлы:
Lesson09/Assets/rocketLaunch1.fla
Законченные проекты:
rocketLaunch6.fla
Обычно скрипты выполняются по порядку, строка за строкой, от начала до конца. С помощью условной логики можно управлять скриптами, разрешая выполнять определенные действия только в том случае, если выполняется некоторое условие. Таким образом, ваши фильмы смогут "жить своей жизнью", принимая решения и реагируя в зависимости от обстоятельств. Для реализации в скриптах условной логики служат условные операторы.
Ядром всей условной логики в 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 ( означает: "Если имеет значение Friday, а значение pmTime больше 5, выполнить… |
|
| || | if ( означает: "Если имеет значение Saturday или Sunday, выполнить… |
Совет Распространенная ошибка – при проверке на равенство ставить одиночный знак ( = ) вместо сдвоенного ( == ). Помните, что одиночный знак равенства обозначает оператор присвоения (например, – "присвоить переменной ) обозначает оператор сравнения, он ничего не присваивает, а лишь проверяет, равны ли значения слева и справа от него.
Совет Со сравнением чисел все просто – в конце концов, каждый понимает, что 50 меньше 100, другое дело – сравнение текстовых значений. Строка "Derek" отнюдь не равна строке "derek", хотя, казалось бы, слово одно и то же. В текстовых значениях буква A, например, "меньше", чем буква Z, и все заглавные буквы "меньше", чем строчные. Латинская буква A имеет внутреннее представление (числовой код) 1, а буква z – 52 (ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz).
Оператор if/else if ("если/иначе, если") схож с базовым оператором if, который мы только что обсуждали, но отличается тем, что позволяет задать несколько условий с разной реакцией на них. Рассмотрим пример:
if (money > 500) {
buyTV("35 inch");
} else if (money > 300) {
buyTV("27 inch");
}

Данный скрипт выполняет различные действия в зависимости от значения переменной buyTV() со значением аргумента "35 . Если меньше 500, эта часть игнорируется и проверяется следующее условие: если значение больше 300, функция вызывается buyTV() со значением аргумента "27 меньше 300, то обе секции будут проигнорированы.
Оператор if/else if может содержать (при необходимости) много секций, реагируя на десятки различных условий.
Оператор if/else ("если/иначе") позволяет запрограммировать действия, которые должны выполняться, если ни одно из заданных в
if (money > 500) {
buyTV("35 inch");
} else if (money > 300) {
buyTV("27 inch");
} else {
workOvertime ();
}

В этом скрипте, если else – если перевести синтаксис на русский язык, получится следующее:
если (это верно) {
// выполнить это
} иначе, если (это верно) {
// выполнить это
} иначе, если не верно ни то, ни другое {
// выполнить это
}
Конструкции с использованием операторов if и else составляют основу условной логики в
Оператор 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 – второго выражения (в нашем случае " ). Таким образом, мы записали в одну строку то, что с использованием оператора if выглядело бы так:
if (money > 1000000) {
myMood = "Happy";
} else {
myMood = "Sad";
}
А вот усовершенствованный пример использования
myMood = "I’m " + (money > 1000000) ? "happy" : "sad";
В этом примере переменная myMood получит значение либо "I’m happy", либо "I’m – в зависимости от того, больше ли значение , чем 1000000 или нет.
Тернарный оператор часто применяется для "переключения" переменных, имеющих два состояния (значения). Например:
playSound = (playSound) ? false : true;
Каждый раз при выполнении этой строки скрипта значение переменной playSound будет изменяться с true на false либо с false на true.
В проекте может быть использовано много различных условий, управляющих работой приложения и взаимодействием с пользователем. Условия могут выглядеть по-разному, но в основе всегда лежит одно правило: результатом условия может быть true либо false. Вот несколько примеров ситуаций, в которых обычно применяются условные операторы:
В этом упражнении мы будем запускать ракету. Для успешного запуска требуются определенные условия. Одним из важнейших факторов является погода, которая влияет на ускорение ракеты, а также на ее управляемость. В этом упражнении мы запрограммируем генерацию случайно выбранных погодных условий, на которые наша ракета будет так или иначе реагировать.
Этот файл содержит единственную сцену из семи слоев, названных в соответствии с их содержанием. Давайте рассмотрим элементы сцены.
Слой Weather содержит экземпляр фильма-символа, размер которого такой же, как у всего фильма. Этот фильм-символ представляет в нашей сцене изображение неба. На его монтажном столе имеется три метки: Sunny, Rainy и Night /. На каждой из этих меток кадры содержат соответствующую фоновую картинку: на метке Sunny – ясная погода, на Rainy небо затянуто тучами, на Night небо темное, ночное.
Слой
Слой Rocket содержит, само собой, нашу ракету – экземпляр фильма-символа под именем rocket. На монтажном столе этого клипа две метки: off и on. На метке on ракета изображена с хвостом пламени, на метке off – без.
Слой thrustBoost – он представляет собой надпись "Thrusters". У этого клипа тоже имеется две метки, on и off. На метке on надпись отображается буквами большими и красными – стало быть, ускорители ракеты включены. Последний элемент этого слоя – текстовое поле, расположенное в правом нижнем углу сцены, имя экземпляра – weatherText. Здесь будет отображаться текстовая информация о текущем состоянии погоды.
Слой на сцене вы видите его, как маленький кружок посреди "неба". Он так выглядит потому, что в его первом кадре отсутствует какая-либо графика. На монтажном столе этого фильма-символа три метки: off, и success. На метке off клип выглядит так, как сейчас – то есть никак. На метке появляется надпись "success – надпись "
В слое
Слой в проекте он тоже показан в виде маленького кружка, в районе левого верхнего угла сцены. На его монтажном столе имеются метки intro, и success. В кадры каждой из этих меток помещен соответствующий звуковой клип, иллюстрирующий вступление, запуск, неудачу и успех. Скрипты, отсылающие этот фильм-символ к той или иной метке, обеспечат звуковое сопровождение нашего проекта.

Приступим к написанию скриптов для проекта.
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, то на текущем монтажном столе (этого фильма-символа) создается переменная , и ей присваивается строковое значение "Sunny". Кроме того, создаются две переменные на монтажном столе фильма-символа rocket: одна называется noThrust, другая – thrust ; эти переменные получают значения 3 и 6 соответственно. Если же значение randomWeather не равно 0, то эта секция else if, которая проверяет значение randomWeather на равенство
единице. Если условие выполняется, то создаются те же три переменные, но на этот раз они получают значения "Rainy", 2 и 4, соответственно. Если значение randomWeather не равно 1, то эта секция тоже игнорируется, и выполняются действия из секции else. Как вы помните, в секции else else создаются все те же три переменные, только в этом случае они получают значения "Night", 1 и 2.
Переменной мы вскоре воспользуемся для графического отображения на сцене различных погодных условий. Две другие переменные послужат для задания скорости движения ракеты (экземпляра rocket ) в зависимости от погоды.
gotoAndStop(conditions); _root.weatherText.text = "Weather: " + conditions;
Эти два действия будут выполнены сразу после завершения работы if; оба они используют значение переменной . Первое действие перемещает данный экземпляр фильма-символа к кадру с меткой, название которой содержится в переменной . Если, например, имеет значение "Rainy", экземпляр клипа перемещается к метке Rainy – кадру, который содержит изображение дождливой погоды. Второе действие создает надпись, отображаемую в текстовом поле weatherText, что в правом нижнем углу сцены. Пусть опять имеет значение "Rainy", тогда в этом текстовом поле отобразится надпись "Weather: Rainy".
Как только начнется воспроизведение фильма, будет загружен фильм-символ weather и выполнен скрипт, который мы только что написали. В зависимости от того, какое случайное число сгенерирует наш скрипт, на экране будут отображены те или иные погодные условия, а в правом нижнем углу экрана появится соответствующая надпись.
Примечание Если закрыть тестовый фильм, а затем вновь выполнить команду Управление > Проверить фильм, то погода на экране может оказаться уже иной – в результате генерации другого случайного числа.
Откроется окно Выход (Output), в котором будут перечислены все переменные, находящиеся на разных монтажных столах. Отметьте про себя значения переменных thrust и noThrust на монтажном столе rocket. Вскоре мы ими воспользуемся.

Мы продолжим работать с этим файлом в следующем упражнении.
Со всевозможными граничными условиями мы сталкиваемся в жизни постоянно. Границы могут быть разными – физическими, финансовыми, могут даже быть установлены внутри нашего сознания; в конечном итоге всякая граница – просто обозначение предела чего-либо. Давайте возьмем какой-нибудь пример граничных условий в действии. Представьте, что вы ведете автомобиль. Линии разметки на дороге представляют собой границы, внутри которых должен оставаться наш автомобиль. Если мы слишком приблизились к левой линии (левая граница), мы поворачиваем руль вправо, чтобы удержать машину в пределах дорожной полосы; если приближаемся к правой линии, поворачиваем руль в противоположную сторону – условная логика в действии! Если записать алгоритм наших действий на
if (car._x > leftOfRoad) {
turnWheel ("right");
} else if (car < rightOfRoad) {
turnWheel ("left");
}

Чтобы установить граничные условия во
Граничные условия используются во
x, y, alpha, xscale, yscale и т.п.) определенных значенийВ этом упражнении мы динамически анимируем красные полоски в верхней части экрана нашего проекта, представляющие собой "окно запуска", в которое должна попасть ракета, чтобы запуск считался успешным.
Мы продолжаем работать с проектом, начатым в предыдущем упражнении.
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 (то есть его центр ушел за левый край сцены), переменной присваивается значение "right". В противном случае, если горизонтальная координата больше 550 (центр клипа вышел за правый край сцены), получает значение "left". Таким образом, значение переменной меняется только в том случае, если произошел выход за одну из границ. Значит, экземпляр клипа будет постоянно двигаться, как предписывает ему второй оператор if. А он говорит, что если имеет значение "right", то горизонтальная координата экземпляра увеличивается на 3 – клип перемещается вправо. В противном случае ( else ; если имеет значение "left" ) горизонтальная координата экземпляра у
меньшается на 3, и клип перемещается влево. Таким образом, в результате выполнения 24 раза в секунду данного скрипта – двух условных операторов – красные полосы будут постоянно находиться в движении, однако не смогут выйти за установленные пределы.
Примечание При программировании граничных условий важно определить, какой обработчик события лучше использовать для анализа положения элемента enterFrame не всегда выгодно; например, если нужно отслеживать положение экземпляра фильма-символа при перетаскивании его мышью, то для этого идеально подойдет обработчик события mouseMove.
Итак, наши два условных оператора работают совместно: направление движения красных полос зависит от того, какая граница была пересечена перед этим (в тот момент переменная получила значение "left" либо "right" ) – полосы движутся в направлении противоположной границы. Наконец, они доходят до этой границы, пересекают ее, и процесс повторяется в противоположном направлении. Проще говоря, если имеет значение "right", то экземпляр движется вправо до тех пор, пока не пересечет правую границу, в этот момент получает значение "left", и начинается обратное движение.

Примечание Начальное положение на сцене нашего экземпляра – на 1 пиксель левее левой границы. Таким образом, при первом выполнении скрипта получит значение "right", и экземпляр будет двигаться вправо.
Как только началось воспроизведение фильма, красные полосы пришли в движение. Дойдя до какого либо из заданных нами ограничителей, они начинают двигаться в противоположную сторону.
Мы продолжим работать с этим файлом в следующем упражнении.
Встречаются ситуации, когда определенные действия могут быть выполнены только в том случае, если что-либо включено. Тот же пример с автомобилем: не включив зажигание, чтобы завести двигатель, вы вряд ли сможете далеко уехать. Нечто подобное может происходить и в ваших фильмах: к определенным частям скрипта можно "приделать выключатель", который будет разрешать или запрещать их выполнение.
Представьте это так: сам скрипт – это некий механизм, "машина", выполняющая определенную задачу. Происходящие в фильме события – "двигатели" скриптов. Условную логику можно использовать как "выключатель", который позволит, когда наступит событие, выполнять все или некоторые действия только при определенных обстоятельствах.
Возьмем для примера такой скрипт:
onClipEvent (enterFrame) {
clock._rotation = clock._rotation + 1;
}
Этот скрипт при входе в каждый кадр (событии enterFrame ) будет поворачивать экземпляр фильма-символа (изображающий, допустим, стрелки часов) на 1 градус – независимо от других событий, происходящих в фильме. А если нам захочется иметь возможность пускать и останавливать часы, тогда скрипт нужно переписать примерно так:
onClipEvent (enterFrame) {
if (power == true) {
clock._rotation = clock._rotation + 1;
}
}
Теперь вращение будет происходить только в том случае, если переменная true. Переменной false или true, используя другой скрипт, присоединенный к кнопке, кадру или другому экземпляру клипа – это, по сути дела, будет "выключатель" для первого скрипта.
Подобная концепция часто используется в приложениях, давая возможность пользователю включать и отключать те или иные возможности программы в диалоговых окнах выбора настроек. В проектах
В следующем упражнении мы применим описанную концепцию для того, чтобы позволить нашей ракете начинать движение только после того, как будет нажата и отпущена кнопа
Мы продолжаем работать с проектом, начатым в предыдущих упражнениях.
onClipEvent (load) {
speed = noThrust;
}
Этот скрипт будет выполнен сразу после значение noThrust. Как вы помните, скрипт, присоединенный нами к экземпляру клипа weather (это было в первом упражнении данного урока) присваивает переменным thrust и noThrust значения в зависимости от значения randomWeather. Таким образом, при выполнении данного скрипта noThrust будет иметь значение 1, 2 или 3 – и это значение будет присвоено переменной , которую мы вскоре используем – она будет определять начальную скорость движения ракеты.
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. Первая часть скрипта гласит, что если переменная имеет значение true, текущую вертикальную координату ракеты следует уменьшить на значение . Таким образом, экземпляр будет перемещаться вверх, но только если переменная равна true ; если же false – не произойдет ничего. Вскоре мы присоединим к кнопке true переменной , тем самым приводя в движение экземпляр rocket. Переменная , как уже было сказано, определяет скорость, с которой ракета будет подниматься.
Совет В приведенном скрипте запись if ( использована вместо if (. Смысл один и тот же, но запись короче. Точно так же, вместо записи if ( можно написать просто if (!.
Сразу после строки скрипта, перемещающей ракету вверх, мы видим еще один оператор if. Обратите внимание – он находится внутри первого равно true. Дело в том, что он проверяет, не вышел ли данный экземпляр за верхний край сцены – а это может случиться только тогда, когда ракета поднимается. Ракета же движется только тогда, когда равно true. Поэтому мы и вставили второй оператор if внутрь первого, иначе его условие проверялось бы постоянно, независимо от того, движется ли ракета или нет ( равно true или false ), а нам ни к чему загружать процессор лишней работой.
Итак, если выполнено условие вложенного оператора if (пересечена значение false – а значит, "отключает" весь этот скрипт. Следующее действие отсылает экземпляр к кадру с меткой off – на монтажном столе фильма-символа это кадр, где ракета изображена без хвоста пламени. Следующее действие отсылает экземпляр клипа к кадру с меткой success, в результате чего в середине экрана появляется надпись "success экземпляр фильма-символа , в результате чего воспроизводится короткая звукозапись, иллюстрирующая успешный запуск.

Как вы уже поняли, ни одно действие из этого скрипта не будет выполнено, пока переменная
on (release) {
rocket.launch = true;
rocket.gotoAndStop ("on");
sounds.gotoAndPlay ("launch");
}
Когда эта кнопка будет отпущена после нажатия, , находящейся на монтажном столе экземпляра клипа rocket, будет присвоено значение true (что приведет ракету в движение – об этом мы говорили на предыдущем шаге). Во-вторых, экземпляр rocket будет отослан к кадру с меткой on, где ракета изображена с хвостом пламени. В-третьих, экземпляр будет отослан к кадру с меткой , где содержится звукозапись, иллюстрирующая работу ракетного двигателя.
on (press) {
rocket.launch = false;
rocket.gotoAndStop ("off");
status.gotoAndStop ("off");
sounds.gotoAndPlay ("intro");
rocket._x = 98;
rocket._y = 352;
}
Мы хотим, чтобы при нажатии этой кнопки выполнялись некоторые действия – все они предназначены для сброса переменных и элементов сцены в начальное состояние, чтобы запуск ракеты можно было повторить. Первое действие присваивает переменной , находящейся на монтажном столе экземпляра rocket, значение false, что прекратит движение ракеты вверх. Три следующих действия возвращают экземпляры фильмов-символов rocket, и к кадрам первоначального состояния. Последние два действия помещают экземпляр rocket вновь на стартовую площадку.
Нажмите кнопку получит значение true. Тем самым будет "включен" скрипт, присоединенный к экземпляру rocket, и ракета начнет подниматься. Как только она пересечет верхний край сцены, упомянутый скрипт "отключится", и произойдут события, показывающие успешный запуск. Вновь нажав и удерживая кнопку
Мы продолжим работать с этим файлом в следующем упражнении.
Взаимодействие между пользователем и вашим фильмом осуществляется, главным образом, через посредство двух устройств: мыши и клавиатуры, причем вариантов их использования может быть много. Пользователь может перемещать мышь, нажимать и отпускать ее кнопки, пользоваться клавиатурой. При помощи условной логики можно запрограммировать фильм так, чтобы он так или иначе реагировал на действия пользователя.
В следующем упражнении мы добавим в наш проект возможность интерактивного взаимодействия: пользователь, нажав клавишу "пробел", сможет включать "ускорители", чтобы ракета поднималась быстрее.
Мы продолжаем работать с проектом, начатым в предыдущих упражнениях.
Для начала вспомним два важных момента. Первое: при загрузке экземпляра клипа weather выполняется скрипт, результаты которого зависят от значения переменной randomWeather. Скрипт не только отображает на экране изображение, соответствующее тем или иным погодным условиям, но также присваивает значения переменным thrust и noThrust. Переменная thrust во всех случаях получает значение, которое в два раза больше, чем значение noThrust. Так, если noThrust получает значение 2, то thrust – 4. Второе: при загрузке экземпляра rocket переменной (находящейся на монтажном столе этого экземпляра) присваивается значение noThrust ; так, если noThrust имеет значение 2, такое же значение получит и переменная . Значение будет присваиваться либо
значение noThrust, либо значение thrust – в зависимости от того, удерживает ли пользователь нажатой клавишу "пробел". Поскольку значение thrust в два раза больше, чем значение noThrust, при нажатом пробеле ракета будет подниматься в два раза быстрее.

onClipEvent (keyDown) {
if (launch key.isDown(key.SPACE)) {
speed = thrust;
_root.thrustBoost.gotoAndStop ("on");
}
}
Этот скрипт будет выполнен при нажатии любой клавиши на клавиатуре, при этом имеет значение true, и при этом нажата клавиша "пробел", будут выполнены два действия. Первое присваивает переменной значение thrust – в результате ракета будет подниматься в два раза быстрее. Второе действие приказывает экземпляру фильма-символа thrustBoost (на сцене он расположен под кнопкой on – в нем находится изображение выполненной большими красными буквами надписи "Thrusters".
Естественно, теперь нам нужно создать механизм отключения ускорителей и возврата ракеты к нормальной скорости; это будет следующий скрипт.
onClipEvent (keyUp) {
if (!key.isDown(key.SPACE)) {
speed = noThrust;
_root.thrustBoost.gotoAndStop ("off");
}
}

Скрипт по своему синтаксису похож на предыдущий, только работает наоборот. Прежде всего, он выполняется в том случае, если клавиша, нажатая на клавиатуре, отпущена. значение noThrust (начальное значение). Второе действие приказывает экземпляру фильма-символа thrustBoost перейти к кадру с меткой off, где надпись "Thrusters" изображена так, как было до включения ускорителей.
Нажмите и отпустите кнопку
Мы продолжим работать с этим файлом в следующем упражнении.
Часто во
Для обнаружения столкновения двух объектов (экземпляров фильмов-символов) в 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 при движении натолкнется на одну из красных полос, ограничивающих наше "окно запуска". Если ракета наткнется на одну из них, запуск будет считаться неудавшимся, если пройдет между ними – запуск успешный.
Мы продолжаем работать с проектом, начатым в предыдущих упражнениях.
Само собой, обе красные полосы входят в состав этого экземпляра клипа. Однако в то же время обе полосы сами являются экземплярами фильма-символа (один экземпляр перевернут). А раз так, мы можем запрограммировать реакцию на столкновение этих экземпляров с экземпляром клипа 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). Если это произошло, выполняются действия в (на монтажном столе экземпляра rocket ) значение false, что приводит к прекращению движения ракеты. Следующее действие перемещает экземпляр rocket к кадру с меткой off (в этом кадре ракета изображена без огненного хвоста). Затем экземпляр клипа перемещается к кадру с меткой – на экране отображается сообщение о том, что миссия закончилась неудачей. И, наконец, экземпляр клипа отсылается к кадру с меткой , в результате воспроизводится звукозапись, и
ллюстрирующая неудачный исход запуска.
Если экземпляр rocket встретится с этим экземпляром, тоже будут выполнены действия, описанные на предыдущем шаге.

Теперь наш проект функционирует полностью! Нажмите кнопку
Этот урок завершен.
Теперь, когда вы умеете использовать в скриптах условную логику, сюжеты ваших фильмов могут стать разветвленными, вплоть до того, что каждый пользователь сможет пройти по фильму своим, уникальным, путем.
Условная логика – важнейший компонент интерактивных приложений. Именно на этом основано "разумное" поведение программ – та или иная реакция в зависимости от перемещения или положения указателя мыши, текущего дня недели, многих других динамических условий, возникающих в процессе воспроизведения фильма. С помощью условной логики вы сможете перейти от простого линейного воспроизведения презентаций и
В этом уроке мы познакомим вас со способами применения логических условий, рассмотрим приемы, с помощью которых можно заставить фильм реагировать на обстоятельства.
В этом уроке:
if, if/else, if/else if
Успешный запуск ракеты зависит от многих обстоятельств. Проект этого урока продемонстрирует вам некоторые принципы и приемы использования условной логики.
На выполнение этого урока требуется примерно один час.
Файлы-носители:
Нет
Стартовые файлы:
Lesson09/Assets/rocketLaunch1.fla
Законченные проекты:
rocketLaunch6.fla
Обычно скрипты выполняются по порядку, строка за строкой, от начала до конца. С помощью условной логики можно управлять скриптами, разрешая выполнять определенные действия только в том случае, если выполняется некоторое условие. Таким образом, ваши фильмы смогут "жить своей жизнью", принимая решения и реагируя в зависимости от обстоятельств. Для реализации в скриптах условной логики служат условные операторы.
Ядром всей условной логики в 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 ( означает: "Если имеет значение Friday, а значение pmTime больше 5, выполнить… |
|
| || | if ( означает: "Если имеет значение Saturday или Sunday, выполнить… |
Совет Распространенная ошибка – при проверке на равенство ставить одиночный знак ( = ) вместо сдвоенного ( == ). Помните, что одиночный знак равенства обозначает оператор присвоения (например, – "присвоить переменной ) обозначает оператор сравнения, он ничего не присваивает, а лишь проверяет, равны ли значения слева и справа от него.
Совет Со сравнением чисел все просто – в конце концов, каждый понимает, что 50 меньше 100, другое дело – сравнение текстовых значений. Строка "Derek" отнюдь не равна строке "derek", хотя, казалось бы, слово одно и то же. В текстовых значениях буква A, например, "меньше", чем буква Z, и все заглавные буквы "меньше", чем строчные. Латинская буква A имеет внутреннее представление (числовой код) 1, а буква z – 52 (ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz).
Оператор if/else if ("если/иначе, если") схож с базовым оператором if, который мы только что обсуждали, но отличается тем, что позволяет задать несколько условий с разной реакцией на них. Рассмотрим пример:
if (money > 500) {
buyTV("35 inch");
} else if (money > 300) {
buyTV("27 inch");
}

Данный скрипт выполняет различные действия в зависимости от значения переменной buyTV() со значением аргумента "35 . Если меньше 500, эта часть игнорируется и проверяется следующее условие: если значение больше 300, функция вызывается buyTV() со значением аргумента "27 меньше 300, то обе секции будут проигнорированы.
Оператор if/else if может содержать (при необходимости) много секций, реагируя на десятки различных условий.
Оператор if/else ("если/иначе") позволяет запрограммировать действия, которые должны выполняться, если ни одно из заданных в
if (money > 500) {
buyTV("35 inch");
} else if (money > 300) {
buyTV("27 inch");
} else {
workOvertime ();
}

В этом скрипте, если else – если перевести синтаксис на русский язык, получится следующее:
если (это верно) {
// выполнить это
} иначе, если (это верно) {
// выполнить это
} иначе, если не верно ни то, ни другое {
// выполнить это
}
Конструкции с использованием операторов if и else составляют основу условной логики в
Оператор 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 – второго выражения (в нашем случае " ). Таким образом, мы записали в одну строку то, что с использованием оператора if выглядело бы так:
if (money > 1000000) {
myMood = "Happy";
} else {
myMood = "Sad";
}
А вот усовершенствованный пример использования
myMood = "I’m " + (money > 1000000) ? "happy" : "sad";
В этом примере переменная myMood получит значение либо "I’m happy", либо "I’m – в зависимости от того, больше ли значение , чем 1000000 или нет.
Тернарный оператор часто применяется для "переключения" переменных, имеющих два состояния (значения). Например:
playSound = (playSound) ? false : true;
Каждый раз при выполнении этой строки скрипта значение переменной playSound будет изменяться с true на false либо с false на true.
В проекте может быть использовано много различных условий, управляющих работой приложения и взаимодействием с пользователем. Условия могут выглядеть по-разному, но в основе всегда лежит одно правило: результатом условия может быть true либо false. Вот несколько примеров ситуаций, в которых обычно применяются условные операторы:
В этом упражнении мы будем запускать ракету. Для успешного запуска требуются определенные условия. Одним из важнейших факторов является погода, которая влияет на ускорение ракеты, а также на ее управляемость. В этом упражнении мы запрограммируем генерацию случайно выбранных погодных условий, на которые наша ракета будет так или иначе реагировать.
Этот файл содержит единственную сцену из семи слоев, названных в соответствии с их содержанием. Давайте рассмотрим элементы сцены.
Слой Weather содержит экземпляр фильма-символа, размер которого такой же, как у всего фильма. Этот фильм-символ представляет в нашей сцене изображение неба. На его монтажном столе имеется три метки: Sunny, Rainy и Night /. На каждой из этих меток кадры содержат соответствующую фоновую картинку: на метке Sunny – ясная погода, на Rainy небо затянуто тучами, на Night небо темное, ночное.
Слой
Слой Rocket содержит, само собой, нашу ракету – экземпляр фильма-символа под именем rocket. На монтажном столе этого клипа две метки: off и on. На метке on ракета изображена с хвостом пламени, на метке off – без.
Слой thrustBoost – он представляет собой надпись "Thrusters". У этого клипа тоже имеется две метки, on и off. На метке on надпись отображается буквами большими и красными – стало быть, ускорители ракеты включены. Последний элемент этого слоя – текстовое поле, расположенное в правом нижнем углу сцены, имя экземпляра – weatherText. Здесь будет отображаться текстовая информация о текущем состоянии погоды.
Слой на сцене вы видите его, как маленький кружок посреди "неба". Он так выглядит потому, что в его первом кадре отсутствует какая-либо графика. На монтажном столе этого фильма-символа три метки: off, и success. На метке off клип выглядит так, как сейчас – то есть никак. На метке появляется надпись "success – надпись "
В слое
Слой в проекте он тоже показан в виде маленького кружка, в районе левого верхнего угла сцены. На его монтажном столе имеются метки intro, и success. В кадры каждой из этих меток помещен соответствующий звуковой клип, иллюстрирующий вступление, запуск, неудачу и успех. Скрипты, отсылающие этот фильм-символ к той или иной метке, обеспечат звуковое сопровождение нашего проекта.

Приступим к написанию скриптов для проекта.
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, то на текущем монтажном столе (этого фильма-символа) создается переменная , и ей присваивается строковое значение "Sunny". Кроме того, создаются две переменные на монтажном столе фильма-символа rocket: одна называется noThrust, другая – thrust ; эти переменные получают значения 3 и 6 соответственно. Если же значение randomWeather не равно 0, то эта секция else if, которая проверяет значение randomWeather на равенство
единице. Если условие выполняется, то создаются те же три переменные, но на этот раз они получают значения "Rainy", 2 и 4, соответственно. Если значение randomWeather не равно 1, то эта секция тоже игнорируется, и выполняются действия из секции else. Как вы помните, в секции else else создаются все те же три переменные, только в этом случае они получают значения "Night", 1 и 2.
Переменной мы вскоре воспользуемся для графического отображения на сцене различных погодных условий. Две другие переменные послужат для задания скорости движения ракеты (экземпляра rocket ) в зависимости от погоды.
gotoAndStop(conditions); _root.weatherText.text = "Weather: " + conditions;
Эти два действия будут выполнены сразу после завершения работы if; оба они используют значение переменной . Первое действие перемещает данный экземпляр фильма-символа к кадру с меткой, название которой содержится в переменной . Если, например, имеет значение "Rainy", экземпляр клипа перемещается к метке Rainy – кадру, который содержит изображение дождливой погоды. Второе действие создает надпись, отображаемую в текстовом поле weatherText, что в правом нижнем углу сцены. Пусть опять имеет значение "Rainy", тогда в этом текстовом поле отобразится надпись "Weather: Rainy".
Как только начнется воспроизведение фильма, будет загружен фильм-символ weather и выполнен скрипт, который мы только что написали. В зависимости от того, какое случайное число сгенерирует наш скрипт, на экране будут отображены те или иные погодные условия, а в правом нижнем углу экрана появится соответствующая надпись.
Примечание Если закрыть тестовый фильм, а затем вновь выполнить команду Управление > Проверить фильм, то погода на экране может оказаться уже иной – в результате генерации другого случайного числа.
Откроется окно Выход (Output), в котором будут перечислены все переменные, находящиеся на разных монтажных столах. Отметьте про себя значения переменных thrust и noThrust на монтажном столе rocket. Вскоре мы ими воспользуемся.

Мы продолжим работать с этим файлом в следующем упражнении.
Со всевозможными граничными условиями мы сталкиваемся в жизни постоянно. Границы могут быть разными – физическими, финансовыми, могут даже быть установлены внутри нашего сознания; в конечном итоге всякая граница – просто обозначение предела чего-либо. Давайте возьмем какой-нибудь пример граничных условий в действии. Представьте, что вы ведете автомобиль. Линии разметки на дороге представляют собой границы, внутри которых должен оставаться наш автомобиль. Если мы слишком приблизились к левой линии (левая граница), мы поворачиваем руль вправо, чтобы удержать машину в пределах дорожной полосы; если приближаемся к правой линии, поворачиваем руль в противоположную сторону – условная логика в действии! Если записать алгоритм наших действий на
if (car._x > leftOfRoad) {
turnWheel ("right");
} else if (car < rightOfRoad) {
turnWheel ("left");
}

Чтобы установить граничные условия во
Граничные условия используются во
x, y, alpha, xscale, yscale и т.п.) определенных значенийВ этом упражнении мы динамически анимируем красные полоски в верхней части экрана нашего проекта, представляющие собой "окно запуска", в которое должна попасть ракета, чтобы запуск считался успешным.
Мы продолжаем работать с проектом, начатым в предыдущем упражнении.
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 (то есть его центр ушел за левый край сцены), переменной присваивается значение "right". В противном случае, если горизонтальная координата больше 550 (центр клипа вышел за правый край сцены), получает значение "left". Таким образом, значение переменной меняется только в том случае, если произошел выход за одну из границ. Значит, экземпляр клипа будет постоянно двигаться, как предписывает ему второй оператор if. А он говорит, что если имеет значение "right", то горизонтальная координата экземпляра увеличивается на 3 – клип перемещается вправо. В противном случае ( else ; если имеет значение "left" ) горизонтальная координата экземпляра у
меньшается на 3, и клип перемещается влево. Таким образом, в результате выполнения 24 раза в секунду данного скрипта – двух условных операторов – красные полосы будут постоянно находиться в движении, однако не смогут выйти за установленные пределы.
Примечание При программировании граничных условий важно определить, какой обработчик события лучше использовать для анализа положения элемента enterFrame не всегда выгодно; например, если нужно отслеживать положение экземпляра фильма-символа при перетаскивании его мышью, то для этого идеально подойдет обработчик события mouseMove.
Итак, наши два условных оператора работают совместно: направление движения красных полос зависит от того, какая граница была пересечена перед этим (в тот момент переменная получила значение "left" либо "right" ) – полосы движутся в направлении противоположной границы. Наконец, они доходят до этой границы, пересекают ее, и процесс повторяется в противоположном направлении. Проще говоря, если имеет значение "right", то экземпляр движется вправо до тех пор, пока не пересечет правую границу, в этот момент получает значение "left", и начинается обратное движение.

Примечание Начальное положение на сцене нашего экземпляра – на 1 пиксель левее левой границы. Таким образом, при первом выполнении скрипта получит значение "right", и экземпляр будет двигаться вправо.
Как только началось воспроизведение фильма, красные полосы пришли в движение. Дойдя до какого либо из заданных нами ограничителей, они начинают двигаться в противоположную сторону.
Мы продолжим работать с этим файлом в следующем упражнении.
Встречаются ситуации, когда определенные действия могут быть выполнены только в том случае, если что-либо включено. Тот же пример с автомобилем: не включив зажигание, чтобы завести двигатель, вы вряд ли сможете далеко уехать. Нечто подобное может происходить и в ваших фильмах: к определенным частям скрипта можно "приделать выключатель", который будет разрешать или запрещать их выполнение.
Представьте это так: сам скрипт – это некий механизм, "машина", выполняющая определенную задачу. Происходящие в фильме события – "двигатели" скриптов. Условную логику можно использовать как "выключатель", который позволит, когда наступит событие, выполнять все или некоторые действия только при определенных обстоятельствах.
Возьмем для примера такой скрипт:
onClipEvent (enterFrame) {
clock._rotation = clock._rotation + 1;
}
Этот скрипт при входе в каждый кадр (событии enterFrame ) будет поворачивать экземпляр фильма-символа (изображающий, допустим, стрелки часов) на 1 градус – независимо от других событий, происходящих в фильме. А если нам захочется иметь возможность пускать и останавливать часы, тогда скрипт нужно переписать примерно так:
onClipEvent (enterFrame) {
if (power == true) {
clock._rotation = clock._rotation + 1;
}
}
Теперь вращение будет происходить только в том случае, если переменная true. Переменной false или true, используя другой скрипт, присоединенный к кнопке, кадру или другому экземпляру клипа – это, по сути дела, будет "выключатель" для первого скрипта.
Подобная концепция часто используется в приложениях, давая возможность пользователю включать и отключать те или иные возможности программы в диалоговых окнах выбора настроек. В проектах
В следующем упражнении мы применим описанную концепцию для того, чтобы позволить нашей ракете начинать движение только после того, как будет нажата и отпущена кнопа
Мы продолжаем работать с проектом, начатым в предыдущих упражнениях.
onClipEvent (load) {
speed = noThrust;
}
Этот скрипт будет выполнен сразу после значение noThrust. Как вы помните, скрипт, присоединенный нами к экземпляру клипа weather (это было в первом упражнении данного урока) присваивает переменным thrust и noThrust значения в зависимости от значения randomWeather. Таким образом, при выполнении данного скрипта noThrust будет иметь значение 1, 2 или 3 – и это значение будет присвоено переменной , которую мы вскоре используем – она будет определять начальную скорость движения ракеты.
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. Первая часть скрипта гласит, что если переменная имеет значение true, текущую вертикальную координату ракеты следует уменьшить на значение . Таким образом, экземпляр будет перемещаться вверх, но только если переменная равна true ; если же false – не произойдет ничего. Вскоре мы присоединим к кнопке true переменной , тем самым приводя в движение экземпляр rocket. Переменная , как уже было сказано, определяет скорость, с которой ракета будет подниматься.
Совет В приведенном скрипте запись if ( использована вместо if (. Смысл один и тот же, но запись короче. Точно так же, вместо записи if ( можно написать просто if (!.
Сразу после строки скрипта, перемещающей ракету вверх, мы видим еще один оператор if. Обратите внимание – он находится внутри первого равно true. Дело в том, что он проверяет, не вышел ли данный экземпляр за верхний край сцены – а это может случиться только тогда, когда ракета поднимается. Ракета же движется только тогда, когда равно true. Поэтому мы и вставили второй оператор if внутрь первого, иначе его условие проверялось бы постоянно, независимо от того, движется ли ракета или нет ( равно true или false ), а нам ни к чему загружать процессор лишней работой.
Итак, если выполнено условие вложенного оператора if (пересечена значение false – а значит, "отключает" весь этот скрипт. Следующее действие отсылает экземпляр к кадру с меткой off – на монтажном столе фильма-символа это кадр, где ракета изображена без хвоста пламени. Следующее действие отсылает экземпляр клипа к кадру с меткой success, в результате чего в середине экрана появляется надпись "success экземпляр фильма-символа , в результате чего воспроизводится короткая звукозапись, иллюстрирующая успешный запуск.

Как вы уже поняли, ни одно действие из этого скрипта не будет выполнено, пока переменная
on (release) {
rocket.launch = true;
rocket.gotoAndStop ("on");
sounds.gotoAndPlay ("launch");
}
Когда эта кнопка будет отпущена после нажатия, , находящейся на монтажном столе экземпляра клипа rocket, будет присвоено значение true (что приведет ракету в движение – об этом мы говорили на предыдущем шаге). Во-вторых, экземпляр rocket будет отослан к кадру с меткой on, где ракета изображена с хвостом пламени. В-третьих, экземпляр будет отослан к кадру с меткой , где содержится звукозапись, иллюстрирующая работу ракетного двигателя.
on (press) {
rocket.launch = false;
rocket.gotoAndStop ("off");
status.gotoAndStop ("off");
sounds.gotoAndPlay ("intro");
rocket._x = 98;
rocket._y = 352;
}
Мы хотим, чтобы при нажатии этой кнопки выполнялись некоторые действия – все они предназначены для сброса переменных и элементов сцены в начальное состояние, чтобы запуск ракеты можно было повторить. Первое действие присваивает переменной , находящейся на монтажном столе экземпляра rocket, значение false, что прекратит движение ракеты вверх. Три следующих действия возвращают экземпляры фильмов-символов rocket, и к кадрам первоначального состояния. Последние два действия помещают экземпляр rocket вновь на стартовую площадку.
Нажмите кнопку получит значение true. Тем самым будет "включен" скрипт, присоединенный к экземпляру rocket, и ракета начнет подниматься. Как только она пересечет верхний край сцены, упомянутый скрипт "отключится", и произойдут события, показывающие успешный запуск. Вновь нажав и удерживая кнопку
Мы продолжим работать с этим файлом в следующем упражнении.
Взаимодействие между пользователем и вашим фильмом осуществляется, главным образом, через посредство двух устройств: мыши и клавиатуры, причем вариантов их использования может быть много. Пользователь может перемещать мышь, нажимать и отпускать ее кнопки, пользоваться клавиатурой. При помощи условной логики можно запрограммировать фильм так, чтобы он так или иначе реагировал на действия пользователя.
В следующем упражнении мы добавим в наш проект возможность интерактивного взаимодействия: пользователь, нажав клавишу "пробел", сможет включать "ускорители", чтобы ракета поднималась быстрее.
Мы продолжаем работать с проектом, начатым в предыдущих упражнениях.
Для начала вспомним два важных момента. Первое: при загрузке экземпляра клипа weather выполняется скрипт, результаты которого зависят от значения переменной randomWeather. Скрипт не только отображает на экране изображение, соответствующее тем или иным погодным условиям, но также присваивает значения переменным thrust и noThrust. Переменная thrust во всех случаях получает значение, которое в два раза больше, чем значение noThrust. Так, если noThrust получает значение 2, то thrust – 4. Второе: при загрузке экземпляра rocket переменной (находящейся на монтажном столе этого экземпляра) присваивается значение noThrust ; так, если noThrust имеет значение 2, такое же значение получит и переменная . Значение будет присваиваться либо
значение noThrust, либо значение thrust – в зависимости от того, удерживает ли пользователь нажатой клавишу "пробел". Поскольку значение thrust в два раза больше, чем значение noThrust, при нажатом пробеле ракета будет подниматься в два раза быстрее.

onClipEvent (keyDown) {
if (launch key.isDown(key.SPACE)) {
speed = thrust;
_root.thrustBoost.gotoAndStop ("on");
}
}
Этот скрипт будет выполнен при нажатии любой клавиши на клавиатуре, при этом имеет значение true, и при этом нажата клавиша "пробел", будут выполнены два действия. Первое присваивает переменной значение thrust – в результате ракета будет подниматься в два раза быстрее. Второе действие приказывает экземпляру фильма-символа thrustBoost (на сцене он расположен под кнопкой on – в нем находится изображение выполненной большими красными буквами надписи "Thrusters".
Естественно, теперь нам нужно создать механизм отключения ускорителей и возврата ракеты к нормальной скорости; это будет следующий скрипт.
onClipEvent (keyUp) {
if (!key.isDown(key.SPACE)) {
speed = noThrust;
_root.thrustBoost.gotoAndStop ("off");
}
}

Скрипт по своему синтаксису похож на предыдущий, только работает наоборот. Прежде всего, он выполняется в том случае, если клавиша, нажатая на клавиатуре, отпущена. значение noThrust (начальное значение). Второе действие приказывает экземпляру фильма-символа thrustBoost перейти к кадру с меткой off, где надпись "Thrusters" изображена так, как было до включения ускорителей.
Нажмите и отпустите кнопку
Мы продолжим работать с этим файлом в следующем упражнении.
Часто во
Для обнаружения столкновения двух объектов (экземпляров фильмов-символов) в 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 при движении натолкнется на одну из красных полос, ограничивающих наше "окно запуска". Если ракета наткнется на одну из них, запуск будет считаться неудавшимся, если пройдет между ними – запуск успешный.
Мы продолжаем работать с проектом, начатым в предыдущих упражнениях.
Само собой, обе красные полосы входят в состав этого экземпляра клипа. Однако в то же время обе полосы сами являются экземплярами фильма-символа (один экземпляр перевернут). А раз так, мы можем запрограммировать реакцию на столкновение этих экземпляров с экземпляром клипа 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). Если это произошло, выполняются действия в (на монтажном столе экземпляра rocket ) значение false, что приводит к прекращению движения ракеты. Следующее действие перемещает экземпляр rocket к кадру с меткой off (в этом кадре ракета изображена без огненного хвоста). Затем экземпляр клипа перемещается к кадру с меткой – на экране отображается сообщение о том, что миссия закончилась неудачей. И, наконец, экземпляр клипа отсылается к кадру с меткой , в результате воспроизводится звукозапись, и
ллюстрирующая неудачный исход запуска.
Если экземпляр rocket встретится с этим экземпляром, тоже будут выполнены действия, описанные на предыдущем шаге.

Теперь наш проект функционирует полностью! Нажмите кнопку
Этот урок завершен.
Теперь, когда вы умеете использовать в скриптах условную логику, сюжеты ваших фильмов могут стать разветвленными, вплоть до того, что каждый пользователь сможет пройти по фильму своим, уникальным, путем.
Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.