Comunidad de diseño web y desarrollo en internet online

Error según Flash CS4 en un Listener

Citar            
MensajeEscrito el 27 Ene 2010 04:14 pm
Hola, estoy haciendo una sencilla web en flash y necesito ayuda en AS3, que tengo un fallo y no lo consigo solucionar. Este es el código completo:

Código ActionScript :

stop();

// Código para manejo de las secciones

// Variables globales
var estado:int = 0;

// Listeners de los botones
boton1.addEventListener(MouseEvent.CLICK, control(1));
boton2.addEventListener(MouseEvent.CLICK, control(2));
boton3.addEventListener(MouseEvent.CLICK, control(3));
boton4.addEventListener(MouseEvent.CLICK, control(4));
boton5.addEventListener(MouseEvent.CLICK, control(5));
boton6.addEventListener(MouseEvent.CLICK, control(6));

// Función abrir, cuyo parámetro aux indica el botón que hemos pulsado
function control(aux:int)
{
   if (estado == 0)
   {
      // Switch para acceder a la sección correspondiente
      switch (aux)
      {
         // En cada uno de los case se llama a la función abrir
         // y además asignamos a estado el valor entero correspondiente a la sección
         case(1):
            abrir(aux);
            estado = aux;
            break;
         case(2):
            abrir(aux);
            estado = aux;
            break;
         case(3):
            abrir(aux);
            estado = aux;
            break;
         case(4):
            abrir(aux);
            estado = aux;
            break;
         case(5):
            abrir(aux);
            estado = aux;
            break;
         case(6):
            abrir(aux);
            estado = aux;
            break;
      }
   }
   else
   {
      // Switch para acceder a la sección correspondiente
      switch (aux)
      {
         // En cada uno de los case se llama a la función abrir
         // y además asignamos a estado el valor entero correspondiente a la sección
         case(1):
            cerrar(aux);
            abrir(aux);
            estado = aux;
            break;
         case(2):
            cerrar(aux);
            abrir(aux);
            estado = aux;
            break;
         case(3):
            cerrar(aux);
            abrir(aux);
            estado = aux;
            break;
         case(4):
            cerrar(aux);
            abrir(aux);
            estado = aux;
            break;
         case(5):
            cerrar(aux);
            abrir(aux);
            estado = aux;
            break;
         case(6):
            cerrar(aux);
            abrir(aux);
            estado = aux;
            break;
      }
   }
}

// Función abrir, cuyo parámetro indica que sección hay que abrir
function abrir(aux2:int)
{
   // Switch para mover a la sección correspondiente
      switch (aux2)
      {
         case(1):
            // Incrementamos el valor de la posción X de la sección hasta 600
            while (sec1.x < 600)
            {
               sec1.x = sec1.x + 3;
            }
            break;
         case(2):
            while (sec2.x < 600)
            {
               sec2.x = sec2.x + 3;
            }
            break;
         case(3):
            while (sec3.x < 600)
            {
               sec3.x = sec3.x + 3;
            }
            break;
         case(4):
            while (sec4.x < 600)
            {
               sec4.x = sec4.x + 3;
            }
            break;
         case(5):
            while (sec5.x < 600)
            {
               sec5.x = sec5.x + 3;
            }
            break;
         case(6):
            while (sec6.x < 600)
            {
               sec6.x = sec6.x + 3;
            }
            break;
      }
}


// Función cerrar, cuyo parámetro incida la sección que hay que cerrar
function cerrar(aux3:int)
{
   // Switch para mover a la sección correspondiente
      switch (aux3)
      {
         case(1):
            // Decrementamos el valor de la posción X de la sección hasta 23
            while (sec1.x > 23)
            {
               sec1.x = sec1.x - 3;
            }
            break;
         case(2):
            while (sec2.x > 23)
            {
               sec2.x = sec2.x - 3;
            }
            break;
         case(3):
            while (sec3.x > 23)
            {
               sec3.x = sec3.x - 3;
            }
            break;
         case(4):
            while (sec4.x > 23)
            {
               sec4.x = sec4.x - 3;
            }
            break;
         case(5):
            while (sec5.x > 23)
            {
               sec5.x = sec5.x - 3;
            }
            break;
         case(6):
            while (sec6.x > 23)
            {
               sec6.x = sec6.x - 3;
            }
            break;
      }
}


El resultado de este código me da el siguiente fallo, que no se donde está para poder corregirlo:

TypeError: Error #2007: El valor del parámetro listener debe ser distinto de null.
at flash.events::EventDispatcher/addEventListener()
at agesto_fla::MainTimeline/frame49()

Por Perico19

39 de clabLevel



Genero:Masculino  

safari
Citar            
MensajeEscrito el 27 Ene 2010 04:24 pm
Se me olvidaba, el código hace lo siguiente, tengo una serie de animaciones hasta el frame 49, donde pongo el stop(); que veis al principio de este código. En este frame hay 6 botones, con su listener correspondiente, cada listener manda un valor entero a la función llamada "control", a parte de eso, hay una variable global llamada estado cuyo valor inicial es 0. Bien, si ejecuto el swf, lo que tendría que suceder es lo siguiente, llegamos al frame 49, se detiene la animación y los listeners quedan a la espera de que el usuario pulse uno de los botones, como acabamos de abrir la web, no hay ninguna seción abierta, por lo que estado = 0. Ahora, si hacemos click en una sección, y como estado vale 0, lo que hace el listener es mandar el numero entero correspondiente a su sección a la función control, entramos en el switch en su case correspondiente y llamamos a la función abrir, que se encarga de realizar unos cambios en la propiedad .x de la instancia de un símbolo y la variable estado cambia de 0 al entero de la sección que acabamos de abrir.

