Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

ddlightw

nextFrame() às vezes não funciona

Recommended Posts

Eu criei um slideshow simples e tive problemas com botão, às vezes clicava e não funcionava.

Utilizei um mesmo botão com nomes de instâncias diferentes, coloquei a ação nos quadros 2 e 3 que estavam os botões, porque se coloca nos quadros que o botão não existe dá um erro de timeline.

 

O mesmo não acontece com o gotoAndStop().

Compartilhar este post


Link para o post
Compartilhar em outros sites

Geralmente são 6 imagens e eu coloco em uma layer 6 frames, nesse caso cada botão vai para o Frame 2, 3 e assim em diante.

 

Não sei porque, algumas vezes ele pulava um frame.

 

Exemplo do código:

 

voltar_btn.addEventListener(MouseEvent.CLICK, voltaSlide, false, 0, true);
avancar_btn.addEventListener(MouseEvent.CLICK, avancaSlides, false, 0, true);


function voltaSlide(e:MouseEvent):void {

 gotoAndStop(1);

}

function avancaSlides(e:MouseEvent):void {

  gotoAndStop(2);

}

 

 

Se eu utilizar um botão para avançar com o mesmo nome de instancia e deixar o código no frame 1 da Timeline pode causar esse problema?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu sei que o certo dessa linguagem seria criar uma programação estruturada com classes, mas exige certo conhecimento e tempo, então eu preciso improvisar.

 

Eu sempre preciso de um voltar e um próximo, mas eu não queria que um não aparecesse no primeiro e o outro no último frame, improvisei um código, só que ele conta o número de frames a partir do clique e se eu coloco nextFrame() antes do if ele pula 1 frame, alguém sabe porque isso acontece?

Tentei deixar o botão avançar só no frame 2, mas dá erro de timeline e eu tenho que deixá-lo invisível, o que acontece que parece que o código do frame 1 não passa para os outros frames?

 

Já fiz curso, mas conforme você muda o código e a disposição dos movieclips, algo deixa de funcionar.

 

stop();

var labels:Array = this.currentLabels;

for (var i:uint = 0; i < labels.length; i++) {
   var label:FrameLabel = labels[i];
   trace("frame " + label.frame + ": " + label.name);
}

if(currentFrame == 1)
  {
  voltar_btn.visible = false;
   }


trace(currentLabel);

avancar_btn.addEventListener(MouseEvent.CLICK, avancaSlide);

function avancaSlide(e:MouseEvent):void {
    if(this.currentFrame == 1){

	 voltar_btn.visible = true;  
   }
  //trace(currentFrame);
  trace(currentLabel);


  if(this.currentLabel == "quinto")
  {
  this.gotoAndStop("primeiro");
  }else
  {
   nextFrame();
  }

}

voltar_btn.addEventListener(MouseEvent.CLICK, voltaSlide);

function voltaSlide(e:MouseEvent):void {

 prevFrame();


}

 

Imagens do stage e da timeline:

 

http://www.freeimagehosting.net/3jxfa

 

http://www.freeimagehosting.net/ab1fg

Compartilhar este post


Link para o post
Compartilhar em outros sites

Vê se ajuda (no exemplo, há uma tween para deslocamento das imagens, aninhadas lado a lado em um movie clip, exibida através de uma máscara):

 

stop();

//EventListeners que vão cuidar dos cliques nos botões
dir_btn.addEventListener(MouseEvent.CLICK, proximo);
esq_btn.addEventListener(MouseEvent.CLICK, anterior);

function proximo(me:MouseEvent):void
{
//EventListener que cuida o evento de ENTER_FRAME,
//evento que é disparado na mesma velocidade do fps
stage.addEventListener(Event.ENTER_FRAME, onFramesNext);
}

function anterior(me:MouseEvent):void
{
stage.addEventListener(Event.ENTER_FRAME, onFramesPrev);
}


