Jump to content
Paulinatc

botões de controle para Movieclipe AS3

Recommended Posts

Paulinatc

Por favor,

Fiz cinco animações quadro a quadro numa mesma camada que está dentro do Movieclip (pelo AS3 ). Fiz dois botões para cada animação.

Não estou conseguindo fazer com que os botões(que estão fora desse movieclip) dê um play e retroceda as suas animações.

Do tipo:

Clique no botão A para dar um play no quadro1 da animação 1 dentro do mc.

Clique no botão B para retroceder(quadro a quadro) essa animação dentro do mc.

E assim sucessivamente.

Se puderem me ajudar , ficarei muito agradecida.

Obrigada pela atenção!

Volto depois para obter resposta.

Edited by Rui Carlos

Share this post


Link to post
Share on other sites
PTutor

Olá, Paulina.

Assumindo que o botão A tem um instance name botaoA, o botão B tem um instance name botaoB e o MovieClip que queres reproduzir tem um instance name animacao:

// parar a reprodução da timeline principal
stop();

// adicionar os event listeners aos botões botaoA e botaoB
botaoA.addEventListener(MouseEvent.CLICK, animar);
botaoB.addEventListener(MouseEvent.CLICK, retroceder);

// reproduzir a animação
function animar(event:MouseEvent):void
{
 animacao.play();
}

// iniciar o processo de rebobinagem
function retroceder(event:MouseEvent):void
{
 animacao.addEventListener(Event.ENTER_FRAME, retrocederQuadroAQuadro);
}

// retrocede a animação frame a frame até se atingir a primeira frame (o início do MovieClip)
function retrocederQuadroAQuadro(event:Event):void
{
 if (animacao.currentFrame == 1)
 {
   // parar a rebobinagem
   animacao.removeEventListener(Event.ENTER_FRAME, retrocederQuadroAQuadro);
 }
 else
 {
   // retroceder uma frame
   animacao.prevFrame();
 }
}


A autoridade em Flex/Actionscript

Share this post


Link to post
Share on other sites
Paulinatc

O que eu tinha feito foi mesmo uma bobagem. Você me deu uma luz.

Muito obrigada, querido!

Share this post


Link to post
Share on other sites
Paulinatc

Olá Ptutor!

Esse script é o AS2 ou do AS3? Instanciei os botões e o movieclip direitinho mas

está apresentando o erro "A classe ou interface MouseEvent não pôde ser carregada" nas linhas abaixo:

function animar(event:MouseEvent):void

function retroceder(event:MouseEvent):void

e também o erro "A classe ou interface Event não pôde ser carregada" na linha :

function retrocederQuadroAQuadro(event:Event):void

Grata.

Share this post


Link to post
Share on other sites
Paulinatc

Falha minha: tinha feito no AS2 mas consegui converter para AS3.

Ainda assim, apareceu a seguinte mensagem na Saída : AVISO: ações em ocorrências de botão ou clipe de filme não são suportadas no ActionScript 3.0. Todos os scripts em ocorrências de objeto serão ignorados.

Terei problemas futuros quando eu criar outros botões para essa animação após receber esse AVISO?

Obrigada pela atenção!

Até logo!

Edited by Paulinatc

Share this post


Link to post
Share on other sites
Paulinatc

Coloquei ações dentro do MovieClip. O AS3 não permite. Agora que estou aprendendo AS3 vou tentar transformar o mc em botão e colocar ações do tipo onrollover( para dar um play no mc) e onrollout(para dar um stop no mc) .

Obrigada mais uma vez!

Share this post


Link to post
Share on other sites
Lilianeleila

Aproveitando o ritmo, por favor, como seria o loop infinito com esse script de Paulina, logo acima?

Testei o script mas o prevframe retrocede porém ele dá um stop na animação, ou seja, ele pára a animação depois que retrocede todos os quadros. Gostaria que ele prosseguisse de trás para frente sem parar assim como a animação reproduz para frente sem parar.

Venho aqui depois para receber alguma resposta.

Share this post


Link to post
Share on other sites
PTutor

Seria a mesma coisa, mas a função retrocederQuadroAQuadro ficava assim:

// reproduz a animação de frente para trás
function retrocederQuadroAQuadro(event:Event):void
{
   if (animacao.currentFrame == 1)
   {
       // avançar para a última frame quando se chega à primeira frame
       animacao.gotoAndStop(animacao.totalFrames);
   }
   else
   {
       // retroceder uma frame
       animacao.prevFrame();
   }
}

