Comunidad de diseño web y desarrollo en internet online

Navegacion desde la documentClass

Citar            
MensajeEscrito el 08 Oct 2008 04:11 pm
Estoy intentando hacer un script para navegar entre frames sin usar la linea de tiempo principal. Este script en un principio iría en la DocumentClass, pero para simplificar las cosas de momento estoy intentando usarlo desde la linea de tiempo principal.
En mi ejemplo tengo un .fla con 3 frames, y en cada frame hay un boton al que le he asignado una funcion cuya unica finalidad es avanzar al siguiente frame, o al primero, si el frame en que se encuentra es el ultimo.
Este es el codigo:

Código :

stop();
fActualizar();
function fActualizar():void {
   var tTimer:Timer = new Timer(100, 1);
   tTimer.addEventListener(TimerEvent.TIMER, fVerBoton);
   tTimer.start();
}
function fVerBoton(event:TimerEvent):void {
   for (var i:uint = 0; i < numChildren; i++) {
      if (getChildAt(i) is Button) {
         var btnDeMarras:Button = getChildAt(i) as Button;
      }
   }
   btnDeMarras.addEventListener(MouseEvent.CLICK, fNextFrame);
}
function fNextFrame(event:MouseEvent):void {
   if (currentFrame < totalFrames) {
      nextFrame();
   } else {
      gotoAndStop(1);
   }
   fActualizar();
}

Lo de la funcion fActualizar es porque Flash tarda un tiempo en "ver" lo que hay en el nuevo frame, y antes de que esto ocurre es imposible asignar listeners ni nada a los objetos que en el se encuentren.

Bueno este script "funciona", pero tiene un problema; y es que si se hace click demasiado rapido en los botones, termina dando este error:
TypeError: Error #1009: Cannot access a property or method of a null object reference.
at NAVEGADESDEFLA_fla::MainTimeline/fVerBoton()
at flash.utils::Timer/_timerDispatch()
at flash.utils::Timer/tick()
He probado variando el tiempo del Timer pero nada, y me pregunto si habria alguna forma de evitar este error.
Gracias.

Por oxk4r

56 de clabLevel



 

Orense·España

firefox
Citar            
MensajeEscrito el 08 Oct 2008 05:04 pm
Ponle un ENTER_FRAME que te controle si se a cargado el fotograma. Y deshabilita el botón para que no le puedan dar dos clicks..

Código ActionScript :

stop();
fVerBoton();

function fVerBoton(e:Event = null):void
{
   for (var i:uint = 0; i < numChildren; i++)
   {
      if (getChildAt(i) is Button)
      {
         var btnDeMarras:Button = getChildAt(i) as Button;
      }
   }
   if (btnDeMarras != null)
   {
      trace("fotograma listo");
      btnDeMarras.addEventListener(MouseEvent.CLICK, fNextFrame);
      stage.removeEventListener(Event.ENTER_FRAME, fVerBoton);
   }
   else
   {
      trace("fotograma no listo");
   }
}

function fNextFrame(event:MouseEvent):void
{
   if (currentFrame < totalFrames)
   {
      nextFrame();
   } else
   {
      gotoAndStop(1);
   }
   event.currentTarget.enabled = false;
   stage.addEventListener(Event.ENTER_FRAME, fVerBoton);
}

Por Zguillez

BOFH

10744 de clabLevel

85 tutoriales
17 articulos
3 ejemplos

Genero:Masculino   Bastard Operators From Hell Héroes Team Cristalab Editores

BCN

firefox
Citar            
MensajeEscrito el 09 Oct 2008 05:20 pm
Muchas gracias. Tuve la osadia de añadirle un par de lineas a tu codigo:

Código :

import fl.controls.Button;//<<--  una
stop();
fVerBoton();

function fVerBoton(e:Event = null):void {
   for (var i:uint = 0; i < numChildren; i++) {
      if (getChildAt(i) is Button) {
         var btnDeMarras:Button = getChildAt(i) as Button;
      }
   }
   if (btnDeMarras != null) {
      btnDeMarras.enabled = true;//<<-- dos
      trace("fotograma listo");
      btnDeMarras.addEventListener(MouseEvent.CLICK, fNextFrame);
      stage.removeEventListener(Event.ENTER_FRAME, fVerBoton);
   } else {
      trace("fotograma no listo");
   }
}
function fNextFrame(event:MouseEvent):void {
   if (currentFrame < totalFrames) {
      nextFrame();
   } else {
      gotoAndStop(1);
   }
   event.currentTarget.enabled = false;
   stage.addEventListener(Event.ENTER_FRAME, fVerBoton);
}

Por cierto, hay una cosa que no entiendo bien:

Código :

