Comunidad de diseño web y desarrollo en internet online

Como usar una sola función para varios Listeners

Citar            
MensajeEscrito el 26 Abr 2010 05:48 am
Buenas Noches, no sé si mi pregunta es un poco tonta jeje, pero no se como hacerlo, ojalá ustedes puedan ayudarme.

Hice un menú para una pagina, con diferentes botones. tengo dos funciones así

Código ActionScript :

function rollover(event:MouseEvent):void
{
   inicio_btn.x=10
}

function rollout(event:MouseEvent):void
{
   inicio_btn.x=0

}


y para cada boton listeners así:

Código ActionScript :

inicio_btn.addEventListener(MouseEvent.MOUSE_OVER,rollover);
inicio_btn.addEventListener(MouseEvent.MOUSE_OUT,rollout);

productos_btn.addEventListener(MouseEvent.MOUSE_OVER,rollover);
productos_btn.addEventListener(MouseEvent.MOUSE_OUT,rollout);


lo que quiero es no tener que escribir una funcion con nombre diferente para cada listener, sino tener muchos listeners y usar solo esas dos funciones. Algo como identificar cada listener, no se como hacerlo, soy novato en as3. Agradecería mucho su ayuda.

Por nesivapama

11 de clabLevel



 

Bogota, Colombia

chrome
Citar            
MensajeEscrito el 26 Abr 2010 06:32 am
Cuando añadimos un listener a un Objeto, el argumetno de la función es del mismo tipo que el listener añadido. Vamos, tal y como has puesto, al añadir un listener de tipo MouseEvent, el argumetno de la función es de tipo MouseEvent. Ese argumento tiene dos propiedades, target y currentTarget que son a quien le pasa el listener y a quien se le ha añadido el listener. Así que se puede escribir

Código ActionScript :

function rollover(event:MouseEvent):void 
{ 
   trace(event.target)
} 

Vale, hay que observar una cosa y es que "event.target" es de tipo "Objeto". Eso quiere decir que podremos escribir algo como

Código ActionScript :

function rollover(event:MouseEvent):void 
{ 
   trace(event.target)
   event.target.x=10
   event.target.alpha=.5
} 

Pero si, por ejemplo, hubieramos añadido el listener a un MC y quisiéramos usar un "método" tal y como gotoAndPlay deberíamos hacer una "conversión de cast"

Código ActionScript :

function rollover(event:MouseEvent):void 
{ 
   var mc:MovieClip=event.target as MovieClip
   mc.gotoAndStop(3)
   //Se puede hacer en un solo paso
   //MovieClip(event.target).gotoAndStop(3)
} 

Por Eliseo2

710 de clabLevel



 

firefox
Citar            
MensajeEscrito el 26 Abr 2010 06:49 am
muchas gracias por responder tan pronto!! me ha servido mucho, aunque me gustaria molestarte un poco mas y pedirte el favor si me puedes explicar mejor lo del MC. En que casos se usa. gracias!

Por nesivapama

11 de clabLevel



 

Bogota, Colombia

chrome
Citar            
MensajeEscrito el 26 Abr 2010 07:01 am
Otra pregunta.... por algo extraño que sucedió, me quedó el código así:

Código ActionScript :

inicio_btn.addEventListener(MouseEvent.MOUSE_OVER,rollover);
inicio_btn.addEventListener(MouseEvent.MOUSE_OUT,rollout);

quienes_btn.addEventListener(MouseEvent.MOUSE_OVER, rollover);
quienes_btn.addEventListener(MouseEvent.MOUSE_OUT, rollout);

productos_btn.addEventListener(MouseEvent.MOUSE_OVER,rollover);
productos_btn.addEventListener(MouseEvent.MOUSE_OUT,rollout);

function rollover(event:MouseEvent):void  
{  
   trace(event.target) 
   event.target.x=10 
   event.target.alpha=0.7
}

function rollout(event:MouseEvent):void
{
   trace(event.currentTarget) 
   event.target.x=0 
   event.target.alpha=1

}

Pero cuando pruebo la película, en el panel Salida de Flash CS4, me sale esto cada vez que se ejecuta la funcion, ya sea rollover o rollout:

Código :

[object MovieClip]


Que es esto?? como lo puedo quitar?

gracias!

Por nesivapama

11 de clabLevel



 

Bogota, Colombia

chrome
Citar            
MensajeEscrito el 26 Abr 2010 07:32 am
Lo que te aparece es a causa del "trace" que has puesto

Código ActionScript :

function rollover(event:MouseEvent):void   
{   
   trace(event.target)  //<---QUITA esta línea
   event.target.x=10  
   event.target.alpha=0.7 
}

