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

Применение обработчиков событий

  1. Сразу после предыдущего скрипта добавьте следующий:
onClipEvent (mouseMove) {
  if (_root._xmouse > Number(_root.mouseXPosition.text) + 10) {
    _root.lights.gotoAndStop("right");
    _root.message.text = "Нарушитель движется к востоку";
  } else if (_root._xmouse < Number(_root.mouseXPosition.text) - 10) {
    _root.lights.gotoAndStop("left");
    _root.message.text = "Нарушитель движется к западу";
  } else if (_root._ymouse > Number(_root.mouseYPosition.text) + 10) {
    _root.lights.gotoAndStop("bottom");
    _root.message.text = "Нарушитель движется к югу";
  } else if (_root._ymouse < Number(_root.mouseYPosition.text) - 10) {
    _root.lights.gotoAndStop("top");
    _root.message.text = "Нарушитель движется к северу";
  }
  _root.mouseXPosition.text = _root._xmouse;
  _root.mouseYPosition.text = _root._ymouse;
}

Действия этого скрипта выполняются при перемещении мыши. Оператор if/else if сравнивает текущее положение мыши с предыдущим и действует соответственно. Мы разберем лишь первую секцию в этом операторе, остальные три – просто ее вариации. Прежде всего, вы должны вспомнить, что в обработчике события load, который мы написали несколько шагов назад, содержались два действия, выводившие в текстовые поля mouseXPosition и mouseYPosition значения текущих X и Y координат мыши в момент загрузки фильма-символа burglar. Теперь, в этом скрипте, мы воспользовались теми текстовыми значениями. Поскольку в нашем операторе if/else if выполняются математические сравнения, значения текстовых полей необходимо преобразовать в числа, что мы и делаем при помощи функции Number(), упоминавшейся в Уроке 1. Таким образом, скрипт имеет дело с числовыми значениями, а не с текстом.

В первой секции скрипта объявляется, что если текущая горизонтальная координата мыши ( _root._xmouse ) больше, чем значение mouseXPosition плюс 10, следует выполнить два действия. Сравнивая текущие координаты мыши с последними записанными координатами, мы можем определить направление движения мыши. Например, если текущая горизонтальная координата мыши ( _root._xmouse ) равна 300, а ранее записанная координата (отображенная в текстовом поле _root.mouseXPosition ) равна 200, мы будем знать, что мышь перемещается вправо – ведь координата 300 находится правее, чем 200. В таком случае должны быть выполнены два действия: одно перемещает экземпляр фильма-символа light к кадру с меткой right (при этом будет освещена правая часть сцены), другое выводит в текстовом поле message сообщение "Нарушитель движется к востоку". Всего наш оператор if включает четыре условия – для случаев перемещения мыши вправо, влево, вверх и вниз.

Примечание Учтите, что хотя мышь может перемещаться одновременно по двум координатам (то есть по диагонали – например, вправо и вверх), наш скрипт распознает только "однонаправленное" движение. При этом перемещение по горизонтали (вправо и влево) имеет более высокий приоритет, чем по вертикали (вверх и вниз). Так, если мышь движется влево и вниз, скрипт обнаружит только перемещение влево. Причина в том, что так построен наш оператор if. Прежде всего он проверяет, не переместилась ли мышь вправо. Если это так, то выполняются два соответствующих этому случаю действия, а остальные три секции – else if – пропускаются. Если же обнаружилось, что вправо мышь не перемещается, то первая секция оператора if игнорируется, и скрипт проверяет, не переместилась ли мышь влево. Если так, выполняются два соответствующих действия, а оставшиеся секции else if пропускаются. Если движения влево тоже не обнаружено, таким же образом проверяется перемещение вниз, потом вверх. Короче говоря, как только обнаружено перемещение по какому-либо направлению, проверка заканчивается. В соответствии с порядком условий оператора if, если обнаружено перемещение вправо или влево, то перемещение вверх и вниз уже не учитывается.

Нужно еще заметить, что в каждом неравенстве - условии мы прибавляем или вычитаем 10 из значений mouseXPosition и mouseYPosition, поэтому, пока мышь не переместится по меньшей мере на 10 пикселей от предыдущей записанной позиции, никакие действия не выполняются. Если бы мы не установили этого 10-пиксельного ограничения, то при перемещении мыши экран выглядел бы наподобие фейерверка!