Hasta ahí, si no hay ninguna sección abierta, pero si ya tenemos uan sección abierta,y un listener detecta que se ha pulsado otro botón, entramos de nuevo en al función control, comprobamos que estado ya no es 0 por que antes se ha visitado otra sección de la web. Con lo cual, entramos por el esle, una vez ahí, teneos otro switch que hace lo mismo que el anterior pero ademas llama a una función que cierra la sección abierta anteriormente.

Eso es todo, pero no funciona.

Por Perico19

39 de clabLevel



Genero:Masculino  

safari
Citar            
MensajeEscrito el 27 Ene 2010 05:01 pm
El error es efectivamente en el listener

Código ActionScript :

boton1.addEventListener(MouseEvent.CLICK, control(1));


Checa la ayuda sobre addEventListener, no puedes pasarle parametros de esa manera a ua funcion que funge como listener por default dicha funcion va recibir un evento (el evento especificado en el listener) en tu caso va recibir un "MouseEvent"

Código ActionScript :

function control(e:MouseEvent){}


En tu caso no hay mucho problema ya que puedes adaptar tu codigo en lugar de usar ese entero como parametro del switch usa el target del evento (Checa tmb en la ayuda target y currentTarget) el target sera el objto que despacha el evento en este caso uno de tus botones.

Código ActionScript :

//Yo cambiaria el switch para que sea en base al nombre del boton..."boton1","boton2" 
//Estado lo convierto en una cadena para ir guardando el estado
function control(e:MouseEvent){

switch(e.target.name){
case "boton1":
estado=e.target.name;
break
//etc etc...
}
}

Por Angel Roberto

Claber

248 de clabLevel



 

firefox
Citar            
MensajeEscrito el 27 Ene 2010 05:17 pm

Perico19 escribió:


El resultado de este código me da el siguiente fallo, que no se donde está para poder corregirlo:
TypeError: Error #2007: El valor del parámetro listener debe ser distinto de null.
at flash.events::EventDispatcher/addEventListener()
at agesto_fla::MainTimeline/frame49()

Efectivamente el error está en que está mal el parámetro del listener.
DEBERÍA SER

Código ActionScript :

boton1.addEventListener(MouseEvent.CLICK, control); 

Vamos, la función es "control", no "control(1)". control(1) es el resultado de la función control -que es null-
Una vez visto por qué da error, veamos cómo solucionar el problema de mandar un "argumento" a una función.
TODAS las funciones que "controlan" un addEventListener tienen un ÚNICO argumento. Este argumento ha de ser del tipo de evento que le hemos añadido al listener.
Así

Código ActionScript :

boton1.addEventListener(MouseEvent.CLICK,funcionClick)
function funcionClick(e:EventMouse){...} //<--el argumento es de tipo EventMouse
mc.addEventListener(Event.ENTER_FRAME,funcionEnterFram)
function funcionClick(e:Even){...} //<--el argumento es de tipo Event

¿cómo sabemos cual es el botón pulsado? pues a través de la "propiedad" target del argumento

Código ActionScript :

boton1.addEventListener(MouseEvent.CLICK,funcionClick)
function funcionClick(e:EventMouse){
  trace(e.target)
}

A veces es necesario hacer una "conversión de cast" si dentro de la función nos vamos a referir a un método del Mc que recibe el evento puesto que Flash interpreta e.target como un simple Objeto (esto es, algo que sólo tiene propiedades), por eso en ocasiones veremos algo como

Código ActionScript :

boton1.addEventListener(MouseEvent.CLICK,funcionClick)
function funcionClick(e:EventMouse){
  var boton:MovieClip=e.target as MovieClip //<--esto es la "conversión de cast"
  trace(boton) 
  trace(e.target)
}

Aunque en tu caso no es necesario.
Pero entonces, ¿cómo diablos le pasamos un parámetro a la función?
Existen diversos modos que pasan por extender la Clase o similares, pero el más sencillo es usar la propiedad "name" de tus MCs.
La propiedad name no hay que confundirla con el nombre de instancia, es una propiedad como la "x" ó la "y". Así que podemos escribir

Código ActionScript :

boton1.name="boton1"
boton1.addEventListener(MouseEvent.CLICK,funcionClick)
boton2.name="boton2"
boton2.addEventListener(MouseEvent.CLICK,funcionClick)
function funcionClick(e:EventMouse){
  var boton:MovieClip=e.target as MovieClip //<--esto es la "conversión de cast"
  trace(boton.name) 
  trace(e.target.name)
}

Ya casi lo tenemos, puesto que tenemos en name los string "boton1" ó "boton2" podemos escribir

Código ActionScript :

boton1.name="boton1"
boton1.addEventListener(MouseEvent.CLICK,funcionClick)
boton2.name="boton2"
boton2.addEventListener(MouseEvent.CLICK,funcionClick)
function funcionClick(e:EventMouse){
  var boton:MovieClip=e.target as MovieClip //<--esto es la "conversión de cast"
  var aux:Number=Number(e.target.name.substr(5))
  trace(aux) 
}

puff
Cosas para hacer en tu código
1.-Como todos los switch hacen lo mismo, usar simplemente

Código ActionScript :

    abrir(aux); 
    estado = aux; 

2.-Corregir el "if", supongo que debe ser

Código ActionScript :

cerrar(estado);   //<--el que cerramos es "estado"
abrir(aux); 
estado = aux;

Por Eliseo2

710 de clabLevel



 

firefox

 

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