Paulinatc 1 Posted June 15, 2013 Report Share Posted June 15, 2013 (edited) 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 July 18, 2013 by Rui Carlos Link to post Share on other sites
PTutor 0 Posted June 16, 2013 Report Share Posted June 16, 2013 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 Link to post Share on other sites
Paulinatc 1 Posted June 17, 2013 Author Report Share Posted June 17, 2013 O que eu tinha feito foi mesmo uma bobagem. Você me deu uma luz. Muito obrigada, querido! Link to post Share on other sites
Paulinatc 1 Posted June 18, 2013 Author Report Share Posted June 18, 2013 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. Link to post Share on other sites
Paulinatc 1 Posted June 18, 2013 Author Report Share Posted June 18, 2013 (edited) 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 June 18, 2013 by Paulinatc Link to post Share on other sites
PTutor 0 Posted June 18, 2013 Report Share Posted June 18, 2013 Não lhe sei dar uma resposta, porque não uso o Flash em português e não consigo identificar o problema através dessa mensagem, sem saber como está estruturado o projecto. Fiz uma pesquisa e encontrei isto: http://forum.imasters.com.br/topic/411728-action-30-link/ - espero que seja útil. A autoridade em Flex/Actionscript Link to post Share on other sites
Paulinatc 1 Posted June 19, 2013 Author Report Share Posted June 19, 2013 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! Link to post Share on other sites
Lilianeleila 0 Posted July 14, 2013 Report Share Posted July 14, 2013 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. Link to post Share on other sites
PTutor 0 Posted July 14, 2013 Report Share Posted July 14, 2013 (edited) 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 July 14, 2013 by PTutor A autoridade em Flex/Actionscript Link to post Share on other sites
Lilianeleila 0 Posted July 17, 2013 Report Share Posted July 17, 2013 (edited) 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 July 17, 2013 by Lilianeleila Link to post Share on other sites
PTutor 0 Posted July 17, 2013 Report Share Posted July 17, 2013 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 Link to post Share on other sites
Paulinatc 1 Posted August 6, 2013 Author Report Share Posted August 6, 2013 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(); } } Link to post Share on other sites
PTutor 0 Posted August 6, 2013 Report Share Posted August 6, 2013 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 Link to post Share on other sites
Paulinatc 1 Posted August 8, 2013 Author Report Share Posted August 8, 2013 (edited) 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 August 8, 2013 by Paulinatc Link to post Share on other sites
PTutor 0 Posted August 8, 2013 Report Share Posted August 8, 2013 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 Link to post Share on other sites
Paulinatc 1 Posted August 10, 2013 Author Report Share Posted August 10, 2013 (edited) C Edited August 10, 2013 by Paulinatc Link to post Share on other sites
Paulinatc 1 Posted August 10, 2013 Author Report Share Posted August 10, 2013 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. Link to post Share on other sites
PTutor 0 Posted August 14, 2013 Report Share Posted August 14, 2013 (edited) 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 August 14, 2013 by PTutor A autoridade em Flex/Actionscript Link to post Share on other sites
Paulinatc 1 Posted August 15, 2013 Author Report Share Posted August 15, 2013 É.. pelo que vejo, demorarei muito para aprender As3. Uma curiosidade: null é valor padrão para string? Agradecida pela ajuda! 1 Report Link to post Share on other sites
PTutor 0 Posted August 15, 2013 Report Share Posted August 15, 2013 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 Link to post Share on other sites
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now