Sobre lo de la "conversión de cast". Si miras la ayuda de Flash sobre MouseEvent verás que la "propiedad" target es de tipo Object. Sí, aunque estés añadiendo un listener a un botón o a un MovieClip, el "compilador" de Flash entiende que "event.target" es un simple objeto. Nosotros sí sabemos que es "algo más que un Objeto", pero Flash no. Así que, para que no nos de un error el compilador, le indicamos que es "algo más". Ese decirle que "es algo más" se llama "conversión de cast" (o castting).

Quizá siendo muy puristas deberíamos hacer siempre la conversión de cast. Vamos, que nuestra función fuera del tipo

Código ActionScript :

function rollover(event:MouseEvent):void   
{   
  //usamos una variable para "referirnos a event.target"
   //pero además le decimos de qué tipo es
   var mc:MovieClip=event.target as MovieClip
   //Y ahora usamos "mc" en lugar de event.target
   //p.e.
   mc.x=10
   mc.gotoAndPlay(3)
} 

No lo hacemos por "relajación" nuestra. y NO es necesario, so pena que tengamos que usar un "método"

(*)Rápidamente y mal explicado, en OOP, se habla de que los objetos tienen "propiedades" (la x, y la y de un MC, p.e.) y métodos (un gotoAndPlay(), un gotoAndStop()...) Un objeto es un "algo" que procede de una Clase (así, si tenemos un MC se habla de que "tenemos un objeto de tipo MovieClip " o "una instancia de tipo MovieClip", si tenemos un Array se habla de "un objeto de tipo (o de Clase) Array, etc.). Es sólo "palabrería", no te preocupes mucho por ello

Por Eliseo2

710 de clabLevel



 

firefox
Citar            
MensajeEscrito el 26 Abr 2010 07:42 am
Ok, si entendí, muchas gracias!. Pero no se sea muy canson yo pero tengo otra pregunta y esta si que me mata la cabeza.

en los botones quiero que vayan a diferentes zonas de la página
estoy usando algo como esto:

Código ActionScript :

var quienes = new Loader();
quienes.load(new URLRequest("quienes.swf"));

var productos = new Loader();
productos.load(new URLRequest("productos.swf"));


para precargar los contenidos. y para darle accion a los botones esto:

Código ActionScript :

function cambiar(Event:MouseEvent):void
{
   removeChild(productos);
   addChildAt(home,0);
   home.x = 271;
   home.y = 316;
}

y pongo removeChild para cada zona para que solo me muestre lo que yo quiero, pero entonces surgen varias cosas.
1. me sale: Error #2025: El objeto DisplayObject proporcionado debe ser un elemento secundario del llamador
2. me tocaria usar 10 funciones si tengo 10 botones y no se como hacer para hacer una funcion general y cambiar segun el boton... no se si es como con el target o no.

Gracias

Por nesivapama

11 de clabLevel



 

Bogota, Colombia

chrome
Citar            
MensajeEscrito el 26 Abr 2010 08:06 am
Bueno creo que me autorrespondo... al parecer ya solucioné el problema de cambiar de contenido así:

tengo una capa donde cargo lo primero que se ve así:

Código ActionScript :

var home = new Loader();
home.load(new URLRequest("home.swf"));
addChildAt(home,0);
home.x = 271;
home.y = 316;


como ya definí el Loader entonces puse eventos en los botones así:

Código ActionScript :

inicio_btn.addEventListener(MouseEvent.CLICK, cambiar);
quienes_btn.addEventListener(MouseEvent.CLICK, cambiar);


y las funcion cambiar la puse así:

Código ActionScript :

function cambiar(event:MouseEvent):void
{
   if(event.target==inicio_btn)
   {
      home.load(new URLRequest("home.swf"));
   }
   if(event.target==quienes_btn)
   {
      home.load(new URLRequest("quienes.swf"));
   }   
   
   addChildAt(home,0);
   home.x = 271;
   home.y = 316;
}


lo que hace es cargar diferentes peliculas en el contenedor, y si carga una y se cambia a otra, pues obviamente y automaticamente se deja de mostrar la anterior y se muestra la actual.
Aunque vi que al haber declarado el addChildAt y su posicion x y, ya no hay necesidad de volver a declararlo dentro de la funcion cambiar. Les agradezco mucho su ayuda!

Como cosa adicional me gustaria pedir otro favor. La web que estoy creando la tengo en esta dirección:
http://www.wefashionunderwear.tk/coimpal/

Hice un banner de fotos como se ve ahi, pero no se como hacerle un bucle infinito.

el Código es el siguiente:

Código ActionScript :

var speed:Number=2; //velocidad a la que mueven
var anchoFoto:Number=266; //ancho de las fotos
var movies:Array=new Array(image1,image2,image3,image4,image5,image6,image7);
this.addEventListener(Event.ENTER_FRAME, mueve)


function mueve(evt:Event)
{
   //muevo todas las fotos

   for (var i:Number=0; i<movies.length; i++)
   {
            movies[i].x-=speed;
         
   }
   if (movies[0].x<=(-anchoFoto))
   {
       movies[0].x=anchoFoto*movies.length;
      movies.push(movies.splice(0, 1));
   }

}


GRACIAS MILLONES DE GRACIAS!!

Por nesivapama

11 de clabLevel



 

Bogota, Colombia

chrome
Citar            
MensajeEscrito el 26 Abr 2010 08:07 am
Se supone que la parte que va así

Código ActionScript :

if (movies[0].x<=(-anchoFoto)) 
   { 
       movies[0].x=anchoFoto*movies.length; 
      movies.push(movies.splice(0, 1)); 
   } 


me hace el bucle, pero no funciona.

Por nesivapama

11 de clabLevel



 

Bogota, Colombia

chrome
Citar            
MensajeEscrito el 26 Abr 2010 08:21 am
Nesivapama, un "splice" lo que devuelve es un array (aunque sea de un elemento), con lo que, en principio debería ser

Código ActionScript :

movies.push(movies.splice(0, 1)[0]);  //<--añado el primer elemento del array resultante del splice

De otro modo, llegaríamos a que movies[6] NO sería un MC, sino un Array. Por eso, no funciona

NOTA:Si quieres simplificar olvidarte del splice, puedes escribir algo como

Código ActionScript :

function mueve(evt:Event) 
{ 
   for (var i:Number=0; i<movies.length; i++) 
   { 
            movies[i].x-=speed; 
            if movies[i].x<=(-anchoFoto){
                    movies[i].x=anchoFoto*movies.length
            }
   } 
}

Vale, quizá no sea tan "óptimo" (hace tantas comparaciones como imágenes tenemos), pero puede que sea más claro

Por Eliseo2

710 de clabLevel



 

firefox
Citar            
MensajeEscrito el 26 Abr 2010 08:31 am
Muchas gracias!! juntas formas me funcionan de maravilla... solo es cuestión de arreglar unas cuestiones de espacio, pues al pasar la última imagen me deja un espacio muy grande para volver a comenzar. Pero no creo que sea tan dificil jejejeje.

Muchas gracias! la verdad me has salvado el dia!

Por nesivapama

11 de clabLevel



 

Bogota, Colombia

chrome
Citar            
MensajeEscrito el 26 Abr 2010 08:54 am

nesivapama escribió:

Muchas gracias!! juntas formas me funcionan de maravilla... solo es cuestión de arreglar unas cuestiones de espacio, pues al pasar la última imagen me deja un espacio muy grande para volver a comenzar. Pero no creo que sea tan dificil jejejeje.

Sólo como dato. Cuando queremos hacer un carrusel contínuo de imágenes (bueno, lo que dices tú de banner infinito) lo que se suele hacer es duplicar la serie

Código :

imagen1--imagen2--imagen3--Copia de imagen1--Copia de imagen2--Copia de imagen3

Por Eliseo2

710 de clabLevel



 

firefox
Citar            
MensajeEscrito el 26 Abr 2010 03:16 pm
Pero al duplicar la serie no se vuelve más pesado?. y entonces si pasan las imágenes 100 veces entonces son 100 copias? no se tardaría mucho en cargar?.... ahi si no entendi mucho

Por nesivapama

11 de clabLevel



 

Bogota, Colombia

chrome
Citar            
MensajeEscrito el 26 Abr 2010 04:23 pm
Olvida mi comentario, que me he liado :(.
Sé que lo tuve que hacer en una ocasión con una tira de imágenes que se movían de izquierda a derecha según la posición del ratón y he pensado que era tu caso. Si, efectivamente, es ESE TU CASO, no hay que duplicar todas las imágenes, valdría con duplicar sólo unas cuantas (y en lugar de moverlas cuando la "x" sea <-anchoFoto, moverlas cuando sea <-anchoFoto+ancho_del_banner

Por Eliseo2

710 de clabLevel



 

firefox
Citar            
MensajeEscrito el 26 Abr 2010 05:13 pm

Por GustavoV

Claber

136 de clabLevel



Genero:Masculino  

chrome
Citar            
MensajeEscrito el 27 Abr 2010 03:44 am

Por nesivapama

11 de clabLevel



 

Bogota, Colombia

chrome

 

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