Edited by PTutor

A autoridade em Flex/Actionscript

Share this post


Link to post
Share on other sites
Lilianeleila

Ele funcionou parcialmente.

Os comandos dos botões só funcionam uma única vez.

Por exemplo : a animação roda para esquerda, quando eu clico para rodar para a direita ele faz infinitamente mas quando eu clico no botão para voltar para a esquerda ou vice-versa ele não retorna. E ainda dá uma paradinha no frame 1 de dois segundos mais ou menos.

Porque isso ocorre?

Edited by Lilianeleila

Share this post


Link to post
Share on other sites
PTutor

Porque o EventListener que é responsável pela execução da função de rebobinagem nunca chega a ser removido. Para solucionar o problema, é necessário actualizar a função animar para:

function animar(event:MouseEvent):void
{
 // parar a rebobinagem
 animacao.removeEventListener(Event.ENTER_FRAME, retrocederQuadroAQuadro);

 // reproduzir a animação normalmente
 animacao.play();
}

Já agora, para evitar que o botaoB crie problemas de performance ao adicionar vários EventListeners, actualiza a função retroceder para:

function retroceder(event:MouseEvent):void
{
 if (!animacao.hasEventListener(Event.ENTER_FRAME)) {
   animacao.addEventListener(Event.ENTER_FRAME, retrocederQuadroAQuadro);
 }
}


A autoridade em Flex/Actionscript

Share this post


Link to post
Share on other sites
Paulinatc

Olá Ptutor!

Fiz a mistura da animação com botões para um mc que roda infinitamente (loop infinito) como você explicou e

transformei esse mc num botão do tipo on (rollover) e on (rollout) para parar quando o mouse fica sobre ele e reproduzir quando o ponteiro do mouse é retirado.

Porém quando a animação reproduz para a direita a função de "parar(ou pausar) a animação" não funciona. Acredito que esteja dando conflito nas funções do script.

Como resolver isso?

Abaixo está o script:

mcinvi.addEventListener(MouseEvent.ROLL_OVER, parar);

mcinvi.addEventListener(MouseEvent.ROLL_OUT, tocar);

mcinvi.buttonMode = true;

function parar (e:MouseEvent){

mcinvi.stop();

}

function tocar (e:MouseEvent){

mcinvi.play();

}

botaoesquerda.addEventListener(MouseEvent.CLICK,animar);

botaodireita.addEventListener(MouseEvent.CLICK,retroceder);

function animar(event:MouseEvent):void

{

mcinvi.removeEventListener(Event.ENTER_FRAME, retrocederQuadroAQuadro);

mcinvi.play();

}

function retroceder(event:MouseEvent):void

{

if (!mcinvi.hasEventListener(Event.ENTER_FRAME)) {

mcinvi.addEventListener(Event.ENTER_FRAME, retrocederQuadroAQuadro);

}

}

function retrocederQuadroAQuadro(event:Event):void

{

if (mcinvi.currentFrame == 1)

{

mcinvi.gotoAndStop(mcinvi.totalFrames);

}

else

{

mcinvi.prevFrame();

}

}

Share this post


Link to post
Share on other sites
PTutor

Actualize a função parar introduzindo uma instrução para parar a rebobinagem:

function parar (e:MouseEvent) {
 // parar a rebobinagem
 mcinvi.removeEventListener(Event.ENTER_FRAME, retrocederQuadroAQuadro);
 // parar a reprodução
 mcinvi.stop();
}


A autoridade em Flex/Actionscript

Share this post


Link to post
Share on other sites
Paulinatc

Viva

Tinha feito um teste com essa mesma ideia. A função "parar" funciona mas a animação não continua o estado anterior.

Quando a reprodução da animação roda para a direita e desejo pará-la passando o mouse sobre o movieclip botão , ela para(pausa) normalmente porém quando vai exercer a função rollout (tirando o mouse) a animação reproduz para a esquerda.

Acredito que a função animar está atrapalhado. Fiz vários testes nesta parte com if e else mas esse problema ainda persiste.

Aguardo resposta.

grata!

Edited by Paulinatc

Share this post


Link to post
Share on other sites
PTutor

Anexe o projecto ou uma versão que isole e represente o problema para que eu possa testar e identificar a sua a causa.


A autoridade em Flex/Actionscript

Share this post


Link to post
Share on other sites
Paulinatc

