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

Привязка динамики к времени и кадрам

< Урок 14 || Урок 15: 12345 || Урок 16 >

Управление скоростью и направлением воспроизведения монтажного стола

В нормальной ситуации монтажный стол фильма проигрывается в прямом направлении и со скоростью, определяемой значением fps (кадры в секунду), указанным в настройках параметров фильма. Однако вы можете сами управлять как направлением, так и скоростью воспроизведения монтажного стола при помощи ActionScript. Фактически, комбинируя обработку события enterFrame с различными элементами ActionScript, вы можете получить практически абсолютный контроль над монтажным столом вашего проекта.

Здесь первым делом нам с вами следует поговорить о таких методах объекта MovieClip, как nextFrame() и prevFrame(). C их помощью можно перемещать монтажный стол к следующему или предыдущему кадру:

on (release) {
  myMovieClip.nextFrame();
}

или

on (release) {
  myMovieClip.prevFrame();
}

Присоединив такие скрипты к кнопкам, мы получим кнопки навигации, обеспечивающие продвижение по монтажному столу вперед или назад, по одному кадру за каждое нажатие кнопки.

Нельзя не упомянуть о таком свойстве монтажного стола, как _currentframe (свойство только для чтения). Его значение – это номер кадра, на котором в данный момент находится курсор воспроизведения. Например, предположим, что основной монтажный стол воспроизводится, тогда следующий скрипт поместит в переменную whereWeAre числовое значение, соответствующее номеру текущего кадра:

whereWeAre = _root._currentframe;

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

onClipEvent (enterFrame) {
  if (_root._currentframe >= 50 && _root.currentframe <= 100)
    // Выполнить эти действия
  }
}

В этом скрипте действия в теле условного оператора выполняются только в том случае, если курсор воспроизведения основного монтажного стола находится между 50-м и 100-м кадрами.

А если использовать свойство _currentframe вместе с действием gotoAndPlay(), то можно управлять и направлением, и скоростью воспроизведения монтажного стола. Возьмем такой пример:

_root.gotoAndPlay(_currentframe + 10);

Эта строка приведет к тому, что курсор воспроизведения основного монтажного стола "перепрыгнет" на 10 кадров вперед от текущей позиции. Точно так же можно переместиться по монтажному столу на 10 кадров назад:

_root.gotoAndPlay(_currentframe - 10);

Как вы увидите в этом упражнении, используя для выполнения подобной строки скрипта событие enterFrame, можно запрограммировать кнопки "перемотки" вперед и назад.

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

Мы продолжаем работу над проектом, начатым в предыдущем упражнении. На сей раз мы будем работать по большей части со сценой Messages. Однако сначала нужно обеспечить в нашем проекте саму возможность перехода к этой сцене. Для этого у нас предназначена кнопка с надписью "Get phone messages" (в левом верхнем углу сцены Alarm). Давайте напишем скрипт для этой кнопки.

  1. Откройте панель Действия, выделите кнопку "Get phone messages" и введите такой скрипт:
on (release) {
  nextFrame();
}

Когда пользователь нажмет и отпустит эту кнопку, основной монтажный стол продвинется на один кадр вперед. А поскольку в этой сцене всего один кадр, следующим кадром будет считаться следующая сцена. Таким образом, это действие переместит монтажный стол к сцене Messages, с которой мы дальше и будем работать.

  1. Откройте панель Сцена (Scene) и выберите из списка сцену Messages, чтобы отобразить ее в среде разработки.

Эта сцена состоит из четырех слоев. Слой Background содержит общее графическое оформление. В слое Buttons находятся четыре кнопки: Play, Stop, FF и Rew. Слой Flashing Indicator содержит экземпляр клипа, изображающего светящуюся цифру 4. В слое Sound Clip находится пустой (в смысле графики) экземпляр клипа – он располагается чуть выше сцены, слева. Имя этого экземпляра – messages, и сейчас мы познакомимся с ним поближе.


  1. Двойным щелчком на экземпляре клипа messages откройте его для редактирования на месте.

Монтажный стол этого клипа состоит из двух слоев – Sound Clips и Actions. Кадр 1 слоя Actions содержит действие stop(), предотвращающее самопроизвольное проигрывание этого монтажного стола. В слое Sound Clips находится серия потоковых звуковых клипов, занимающих в общей сложности 700 кадров (можете вручную протащить курсор воспроизведения и послушать эти клипы). В этом упражнении мы запрограммируем на основном монтажном столе кнопки, которые позволят пользователю перемещаться по данному монтажному столу вперед и назад.

  1. Вернитесь на основной монтажный стол. Выделите экземпляр клипа messages и введите в панели Действия следующий скрипт:
onClipEvent (enterFrame) {
  if (action == "ff") {
    gotoAndStop (_currentframe + 3);
  } else if (action == "rew") {
    gotoAndStop (_currentframe - 10);
  } else if (action == "play") {
    play();
  } else if (action == "stop") {
    stop();
  }
}

