Опубликован: 04.11.2006 | Уровень: специалист | Доступ: платный
Урок 9:

Использование условной логики

< Урок 8 || Урок 9: 1234567 || Урок 10 >

Включение/Выключение

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

Представьте это так: сам скрипт – это некий механизм, "машина", выполняющая определенную задачу. Происходящие в фильме события – "двигатели" скриптов. Условную логику можно использовать как "выключатель", который позволит, когда наступит событие, выполнять все или некоторые действия только при определенных обстоятельствах.

Возьмем для примера такой скрипт:

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.

  1. Откройте файл rocketLaunch3.fla из папки Lesson09/Assets.

Мы продолжаем работать с проектом, начатым в предыдущих упражнениях.

  1. Откройте панель Действия, выделите экземпляр фильма-символа rocket и введите такой скрипт:
onClipEvent (load) {
  speed = noThrust;
}

Этот скрипт будет выполнен сразу после загрузки данного фильма-символа. Единственное предназначение скрипта – присвоить переменной speed значение noThrust. Как вы помните, скрипт, присоединенный нами к экземпляру клипа weather (это было в первом упражнении данного урока) присваивает переменным thrust и noThrust значения в зависимости от значения randomWeather. Таким образом, при выполнении данного скрипта noThrust будет иметь значение 1, 2 или 3 – и это значение будет присвоено переменной speed, которую мы вскоре используем – она будет определять начальную скорость движения ракеты.

  1. После предыдущего скрипта поместите следующий:
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 – сейчас мы ее запрограммируем.

  1. При открытой панели Действия выделите кнопку Launch и добавьте к ней такой скрипт:
on (release) {
  rocket.launch = true;
  rocket.gotoAndStop ("on");
  sounds.gotoAndPlay ("launch");
}

Когда эта кнопка будет отпущена после нажатия, ActionScript выполнит три действия. Во-первых, переменной launch, находящейся на монтажном столе экземпляра клипа rocket, будет присвоено значение true (что приведет ракету в движение – об этом мы говорили на предыдущем шаге). Во-вторых, экземпляр rocket будет отослан к кадру с меткой on, где ракета изображена с хвостом пламени. В-третьих, экземпляр sounds будет отослан к кадру с меткой launch, где содержится звукозапись, иллюстрирующая работу ракетного двигателя.

  1. После предыдущего скрипта добавьте следующий:
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 вновь на стартовую площадку.

  1. Командой Управление > Проверить фильм (Control > Test Movie) запустите тест проекта.

Нажмите кнопку Launch. Как только вы ее отпустите, переменная launch получит значение true. Тем самым будет "включен" скрипт, присоединенный к экземпляру rocket, и ракета начнет подниматься. Как только она пересечет верхний край сцены, упомянутый скрипт "отключится", и произойдут события, показывающие успешный запуск. Вновь нажав и удерживая кнопку Launch, вы сбросите сцену в начальное положение. Как только отпустите кнопку, процесс повторится.

  1. Закрыв тестовый фильм, вернитесь в среду разработки и сохраните свою работу как rocketLaunch4.fla.

Мы продолжим работать с этим файлом в следующем упражнении.

< Урок 8 || Урок 9: 1234567 || Урок 10 >
Салтанат Бектегенова
Салтанат Бектегенова

Дострочное пересдача экзамена

 

Евгений Стародубцев
Евгений Стародубцев

Вот задание:

7. Открыв панель Действия (Actions) и установив ее в Экспертный режим(Expert Mode), выделите кадр 1 слоя Actions и введите следующий скрипт:

Евгения Дегтяренко
Евгения Дегтяренко
Украина, Запорожье
Анна Елисеева
Анна Елисеева
Россия, Великий Новгород, Ногородский государственный университет имени Ярослава Мудрого, 2003