Coloquei meu projecto neste link abaixo para que possa fazer o download. Não conheço outro lugar mais fácil na internet para deixar o projecto a disposição. Não consegui ver opção de anexo na caixa de texto do site .Se souber algum, por favor, me diga:

http://www.4shared.com/file/xmxkgvhz/PaulinaParaTutorPortProg.html.

Como havia dito: clicando no "botãodireita" o carrinho movimenta-se para trás normalmente. Depois , ponha o ponteiro do mouse sobre a animação para parar. Retire o ponteiro do mouse e note que a animação do carrinho andando para trás é cancelada e passa a movimentar-se para frente. Este é o problema. Ele só deveria andar para frente quando o "botãoesquerda" fosse acionado.

Share this post


Link to post
Share on other sites
PTutor

Adicionei uma variável aRebobinar para me indicar se a animação estava a rebobinar ou não no momento em que o utilizador retira o rato do MovieClip. O código para que tudo funcione como pretendido é este:

var aRebobinar:Boolean = false;

botaoesquerda.addEventListener(MouseEvent.CLICK,animar);
botaodireita.addEventListener(MouseEvent.CLICK,retroceder);
mcinvi.addEventListener(MouseEvent.ROLL_OVER, parar);
mcinvi.addEventListener(MouseEvent.ROLL_OUT, tocar);

mcinvi.buttonMode = true;

function parar(event:MouseEvent)
{
 mcinvi.removeEventListener(Event.ENTER_FRAME, retrocederQuadroAQuadro);
 mcinvi.stop();
}

function tocar(event:MouseEvent)
{
 if (aRebobinar) {
   retroceder(null);
 } else {
   mcinvi.play();
 }
}

function animar(event:MouseEvent):void
{
 mcinvi.removeEventListener(Event.ENTER_FRAME, retrocederQuadroAQuadro);
 mcinvi.play();
 aRebobinar = false;
}

function retroceder(event:MouseEvent):void
{
 if (!mcinvi.hasEventListener(Event.ENTER_FRAME))
 {  
   mcinvi.addEventListener(Event.ENTER_FRAME, retrocederQuadroAQuadro);
   aRebobinar = true;
 }
}

function retrocederQuadroAQuadro(event:Event):void
{
 if (mcinvi.currentFrame == 1)
 {
   mcinvi.gotoAndStop(mcinvi.totalFrames);
 }
 else
 {
   mcinvi.prevFrame();
 }
}

Edited by PTutor

A autoridade em Flex/Actionscript

Share this post


Link to post
Share on other sites
Paulinatc

É.. pelo que vejo, demorarei muito para aprender As3.

Uma curiosidade: null é valor padrão para string?

Agradecida pela ajuda!

  • Vote 1

Share this post


Link to post
Share on other sites
PTutor

Há uns anos eu pensava o mesmo, mas fui aprendendo, pouco a pouco, até dominar a linguagem. Não desista. Um bom livro para aprender Actionscript é o Learning Actionscript 3.0. Existe uma versão em português do Brasil chamada Aprendendo Actionscript 3.0.

Null significa nulo e é uma palavra reservada de Actionscript (e outras linguagens) que, entre outras coisas, indica que os ponteiros não estão a apontar para nenhum objecto. No código acima, a função retroceder tem um parâmetro obrigatório do tipo MouseEvent:

function retroceder(event:MouseEvent):void
{
 ...
}

Para a função ser executada manualmente, é preciso invocá-la passando-lhe um objecto do tipo MouseEvent ou um valor nulo (null)

// Criar um objecto do tipo MouseEvent para usar como argumento na função retroceder
var event:MouseEvent = new MouseEvent(MouseEvent.CLICK);

// Executar a função retroceder usando o objecto event como argumento
retroceder(event);

// Executar a função retroceder usando um valor nulo como argumento
retroceder(null);

Eu usei um valor nulo para evitar criar um objecto que não vai ser utilizado. O Flash Player cria um objecto do tipo MouseEvent e invoca a função retroceder automaticamente quando clicamos no botão botaodireita.

O seguinte código cria um apontador nulo para um objecto do tipo String:

var mensagem:String;
trace(mensagem) // output: null

Para que o apontador deixe de ser nulo, é necessário instanciá-lo:

var mensagem:String = "Eu sou gostoso"
trace(mensagem) // output: Eu sou gostoso


A autoridade em Flex/Actionscript

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.