function fVerBoton(e:Event = null):void {

¿Esto hace que puedas llamar a la funcion sin pasarle parametros, no? Pero luego cuando la vuelves a llamar desde el listener, como es que event no vuelve a coger el valor null? No se si me explico :oops:

Por oxk4r

56 de clabLevel



 

Orense·España

firefox
Citar            
MensajeEscrito el 09 Oct 2008 05:38 pm

oxk4r escribió:

Tuve la osadia de añadirle un par de lineas a tu codigo:

¡Uy que osadía! creo que tendré que cortarte los pulgares como vuelvas a hacerlo...


:lol:

Por Zguillez

BOFH

10744 de clabLevel

85 tutoriales
17 articulos
3 ejemplos

Genero:Masculino   Bastard Operators From Hell Héroes Team Cristalab Editores

BCN

firefox
Citar            
MensajeEscrito el 09 Oct 2008 05:45 pm

oxk4r escribió:

Por cierto, hay una cosa que no entiendo bien:

Código :

function fVerBoton(e:Event = null):void {

¿Esto hace que puedas llamar a la funcion sin pasarle parametros, no? Pero luego cuando la vuelves a llamar desde el listener, como es que event no vuelve a coger el valor null? No se si me explico :oops:


No, con eso lo que haces es pasarle un parametro por defecto a la función. Osea si relizas una llamada a esa funcion sin pasarle ningun parametro fVerBoton() el valir de "e" es null. De no hacerlo de esta manera osea colocando fVerBoton(e:Event) no pasarle ningún parámetro te lanzaría un error. Para que lo entiendas fácil.. es lo mismo que esto:

Código :

function num(n:uint = 0)
{
   trace(n)
}

num()  // --> 0
num(1) // --> 1

Por Zguillez

BOFH

10744 de clabLevel

85 tutoriales
17 articulos
3 ejemplos

Genero:Masculino   Bastard Operators From Hell Héroes Team Cristalab Editores

BCN

firefox
Citar            
MensajeEscrito el 09 Oct 2008 06:02 pm
:shock: Y otra cosa que no entiendo: ¿No se supone que al declarar

Código :

var btnDeMarras:Button = getChildAt(i) as Button;

el valor de este ya es distinto de null?
No entiendo porque necesitamos hacer la comprobación

Código :

if (btnDeMarras != null) {

no se supone que Flash ya deberia de dar error al asignar el valor a la variable?

Por oxk4r

56 de clabLevel



 

Orense·España

firefox
Citar            
MensajeEscrito el 09 Oct 2008 10:33 pm

oxk4r escribió:

el valor de este ya es distinto de null?
No entiendo porque necesitamos hacer la comprobación

Este es el tipico error de ejecutar código en el mismo momento de cambiar de fotograma. El código se ejecuta antes de que los clips del nuevo fotograma esten completamente creados y accesibles. Con lo que ese getChildAt(i) devolverá null ya que no puede acceder al displayList del fotograma y al asignarle el addEventListener al objeto nulo te lanzaria un error. De ahi que con el ENTER_FRAME generas un bucle en el que en la segunda lectura ya tiene el displayList generado y obtienes correctamente la referencia al clip de fotograma con lo que ejecutas el código y eliminas el ENTER_FRAME.

Por Zguillez

BOFH

10744 de clabLevel

85 tutoriales
17 articulos
3 ejemplos

Genero:Masculino   Bastard Operators From Hell Héroes Team Cristalab Editores

BCN

firefox
Citar            
MensajeEscrito el 10 Oct 2008 09:09 am
Ya, pero con esto:

Código :

var btnDeMarras:Button = getChildAt(i) as Button



Es como si Flash le estuviera asignando valor a una variable que en realidad no existe... O al menos no existe del todo ¿no?

Por oxk4r

56 de clabLevel



 

Orense·España

firefox
Citar            
MensajeEscrito el 10 Oct 2008 09:45 am

oxk4r escribió:

Es como si Flash le estuviera asignando valor a una variable que en realidad no existe... O al menos no existe del todo ¿no?

La variable si que existe, lo que no está disponible aun es el displayList del frame, con lo que el getChild obtiene valor nulo.. de ahi que tengas que hacer una segunda lectura con el ENTER_FRAME una vez el fotograma está disponible, entonces el getChild si que encuentra la referencia al clip. Todo esto es únicamente un _parche_ para solucionar ese problema..

Por Zguillez

BOFH

10744 de clabLevel

85 tutoriales
17 articulos
3 ejemplos

Genero:Masculino   Bastard Operators From Hell Héroes Team Cristalab Editores

BCN

firefox
Citar            
MensajeEscrito el 10 Oct 2008 10:11 am
Entiendo. Bueno pues muchas gracias por tu ayuda Z :D .

Por oxk4r

56 de clabLevel



 

Orense·España

firefox

 

Cristalab BabyBlue v4 + V4 © 2011 Cristalab
Powered by ClabEngines v4, HTML5, love and ponies.