Paulinatc Posted June 15, 2013 at 11:17 PM Report #513210 Posted June 15, 2013 at 11:17 PM 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.
PTutor Posted June 16, 2013 at 01:19 AM Report #513216 Posted June 16, 2013 at 01:19 AM 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
Paulinatc Posted June 17, 2013 at 04:41 AM Author Report #513298 Posted June 17, 2013 at 04:41 AM O que eu tinha feito foi mesmo uma bobagem. Você me deu uma luz. Muito obrigada, querido!
Paulinatc Posted June 18, 2013 at 02:36 PM Author Report #513640 Posted June 18, 2013 at 02:36 PM 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.
Paulinatc Posted June 18, 2013 at 02:53 PM Author Report #513644 Posted June 18, 2013 at 02:53 PM (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 at 02:54 PM by Paulinatc
PTutor Posted June 18, 2013 at 10:38 PM Report #513709 Posted June 18, 2013 at 10:38 PM 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
Paulinatc Posted June 19, 2013 at 05:28 AM Author Report #513729 Posted June 19, 2013 at 05:28 AM 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!
Lilianeleila Posted July 14, 2013 at 02:05 AM Report #518675 Posted July 14, 2013 at 02:05 AM 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.
PTutor Posted July 14, 2013 at 09:25 AM Report #518680 Posted July 14, 2013 at 09:25 AM (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 at 09:31 AM by PTutor A autoridade em Flex/Actionscript
Lilianeleila Posted July 17, 2013 at 09:32 PM Report #519146 Posted July 17, 2013 at 09:32 PM (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 at 09:37 PM by Lilianeleila
PTutor Posted July 17, 2013 at 09:58 PM Report #519152 Posted July 17, 2013 at 09:58 PM 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
Paulinatc Posted August 6, 2013 at 11:11 PM Author Report #521038 Posted August 6, 2013 at 11:11 PM 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(); } }
PTutor Posted August 6, 2013 at 11:28 PM Report #521042 Posted August 6, 2013 at 11:28 PM 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
Paulinatc Posted August 8, 2013 at 02:08 AM Author Report #521174 Posted August 8, 2013 at 02:08 AM (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 at 09:18 PM by Paulinatc
PTutor Posted August 8, 2013 at 10:46 PM Report #521289 Posted August 8, 2013 at 10:46 PM 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
Paulinatc Posted August 10, 2013 at 02:22 AM Author Report #521399 Posted August 10, 2013 at 02:22 AM (edited) C Edited August 10, 2013 at 02:44 AM by Paulinatc
Paulinatc Posted August 10, 2013 at 02:43 AM Author Report #521400 Posted August 10, 2013 at 02:43 AM 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.
PTutor Posted August 14, 2013 at 09:14 AM Report #521698 Posted August 14, 2013 at 09:14 AM (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 at 09:17 AM by PTutor A autoridade em Flex/Actionscript
Paulinatc Posted August 15, 2013 at 01:47 PM Author Report #521799 Posted August 15, 2013 at 01:47 PM É.. pelo que vejo, demorarei muito para aprender As3. Uma curiosidade: null é valor padrão para string? Agradecida pela ajuda! 1 Report
PTutor Posted August 15, 2013 at 05:18 PM Report #521815 Posted August 15, 2013 at 05:18 PM 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
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