Этот скрипт выполняется обработчиком события enterFrame, а значит, условный оператор будет 24 раза в секунду анализировать значение переменной action и выполнять те или иные действия. А значение этой переменной, как вы вскоре увидите, будет меняться при нажатии кнопок Play, Stop, FF и Rew.

Первая часть условного оператора гласит, что если переменная action имеет значение "ff" (она получит его при нажатии кнопки FF), текущий фильм (то есть клип messages ) должен перейти на три кадра вперед от текущего положения и остановиться. Учитывая, что этот скрипт выполняется 24 раза в секунду, вы поймете, что пока action равно "ff" (то есть, пока нажата кнопка FF), монтажный стол будет продвигаться вперед, прыгая через три кадра, имитируя процесс "быстрой перемотки" вперед.


Следующая часть условного оператора имеет эффект прямо противоположный. Здесь говорится, что если action имеет значение "rew" (так будет при нажатии кнопки Rew), текущий фильм должен переместиться на 10 кадров назад от текущего положения и там остановиться. Опять же, поскольку этот скрипт выполняется 24 раза в секунду, пока action равно "rew" (пока нажата кнопка Rew), монтажный стол будет продвигаться назад, прыгая через 10 кадров, что даст эффект "быстрой перемотки" назад.

Третья часть условного оператора гласит, что если action имеет значение "play" (это значение переменная может получить при щелчке на кнопке Play либо в момент отпускания кнопок FF и Rew), фильм просто начинает проигрываться с текущего кадра.

Последняя часть условного оператора выполняется, если action имеет значение "stop" (если нажата и отпущена кнопка Stop). В этом случае воспроизведение текущего фильма останавливается.

А теперь давайте займемся нашими кнопками.

  1. Выделите кнопку Play и введите в панели Действия следующий скрипт:
on (release) {
  messages.action = "play";
}

Если пользователь нажмет и отпустит эту кнопку, переменная action (на монтажном столе messages ) получит значение "play". В результате присоединенный к этому экземпляру скрипт (описанный на предыдущем шаге) выполнит соответствующее действие.

  1. Выделите кнопку Stop и присоедините к ней следующий скрипт:
on (release) {
  messages.action = "stop";
}

Когда пользователь нажмет и отпустит эту кнопку, переменная action (на монтажном столе messages ) получит значение "stop". В результате присоединенный к этому экземпляру скрипт (описанный на шаге 5) выполнит соответствующее действие.

  1. Выделите кнопку FF и присоедините к ней следующий скрипт:
on (press) {
  messages.action = "ff";
  fastSound = new Sound();
  fastSound.attachSound("rewind");
  fastSound.start(0, 50);
}
on (release) {
  messages.action = "play";
  fastSound.stop();
}

Для этой кнопки обрабатываются два события: нажатие и отпускание. Когда пользователь нажмет кнопку, переменная action (на монтажном столе messages ) получит значение "ff", и присоединенный к этому экземпляру скрипт (описанный на шаге 5) выполнит соответствующее действие. Но это не все. Для имитации звука перемотки создается объект типа Sound, к нему присоединяется библиотечный файл звукозаписи "rewind", после чего этот звук воспроизводится, повторяясь 50 раз.


Примечание Для простоты мы использовали звук "rewind" для имитации звука перемотки и вперед (здесь), и назад (на следующем шаге) – ведь и в действительности эти звуки похожи.

  1. Выделите кнопку Rew и присоедините к ней следующий скрипт:
on (press) {
  messages.action = "rew";
  fastSound = new Sound();
  fastSound.attachSound("rewind");
  fastSound.start(0, 50);
}
on (release) {
  messages.action = "play";
  fastSound.stop();
}

Эта кнопка работает точно так же, что и предыдущая, за исключением того, что здесь переменной action присваивается значение "rew".

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

Когда фильм запустится, нажмите кнопку "Get phone messages", чтобы перейти к следующей сцене фильма. В появившейся новой сцене попробуйте, нажимая разные кнопки, управлять проигрыванием экземпляра клипа messages. При нажатой кнопке FF монтажный стол будет быстро "перематываться" вперед, при нажатой кнопке Rew – назад (это можно понять по тем звуковым клипам, которые будут воспроизводиться после "перемотки").

  1. Закройте тестовый фильм и сохраните проект под именем makeMyDay4.fla.

Кнопки управления воспроизведением, подобные тем, что мы создали, могут найти самое широкое применение – не только при потоковом воспроизведении звукозаписей (как у нас), но и в любом проекте, содержащем сотни кадров.

< Урок 14 || Урок 15: 12345 || Урок 16 >
Салтанат Бектегенова
Салтанат Бектегенова

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

 

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

Вот задание:

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

Анатолий Федоров
Анатолий Федоров
Россия, Москва, Московский государственный университет им. М. В. Ломоносова, 1989