// função que é chamada na mesma velocidade do fps
function onFramesNext(e:Event):void
{
//manda pro próximo frame
nextFrame();

//verifica se o frame atual é o frame 30
if(currentFrame == 30)
{
	//se for o frame 30, remove o EventListener, ou seja,
	//paramos a animação

	stage.removeEventListener(Event.ENTER_FRAME, onFramesNext);
}

if(currentFrame == 60) 
{
	stage.removeEventListener(Event.ENTER_FRAME, onFramesNext);
}

if(currentFrame == 90) 
{
	stage.removeEventListener(Event.ENTER_FRAME, onFramesNext);
}

}


function onFramesPrev(e:Event):void
{
prevFrame();
if(currentFrame == 60)
{

	stage.removeEventListener(Event.ENTER_FRAME, onFramesPrev);
}

if(currentFrame == 30) 
{
	stage.removeEventListener(Event.ENTER_FRAME, onFramesPrev);
}

if(currentFrame == 1) 
{
	stage.removeEventListener(Event.ENTER_FRAME, onFramesPrev);
}
}

 

 

Abs ;)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Muito obrigado, testei o seu código.

Mas percebi o que estava acontecendo, ao clicar nextFrame ele estava contando certo, mas o problema era quando ele chegava no último frame e voltava para o primeiro, ele estava contando 1 duas vezes e acrescentava só no clique do mouse + 1.

 

Assim, clicava até 5, no 5 eu pedia para mandar para 1 com gotoAndPlay, ele obedecia, mas não entendi porque ele só contava a partir do clique não contava o 1, contava a partir do 2 que era quando eu clicava nextFrame(). Vi no trace(), então mudei as contas para funcionar.

 

Agora o problema é deixar de aparecer o botão nextFrame() quando chega no final e tirar do inicio o botão do prevFrame.

Estou improvisando, coloco o código visible na layer que eu não quero que aparece.

Tive uns problemas com condições de if e else, por exemplo se está no último frame o botão some senão se estiver em qualquer outro frame ele fica vísivel, só que não funciona. Funciona o if, mas não o else.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Depende, se você quer criar um loop (esquerda/direita) com os botões next/prev precisa ajustes.

 

 

Se usar ENTER_FRAME, faça a verificação com currentFrame/totalFrame.

 

Defina inicialmente (fora da função):

esq_btn.visible = false;

 

Depois, dentro da função next/prev, ao verificar o frame (if), altere para visible = true;

 

 

Poste sua tentativa, facilita para tentar auxiliar.

 

 

Abraços

Compartilhar este post


Link para o post
Compartilhar em outros sites

Funcionou e ficou dessa forma:

 

stop();

var labels:Array = this.currentLabels;

for (var i:uint = 0; i < labels.length; i++)
{
var label:FrameLabel = labels[i];
trace("frame " + label.frame + ": " + label.name);
}


voltar_btn.visible = false;


addEventListener(Event.ENTER_FRAME, botaoVisivel,false, 0, true);
//stage.addEventListener(Event.ENTER_FRAME, botaoVisivel,false, 0, true);

function botaoVisivel(e:Event):void
{
if (currentFrame != 1)
{

	voltar_btn.visible = true;
}


if (currentLabel == "quinto")
{
	avancar_btn.visible = false;
}
if (currentLabel < "quinto")
{
	avancar_btn.visible = true;
}
trace(currentFrame);
}


avancar_btn.addEventListener(MouseEvent.CLICK, avancaSlide);

function avancaSlide(e:MouseEvent):void
{

nextFrame();

}

voltar_btn.addEventListener(MouseEvent.CLICK, voltaSlide);

function voltaSlide(e:MouseEvent):void
{

prevFrame();
trace(currentLabel);

}


//trace(currentFrame);
trace(currentLabel);

 

 

A única coisa que eu reparei é que no trace do Enter Frame no output aparece o número do frame diversas vezes, será que tem algum erro? É necessário sempre utilizar removeEventListener para liberar memória ou algo assim?

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.