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

Загрузка внешних материалов

< Урок 16 || Урок 17: 12345678

Реакция на события, связанные с динамически загруженными MP3

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

Примечание Многие способы динамического управления звуком обсуждались в Уроке 16, Звук и ActionScript.

Для начала вкратце расскажем, как все это делается вообще.

Часто нужно бывает узнать об окончании воспроизведения звукозаписи. Возьмем для примера презентацию, в которой переход к следующей информационной странице происходит только после того, как закадровый голос закончит комментировать текущую. Или проигрыватель музыки, который должен загружать следующую песню сразу по окончании текущей. Запрограммировать такие вещи вы можете без проблем, воспользовавшись обработчиком события onSoundComplete. Как и в случае с другими методами-обработчиками, этот можно использовать в двух вариантах синтаксиса. Первый способ такой:

mySoundObject.onSoundComplete = function(){
  // выполняемые действия…
}

В этом варианте вы прямо задаете серию действий, которые следует выполнить при наступлении события. Второй вариант синтаксиса выглядит так:

mySoundObject.onSoundComplete = mySoundFunction;

Здесь просто указывается имя функции, которая должна быть вызвана при наступлении события – полезно, если та же функция (тот же набор действий) выполняется и в других местах проекта, при других событиях и т.п.

Примечание Назначить обработчик события onSoundComplete можно лишь в том случае, если объект типа Sound, которому он соответствует, уже существует в фильме. Если объект Sound был удален или пересоздан, нужно заново описывать и обработчик. Другими словами, нельзя назначить обработчик события для несуществующего объекта, и если объект удален или пересоздан, вместе с ним прекращает существование и обработчик.

Примечание Подобным же образом используется и обработчик события onLoad. Его назначение – выполнить набор действий (или функцию), как только завершится загрузка звукозаписи. Но учтите, что этот обработчик работает только для звуков-событий. К сожалению, бетаверсия программы, которой мы пользовались при написании книги, выдавала с этим обработчиком совершенно "неожиданные" результаты. Надеемся, что в окончательной версии все заработает правильно.

Свойство duration объекта типа Sound представляет продолжительность звукозаписи (в миллисекундах). Доступ к этому свойству осуществляется просто:

myVariable = mySoundObject.duration;

Эта строка присваивает переменной myVariable значение, равное продолжительности звукозаписи, находящейся в данный момент в соответствующем объекте типа Sound. Если, к примеру, звукозапись имеет продолжительность 5,5 секунд, то myVariable получит значение 5500 (1000 x 5,5). Это свойство имеет место как для загруженных извне звукозаписей, так и для внутренних, присоединенных методом attachSound().

Если нужно узнать, как далеко продвинулся процесс воспроизведения звукозаписи, используйте еще одно свойство:

myVariable = mySoundObject.position;

Если звукозапись в данном объекте Sound проигрывается уже в течение трех секунд, то переменная myVariable получит значение 3000 (1000 x 3).


В этом упражнении мы с вами применим обработчик события onSoundComplete для вызова функции. Кроме того, используя свойства объекта Sound duration и position, мы создадим индикатор процесса воспроизведения звукозаписей.

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

Это тот файл, над которым мы поработали в предыдущем упражнении. В этом упражнении мы добавим пару строк в скрипт кадра 1, а также присоединим несложный скрипт к экземпляру клипа progress (находится прямо под панелью слайд-шоу).

  1. Открыв панель Действия, выделите кадр 1 слоя Actions и добавьте внутрь оператора if в описании функции changeSlide()следующие строки:
slideSound.onSoundComplete = function(){
  changeSlide(currentSlide + 1);
}

Этим мы описали то, что должно происходить по завершении воспроизведения звукозаписи, загруженной в объект slideSound. Как видите, происходить должен вызов функции changeSlide(). Таким образом мы добавили в наше слайд-шоу механизм автоматического перехода к следующей картинке: как только заканчивается воспроизведение аудиоклипа, загружается следующая картинка и следующая звукозапись.

Закончим наше упражнение, запрограммировав индикатор хода воспроизведения. Сначала, однако, взглянем на его структуру.

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

Этот фильм-символ состоит из трех слоев. Нас больше всего интересует самый нижний слой, который называется bar и содержит 100-кадровую анимацию. Если подвигаете курсор монтажного стола, то увидите, что анимация имитирует индикатор выполнения с диапазоном от 0 до 100 процентов. Сейчас мы напишем скрипт, который будет перемещать это монтажный стол кадр за кадром в зависимости от процента воспроизведения звукового файла. То есть, если проиграно 47 процентов от продолжительности звукозаписи, этот клип переходит к 47 кадру, и т.д.

  1. Вернитесь на главный монтажный стол. Выделите экземпляр клипа progress и введите в панели Действия следующий скрипт:
onClipEvent(enterFrame){
  progressAmount = Math.round(((_root.slideSound.position / _root.slideSound.duration) * 100));
  gotoAndStop(progressAmount);
  if (progressAmount == 100){
    _visible = false;
  }else{
    _visible = true;
  }
}

Этот скрипт, наверное, покажется вам "смутно знакомым". При каждом событии enterFrame обновляется значение переменной progressAmount – оно может быть от 0 до 100. Это процентное значение вычисляется как округленное до целого процентное отношение текущего значения position к duration (то и другое – свойства объекта Sound slideSound ). После этого монтажный стол экземпляра перемещается к кадру, номер которого равен progressAmount.

Оператор if/else делает индикатор невидимым, если progressAmount имеет значение 100 (это на случай, если показана последняя картинка и последняя звукозапись закончилась). При любом другом значении (то есть меньше 100, пока звукозапись проигрывается) экземпляр progress будет видимым.


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

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

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

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

Это упражнение закончено, а с ним и весь урок!

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

На этом заканчивается и книга. Поздравляем! Вы теперь прочно владеете объемом знаний, позволяющих не только понимать, что можно сделать при помощи ActionScript, но и, что более важно, как применить его при создании ваших собственных, уникальных, сложных интерактивных проектов.

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

Итак, творите, выдумывайте, пробуйте – изобретайте новые способы решения прикладных задач при помощи ActionScript. Но не пренебрегайте при этом и изучением опыта других программистов, опыта, накопленного за многие годы. Тогда вам не придется "изобретать велосипед", ломиться через чащобу, когда дорога, оказывается, давно проложена. Чем глубже вы будете вникать в возможности ActionScript, тем большее удовольствие будете испытывать от творческого процесса. Ключевое слово здесь – "удовольствие"! Итак, давайте, покажите миру, на что вы способны.

< Урок 16 || Урок 17: 12345678
Салтанат Бектегенова
Салтанат Бектегенова

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

 

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

Вот задание:

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

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