Управление воспроизведением фрагмента ролика

Flash Player 9 и более поздних версий, Adobe AIR 1.0 и более поздних версий

Flash использует концепцию временной шкалы для передачи анимации или изменения состояния. Любой визуальный элемент, использующий временную шкалу, должен являться объектом MovieClip или расширением класса MovieClip. Хотя ActionScript может предписать любому фрагменту ролика начать, остановить воспроизведение или перейти к другой точке на временной шкале, с помощью кода нельзя динамически создать временную шкалу или добавлять содержимое в определенные кадры — это можно сделать только в инструменте разработки Flash.

Когда воспроизводится экземпляр MovieClip, точка воспроизведения перемещается вперед по временной шкале со скоростью, определяемой частотой кадров SWF-файла. Эту настройку можно также переопределить, задав свойство Stage.frameRate в ActionScript.

Начало и остановка воспроизведения фрагментов роликов

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

bicycle.stop();

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

// This function will be called when the button is clicked. It causes the  
// bicycle animation to play. 
function playAnimation(event:MouseEvent):void 
{ 
    bicycle.play(); 
} 
// Register the function as a listener with the button. 
startButton.addEventListener(MouseEvent.CLICK, playAnimation);

Перемотка вперед и назад

Контролировать воспроизведение фрагмента ролика можно не только с помощью методов play() и stop() . Также можно перемещать точку воспроизведения вперед или назад по временной шкале с помощью методов nextFrame() и prevFrame() . Вызов любого из этих методов останавливает воспроизведение и перемещает точку воспроизведения соответственно на один кадр вперед или назад.

Использование метода play() аналогично вызову nextFrame() каждый раз, когда отправляется событие enterFrame фрагмента ролика. Подобным образом можно воспроизвести фрагмент ролика bicycle в обратном направлении, если создать прослушиватель события enterFrame и с помощью функции прослушивателя предписать экземпляру bicycle переходить к предыдущему кадру, как показано в следующем примере.

// This function is called when the enterFrame event is triggered, meaning  
// it's called once per frame. 
function everyFrame(event:Event):void 
{ 
    if (bicycle.currentFrame == 1) 
    { 
        bicycle.gotoAndStop(bicycle.totalFrames); 
    } 
    else 
    { 
        bicycle.prevFrame(); 
    } 
} 
bicycle.addEventListener(Event.ENTER_FRAME, everyFrame);

Если фрагмент ролика содержит более одного кадра, то при обычном воспроизведении он будет воспроизводиться бесконечно, то есть после прохождения последнего кадра он будет возвращаться к кадру 1. Когда используется метод prevFrame() или nextFrame() , это поведение не включается автоматически (вызов метода prevFrame() при достижении кадра 1 не переводит точку воспроизведения на последний кадр). Условие if в описанном выше примере проверяет, дошла ли точка воспроизведения до первого кадра, и устанавливает ее на последний кадр, чтобы создать непрерывный цикл обратного воспроизведения фрагмента ролика.

Переход к другому кадру с помощью меток кадров

Отправить точку воспроизведения фрагмента ролика на другой кадр совсем не трудно. Вызов метода gotoAndPlay() или gotoAndStop() переведет точку воспроизведения фрагмента ролика к кадру с порядковым номером, указанным в качестве параметра. Также можно передать строку, соответствующую имени метки кадра. Любому кадру на временной шкале можно присвоить метку. Для этого выберите кадр на временной шкале и введите имя в поле «Метка кадра» в инспекторе свойств.

Преимущества использования меток, а не номеров кадров, особенно очевидны при создании сложного фрагмента ролика. Когда количество кадров, слоев и анимаций движения становится очень большим, следует присвоить важным кадрам описательные метки, обозначающие изменение поведения фрагмента ролика (например, «выкл.», «пешком», «бегом»). Это улучшает удобочитаемость кода и предоставляет гибкость, так как вызовы ActionScript, переходящие к кадру с меткой, указывают на уникальную точку (метку), а не на номер кадра. Если позднее вы решите переместить определенный сегмент анимации в другой кадр, то вносить изменения в код ActionScript не потребуется, так как для кадров в новом местоположении сохранится прежняя метка.

Для представления меток кадров в коде ActionScript 3.0 используется класс FrameLabel. Каждый экземпляр этого класса представляет одну метку кадра и имеет свойство name , представляющее имя метки кадра, заданное в инспекторе свойство, и свойство frame , представляющее номер кадра на временной шкале, которому присвоена метка.

Чтобы получить доступ к экземплярам FrameLabel, связанным с экземпляром фрагмента ролика, класс MovieClip включает два свойства, напрямую возвращающие объекты FrameLabel. Свойство currentLabels возвращает массив, содержащий все объекты FrameLabel на временной шкале фрагмента ролика. Свойство currentLabel возвращает строку с именем последней пройденной метки кадра на временной шкале.

Допустим, что вы создали фрагмент ролика с именем robot и пометили различные состояния его анимации. Можно настроить условие, которое проверяет свойство currentLabel для получения текущего состояния объекта robot , как в следующем коде.

if (robot.currentLabel == "walking") 
{ 
    // do something  
}

Проигрыватель Flash Player 11.3 и приложение AIR 3.3 добавили событие frameLabel в класс FrameLabel. Экземпляру FrameLabel, представляющему метку кадра, можно назначить обработчик событий. Событие отправляется, когда указатель воспроизведения достигает кадра.

В следующем примере создается экземпляр FrameLabel для второй метки кадра в массиве меток кадров для MovieClip. Затем регистрируется обработчик события frameLabel :

var myFrameLabel:FrameLabel = robot.currentLabels[1]; 
myFrameLabel.addEventListener(Event.FRAME_LABEL, onFrameLabel); 
 
function onFrameLabel(e:Event):void { 
    //do something 
}

Работа с монтажными кадрами

В среде разработки Flash монтажные кадры можно использовать для разделения последовательных временных шкал, через которые проходит SWF-файл. Используя второй параметр методов gotoAndPlay() и gotoAndStop() , можно задать монтажный кадр, к которому должна перейти точка воспроизведения. Все FLA-файлы начинаются только с исходного монтажного кадра, но можно создавать и другие монтажные кадры.

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

Свойство scenes класса MovieClip возвращает массив объектов Scene, представляющих все монтажные кадры в SWF-файле. Свойство currentScene возвращает объект Scene, представляющий монтажный кадр, который воспроизводится в данный момент.

Класс Scene имеет несколько свойств, предоставляющих информацию о монтажном кадре. Свойство labels возвращает массив объектов FrameLabel, представляющих метки кадров в данном монтажном кадре. Свойство name возвращает имя монтажного кадра в виде строки. Свойство numFrames возвращает целое число, представляющее общее количество кадров в монтажном кадре.