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

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

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

Отслеживание процессов воспроизведения и загрузки

Число кадров в фильме и размер входящих в его состав файлов определяют общую длину фильма и размер SWF-файла – этот факт станет очевидным, если даже просто взглянуть на главный монтажный стол фильма. Общее число кадров в фильме представлено значением свойства _totalframes. Так, если основной монтажный стол содержит 400 кадров (в одной сцене или нескольких), мы могли бы установить это следующим образом:

_root._totalframes = 400;

Это свойство можно использовать в скриптах, чтобы определить общую длину фильма (в кадрах).

Примечание Свойство totalframes имеет атрибут "только для чтения", то есть его значение автоматически устанавливает Flash (подсчитывая общее число кадров на монтажном столе). Поэтому даже не пытайтесь сами изменить значение этого свойства – это невозможно!

Итак, зная это значение, мы можем использовать его, вместе с другими свойствами фильма, для контроля хода воспроизведения или загрузки. Например, сравнивая значение свойства _totalframes со значением свойства _currentframe, мы можем определить, сколько осталось до конца фильма:

framesLeft = _root._totalframes - _root._currentframe;
message.text = "До конца осталось " + framesLeft + " кадров."

Поскольку Flash основан на потоковой технологии, процесс просмотра (воспроизведения) SWF с вебсайта происходит кадр за кадром по мере загрузки. Еще одно свойство, _framesloaded, содержит общее число уже загруженных кадров. Значение этого свойства можно сравнить со значением свойства _totalframes, чтобы получить информацию о ходе загрузки. В следующем упражнении мы продемонстрируем создание индикатора выполнения (будем называть его предзагрузчиком), показывающего процент загруженных кадров.

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

Этот проект состоит из двух сцен: Preloader и Content. Сцена Content содержит несколько слоев графики и анимации, которые нужны нам просто для демонстрации работы индикатора-предзагрузчика. Вся наша работа в этом упражнении будет происходить в сцене Preloader, которая состоит из трех слоев: Background, Preloader и Actions. Слой Background содержит фон – квадрат, залитый радиальным градиентом. Слой Actions содержит действие stop(), предотвращающее самопроизвольное проигрывание монтажного стола. Слой Preloader содержит два элемента: надпись "now loading…" и экземпляр клипа под названием preloader, состоящий из элементов, которые должны показывать ход загрузки. Давайте познакомимся с этим экземпляром поближе.

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

Монтажный стол этого клипа состоит из четырех слоев, названных в соответствии с их содержимым. Наиболее важными на этом монтажном столе являются два элемента: текстовое поле под названием info, расположенное в слое Text, и анимацию (с построением промежуточных изображений) в слое Amount. Анимация представляет собой 100-кадровый индикатор выполнения – от 0 до 100 процентов. Наш скрипт будет, среди прочего, продвигать этот монтажный стол от кадра к кадру по мере загрузки кадров основного фильма. В результате будет "двигаться" и индикатор выполнения.


  1. Вернитесь на основной монтажный стол. Откройте панель Действия, выделите экземпляр клипа preloader и введите такой скрипт:
onClipEvent (enterFrame) {
  framesLoaded = (Math.ceil (( _parent._framesloaded / _parent._totalframes) * 100));
  gotoAndStop (framesLoaded);
  info.text = framesLoaded + "% completed";
  if (framesLoaded >= 90) {
    _root.gotoAndPlay (2);
  }
}

Выполнение этого скрипта будет происходить с наступлением события enterFrame (24 раза в секунду), то есть он будет немедленно реагировать на изменения, происходящие в процессе загрузки, точно отображая его ход на экране.

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

_parent._framesloaded / _parent._totalframes

В этой части выражения берется число уже загруженных кадров главного монтажного стола и делится на общее число кадров главного монтажного стола.

Примечание Поскольку этот скрипт присоединен к экземпляру клипа preloader, который находится на главном монтажном столе, мы использовали для указания на главный монтажный стол адресную ссылку _parent. Благодаря этому клип preloader можно без всяких изменений вставить и в любой другой проект.


Для примера предположим, что фильм содержит 735 кадров, из которых 259 уже загружено. В этом случае данная часть выражения получится такой:

259 / 735

В результате получится 0,3523. На следующем этапе выражения этот результат умножается на 100:

* 100

В результате получаем 35,23. И наконец, с помощью метода Math.ceil() это значение округляется до целого числа в большую сторону, и переменной framesLoaded присваивается значение 36. Напомним, что этот скрипт выполняется 24 раза в секунду, это число будет увеличиваться по мере загрузки фильма.

Совет Свойства _framesloaded и _totalframes, примененные в этом скрипте, можно заменить методами объекта MovieClip – getBytesLoaded() и getBytesTotal(), если вы хотите, чтобы индикатор выполнения вел отсчет, основываясь на реально загруженных байтах, а не кадрах. Иногда такой способ предпочтительнее, поскольку кадр будет считаться загруженным (и индикатор продвинется) только после того, как будут загружено все, что в кадре содержится. Поэтому, если в процессе загрузки будут встречаться сложные, многобайтные кадры, индикатор будет приостанавливаться на заметное время, продвигаться рывками. Если же отслеживать загрузку по байтам, то индикатор будет двигаться гладко, ведь данные о загрузке байтов данных обновляются гораздо чаще (с каждым загруженным байтом). На CD вы найдете бонусный файл, демонстрирующий именно такой индикатор.

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

Следующее действие скрипта отображает текст в поле info. Здесь значение framesLoaded соединяется со строкой "% completed". Если framesLoaded имеет значение 36, то получится "36% completed".

Последняя часть этого скрипта – условный оператор, определяющий момент, когда работу предзагрузчика следует завершить. Если значение framesLoaded больше или равно 90, главный монтажный стол должен перейти к кадру 2 (которым на самом деле будет сцена Content) и оттуда продолжить воспроизведение фильма.

Совет Значение 90 в этом условном операторе легко можно заменить любым другим – все зависит от того, в какой момент вы хотите прекратить работу предзагрузчика и запустить основной фильм.

  1. Командой Управление > Проверить фильм (Control > Test Movie) запустите тест проекта. Когда тестовый фильм запустится, выполните команду меню Отладка > 56K (Debug > 56K), а затем команду Вид > Показать поток (View > Show Streaming).

Так мы сможем получить достаточно точную симуляцию загрузки фильма через модем на скорости 56K, и сможем увидеть работу нашего предзагрузчика. По мере загрузки фильма вы увидите, как обновляется процент загрузки и движется индикатор выполнения. Как и было сказано на предыдущем шаге, индикатор продвигается до 90 процентов, после чего монтажный стол перемещается к сцене Content и проигрывает фильм дальше.

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

Упражнение закончено.

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

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

 

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

Вот задание:

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

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