Два последних действия в нашем скрипте (помещенные после оператора if, перед последней закрывающей фигурной скобкой) записывают текущие координаты мыши по X и Y. При следующем выполнении этого скрипта (то есть при перемещении мыши) эти значения будут вновь использованы оператором if. Значения помещаются в текстовые поля mouseXPosition и mouseYPosition, таким образом, все изменения положения мыши сразу же отображаются в этих полях.

Итак: данный скрипт сравнивает текущее положение мыши с предыдущим записанным положением; предпринимает действия в зависимости от того, куда переместилась мышь – вправо, влево, вниз или вверх; затем записывает текущие координаты мыши – для следующего сравнения.

  1. После предыдущего скрипта добавьте следующий:
onClipEvent (unload) {
  _root.time = 0;
  _root.timeAmount = _root.time;
  _root.timer._rotation = 0;
  _root.message.text = "Все чисто";
  _root.mouseXPosition.text = "";
  _root.mouseYPosition.text = "";
  _root.lights.gotoAndStop ("Off");
}

Этот скрипт указывает, что следует сделать, если данный экземпляр фильма-символа ( burglar ) выгружен, не присутствует более на сцене (в результате того, что основной монтажный стол переместился к кадру, в котором этот фильм отсутствует). Это происходит при нажатии на кнопку No Burglar – основной монтажный стол переходит к кадру с меткой Clear (кадр 1).

Действия возвращают все элементы к их первоначальному состоянию (какими они были до того, как вор появился на сцене). Первое действие сбрасывает на 0 переменную time; следующее – отображает в текстовом поле timeAmount значение переменной time (то есть тот же 0); следующее действие сбрасывает на 0 угол поворота экземпляра фильма-символа timer; за ним идет действие, отображающее в текстовом поле message надпись "Все чисто"; два следующих действия очищают текстовые поля mouseXPosition и mouseYPosition; последнее действие перемещает экземпляр фильма-символа lights к кадру с меткой Off – сцена вновь становится черной, неосвещенной.

  1. Добавьте после предыдущего следующий скрипт:
onClipEvent (mouseDown) {
  this.gotoAndStop("right");
  _root.message.text = "Нарушитель растерян";
}

При нажатии кнопки мыши (в любом месте экрана) будут выполнены эти два действия. Первое отправляет экземпляр фильма-символа burglar ( this ) к кадру с меткой right. В этом кадре изображение вора "смотрит" направо. Кроме того, воспроизводится коротенький аудиоклип, как будто вор воскликнул "Oh, no!". Второе действие выводит в поле message надпись "Нарушитель растерян".

  1. Добавьте после предыдущего скрипта следующий:
onClipEvent (mouseUp) {
  this.gotoAndStop("left");
  _root.message.text = "Нарушитель убегает";
}

Эти два действия будут выполнены, когда кнопка мыши будет отпущена в любом месте экрана. Первое действие переводит экземпляр фильма-символа burglar(this) к кадру с меткой left. В этом кадре изображение вора "смотрит" налево. Второе действие выводит в поле message надпись "Нарушитель убегает".

  1. Добавьте после предыдущего скрипта следующий:
onClipEvent (keyDown) {
  _root.siren.gotoAndStop("on");
  _root.message.text = "Вызвана подмога";
}

Эти два действия будут выполнены при нажатии любой клавиши на клавиатуре. Первое действие переводит экземпляр фильма-символа siren к кадру с меткой on – воспроизводится звук сирены. Второе действие выводит в поле message надпись "Вызвана подмога".

  1. Добавьте после предыдущего скрипта следующий:
onClipEvent (keyUp) {
  stopAllSounds ();
  _root.siren.gotoAndStop("off");
  _root.message.text = "Активирован бесшумный сигнал";
}

Эти три действия выполняются при отпускании нажатой клавиши. Первое действие останавливает воспроизведение всех звукозаписей, в том числе сигнала сирены. Второе переводит экземпляр фильма-символа siren к кадру с меткой off –сирена отключается. Последнее действие выводит в поле message надпись "Активирован бесшумный сигнал".

Примечание Поскольку эти обработчики событий клипа mouseDown/mouseUp и keyDown/keyUp присоединены к экземпляру фильма-символа burglar, они будут действовать лишь в том случае, если этот экземпляр присутствует на сцене.

Программирование нашего проекта завершено.

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

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

  1. Закройте тестовое окно и сохраните свою работу как ClipEvents2.fla.

На этом упражнение завершено.

Салтанат Бектегенова
Салтанат Бектегенова

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

 

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

Вот задание:

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

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