Controle de reprodução de clipe de filme

Flash Player 9 e posterior, Adobe AIR 1.0 e posterior

O Flash usa a metáfora de uma linha de tempo para transmitir uma animação ou uma alteração de estado. Qualquer elemento visual que empregue uma linha de tempo deve ser um objeto MovieClip ou uma extensão da classe MovieClip. Embora o ActionScript possa instruir qualquer clipe de filme a parar, reproduzir ou ir para outro ponto na linha de tempo, ele não pode ser usado para criar dinamicamente uma linha de tempo ou adicionar conteúdo a quadros específicos; isso só é possível usando a ferramenta de autoria do Flash.

Ao ser reproduzido, o MovieClip avança na linha de tempo em uma velocidade controlada pela velocidade de projeção do arquivo SWF. Se desejar, você pode substituir essa configuração definindo a propriedade Stage.frameRate no ActionScript.

Reproduzir clipes de filme e parar a reprodução

Os métodos play() e stop() permitem o controle básico de um clipe de filme na linha de tempo. Por exemplo, suponha que você tenha um símbolo de clipe de filme no Palco que contém uma animação de uma bicicleta se movendo pela tela, com o nome de ocorrência definido como bicycle . Se o seguinte código for anexado a um quadro-chave na linha de tempo principal,

bicycle.stop();

a bicicleta não se moverá (a animação não será reproduzida). O movimento da bicicleta pode começar por meio de outra interação do usuário. Por exemplo, se você tivesse um botão chamado startButton , o seguinte código em um quadro-chave na linha de tempo principal faria a animação ser reproduzida com um clique no botão:

// 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);

Avançar e retroceder

Os métodos play() e stop() não são a única forma de controlar a reprodução em um clipe de filme. Você também pode mover o indicador de reprodução para frente ou para trás na linha de tempo manualmente, usando os métodos nextFrame() e prevFrame() . Quando qualquer um desses métodos é chamado, a reprodução para e move o indicador de reprodução um quadro para frente ou para trás, respectivamente.

Usar o método play() é como chamar nextFrame() sempre que o evento enterFrame do objeto do clipe de filme é disparado. Com essas linhas, você pode fazer a reprodução do clipe de filme bicycle retroceder, criando um ouvinte de eventos para o evento enterFrame e instruindo bicycle a ir para o quadro anterior na função do ouvinte, desta forma:

// 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);

Na reprodução normal, se um clipe de filme tiver mais de um quadro, ele fará loop indefinidamente ao ser reproduzido, ou seja, ele retornará ao Quadro 1 quando ultrapassar o quadro final. Ao usar prevFrame() ou nextFrame() , esse comportamento não acontece automaticamente (chamar prevFrame() quando o indicador de reprodução está no Quadro 1 não o move para o último quadro). A condição if no exemplo anterior verifica se o indicador de reprodução retrocedeu para o primeiro quadro e o define à frente de seu quadro final, criando assim um loop contínuo do clipe de filme cuja reprodução retrocede.

Salto para um quadro diferente e uso de rótulos de quadro

O envio de um clipe de filme para um novo quadro é simples. A chamada de gotoAndPlay() ou gotoAndStop() fará o clipe de filme saltar para o número de quadro especificado como parâmetro. Se preferir, você pode transmitir uma sequência de caracteres que corresponda ao nome de um rótulo de quadro. É possível atribuir um rótulo a qualquer quadro na linha de tempo. Para fazer isso, selecione um quadro na linha de tempo e digite um nome no campo Rótulo do quadro no Inspetor de propriedades.

As vantagens de usar rótulos de quadro em vez de números ficam mais evidentes ao criar um clipe de filme complexo. Quando o número de quadros, camadas e interpolações em uma animação for grande, considere a rotulagem de quadros importantes com descrições explicativas que representem mudanças de comportamento no clipe de filme (por exemplo, "off", "walking", "running"). Isso melhora a confiabilidade do código e também fornece flexibilidade, já que as chamadas do ActionScript que vão para um quadro rotulado são ponteiros para uma única referência, o rótulo, em vez de um número de quadro específico. Se mais tarde você decidir mover um segmento específico da animação para um quadro diferente, não será necessário alterar o código do ActionScript contanto que mantenha o mesmo rótulo para os quadros no novo local.

Para representar os rótulos de quadro no código, o ActionScript 3.0 inclui a classe FrameLabel. Cada ocorrência dessa classe representa um único rótulo de quadro e tem uma propriedade name representando o nome do rótulo de quadro conforme especificado no Inspetor de propriedades e uma propriedade frame representando o número do quadro com rótulo colocado na linha de tempo.

Para obter acesso às ocorrências de FrameLabel associadas a uma ocorrência de clipe de filme, a classe MovieClip inclui duas propriedades que retornam objetos FrameLabel diretamente. A propriedade currentLabels retorna uma matriz que consiste em todos os objetos FrameLabel na linha de tempo inteira de um clipe de filme. A propriedade currentLabel retorna uma sequência de caracteres contendo o nome do rótulo de quadro encontrado mais recentemente na linha de tempo.

Suponha que você crie um clipe de filme chamado robot e rotulou os diversos estados dessa animação. Você pode configurar uma condição que verifica a propriedade currentLabel para acessar o estado atual de robot , como no seguinte código:

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

O Flash Player 11.3 e o AIR 3.3 adicionaram o evento frameLabel à classe FrameLabel. Você pode atribuir um manipulador de eventos à instância FrameLabel que representa um rótulo de quadro. O evento é despachado quando o indicador de reprodução entra no quadro.

O exemplo a seguir cria uma instância FrameLabel para o segundo rótulo de quadro na Matriz de rótulos de quadro do MovieClip. Em seguida, registra um manipulador de eventos para o evento frameLabel :

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

Trabalho com cenas

No ambiente de autoria do Flash, você pode usar cenas para demarcar uma série de linhas de tempo pelas quais um arquivo SWF pode avançar. Com o uso do segundo parâmetro dos métodos gotoAndPlay() ou gotoAndStop() , é possível especificar uma cena à qual enviar o indicador de reprodução. Todos os arquivos FLA começam apenas com a cena inicial, mas você pode criar novas cenas.

O uso de cenas nem sempre é a melhor abordagem porque as cenas apresentam várias desvantagens. Um documento Flash contendo várias cenas pode ser difícil de manter, principalmente em ambientes de vários autores. Várias cenas também podem ser ineficientes em largura de banda, porque o processo de publicação mescla todas as cenas em uma única linha de tempo. Isso provoca um download progressivo de todas as cenas, mesmo que elas nunca sejam reproduzidas. Por esses motivos, o uso de várias cenas, muitas vezes, não é recomendado para organizar várias animações longas baseadas na linha de tempo.

A propriedade scenes da classe MovieClip é uma matriz de objetos Scene que representa todas as cenas no arquivo SWF. A propriedade currentScene retorna um objeto Scene que representa a cena que está em execução no momento.

A classe Scene possui várias propriedades que fornecem informações sobre uma cena. A propriedade labels retorna uma matriz de objetos FrameLabel representando os rótulos de quadro dessa cena. A propriedade name retorna o nome da cena como uma sequência de caracteres. A propriedade numFrames retorna um int representando o número total de quadro na cena.