Comunidad de diseño web y desarrollo en internet online

Asignar propiedades a un grupo de movieclips

Citar            
MensajeEscrito el 17 Ago 2009 04:07 pm
Hola a todos,

Tengo una animación que permite al usuario seleccionar entre varios movieclips, muchos en realidad, y cada uno tiene una capa a la que tengo que asignarle una propiedad de este tipo:

Código ActionScript :

mc_1.visible=false;
mc_2.visible=false;
mc_3.visible=false;
mc_4.visible=false;


El tema es que son más de 50 y no es muy eficiente hacerlo uno por uno. Estoy seguro de que debe existir un bucle que me permita hacerlo de forma sencilla, pero no se me ocurre cómo ya que mis conocimientos son limitados.

Siempre estoy tratando de aprender algo nuevo, asi que aunque este método "carretero" de ir listando uno por uno cada movieclip, en la práctica funciona, me imagino que debe existir una manera más correcta.

Saludos!

Por -Javier-

21 de clabLevel



Genero:Masculino  

Diseñador programático o Programador gráfico

firefox
Citar            
MensajeEscrito el 17 Ago 2009 04:16 pm
Pruébalo así:

Código ActionScript :

for(var i:Number = 1; i<51; i++) MovieClip(this.getChildByName("mc_"+i)).visible=false; 


Si los has creado en niveles consecutivos, getChildAt (en vez de getChildByName) te dará mejor performance

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 17 Ago 2009 04:35 pm
Extraordinario, funcionó perfecto. Eso si, no eran movieclips, eran botones, y lo había olvidado, pero con un pequeño cambio en la sentencia quedó impecable.

Muchas gracias :D

Por -Javier-

21 de clabLevel



Genero:Masculino  

Diseñador programático o Programador gráfico

firefox
Citar            
MensajeEscrito el 17 Ago 2009 05:07 pm
Tengo una nueva duda, ya que la solución simplificó mucho el código que tenía. Para cada botón hay una función asociada, del tipo:

Código ActionScript :

function marcar1(event:MouseEvent):void { >>accion del botón<< }
function marcar2(event:MouseEvent):void { >>accion del botón<< }
function marcar3(event:MouseEvent):void { >>accion del botón<< }


¿Cómo podría también repetir esta función para cada botón, sabiendo que para cada uno el nombre de la función debe cambiar? ¿O mi enfoque está errado?

Saludos,

Por -Javier-

21 de clabLevel



Genero:Masculino  

Diseñador programático o Programador gráfico

firefox
Citar            
MensajeEscrito el 17 Ago 2009 05:53 pm
ps nada mas agrega el listener a ese grupo de movieclips asi:

Código ActionScript :

for(var i:Number = 1; i<51; i++) {
   MovieClip(this.getChildByName("mc_"+i)).addEventListener(MouseEvent.CLICK,clickHandler)
   MovieClip(this.getChildByName("mc_"+i)).addEventListener(MouseEvent.MOUSE_OVER,mouseOverHandler);
  MovieClip(this.getChildByName("mc_"+i)).addEventListener(MouseEvent.MOUSE_OUT,mouseOutHandler);
}


espero sea eso alo que te referias , saludos

Jonathan

Por maneuver

243 de clabLevel



Genero:Masculino  

Mexico City

opera
Citar            
MensajeEscrito el 17 Ago 2009 06:02 pm
En realidad es lo siguiente:

-Cada botón tiene una luz que es un movieclip.
-Cuando hago click en un botón los demás deben apagar su luz.

Yo estaba planeando hacer lo siguiente para cada botón, por ejemplo, para el botón 1 y 2:

Código ActionScript :

function marcar1(event:MouseEvent):void {
      actual_1.visible=true; //botón 1 encendido
      actual_2.visible=false;
      actual_3.visible=false;
      actual_4.visible=false;
      actual_5.visible=false;
      (etc, etc hasta 50!...)
}

function marcar2(event:MouseEvent):void {
      actual_1.visible=false;
      actual_2.visible=true; //ahora el botón 2 esta encendido.
      actual_3.visible=false;
      actual_4.visible=false;
      actual_5.visible=false;
      (etc, etc...)
}


Claramente con este sistema no llego a buen puerto porque la cantidad de código repetido es enorme. Esto es lo que necesito optimizar. Ahora creo que se entiende ¿si?

Saludos!

Por -Javier-

21 de clabLevel



Genero:Masculino  

Diseñador programático o Programador gráfico

firefox
Citar            
MensajeEscrito el 17 Ago 2009 06:05 pm
Agrego que cada función es llamada asi:

Código ActionScript :

boton_1.addEventListener(MouseEvent.CLICK,marcar1);
   boton_2.addEventListener(MouseEvent.CLICK,marcar2);
(etc...)

Por -Javier-

21 de clabLevel



Genero:Masculino  

Diseñador programático o Programador gráfico

firefox
Citar            
MensajeEscrito el 18 Ago 2009 12:07 am
Sería algo así:

Código ActionScript :

function marcar(event:MouseEvent):void { 
     for(var i:Number=1; i<51; i++) this["actual_"+i].visible = false
      MovieClip(event.target).visible=true;
} 


Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 19 Ago 2009 04:53 am
A veces la solución la tienes al frente pero sólo necesitas ver las cosas desde otro punto de vista...
Muchas gracias, era tan simple, sin embargo no podía ver la solución.
Saludos!

Por -Javier-

21 de clabLevel



Genero:Masculino  

Diseñador programático o Programador gráfico

firefox
Citar            
MensajeEscrito el 19 Ago 2009 05:17 am
Emnm.. nop, me apresuré. El problema que tengo es que hay botones llamado boton_1, boton_2, etc, que son los que tienen asignados el evento del mouse, osea la función, y la luz, que es otro movieclip, actual_1, actual_2, etc, que es el que debe encendense cuando hago click en el botón.

Pero por lo menos ya he simplificado un poco el código, ahora para cada botón solo tengo necesito esto:

Código ActionScript :

boton_1.addEventListener(MouseEvent.CLICK,marcar1);

function marcar1(event:MouseEvent):void {
         for(var i:Number = 1; i<51; i++) getChildByName("actual_"+i).visible=false;
         getChildByName("actual_1").visible=true;
}


Pero igual tengo que hacer 50. Lo único que se me ocurre es usar de alguna manera la numeración (botón y movieclip "actual" llevan el mismo número). A lo mejor si lo pudiera pasar a la función.

Saludos!

Por -Javier-

21 de clabLevel



Genero:Masculino  

Diseñador programático o Programador gráfico

firefox
Citar            
MensajeEscrito el 19 Ago 2009 11:50 am
La única diferencia entre el código que puse y el tuyo es que el mío es dinámico y tu lo has vuelto a poner estático. Dedícale tiempo, medita

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 19 Ago 2009 03:18 pm
Estaba revisandolo, y el problema es que, mirando el ejemplo, el event.target apuntaría al movieclip boton_1, mientras que yo necesito que apunte al movieclip actual_1. Pero no sé cómo podría relacionar ambos, creo que el hecho de que ambos esten numerados igual me permitiría insertar una variable, pero no sé como.

He estado revisando otros códigos buscando algo que me de una pista, una luz, pero mis pruebas mandan todas error.

Saludos!

Por -Javier-

21 de clabLevel



Genero:Masculino  

Diseñador programático o Programador gráfico

firefox
Citar            
MensajeEscrito el 19 Ago 2009 03:25 pm
Si ambos tienen el nro después del guión bajo lo tomas de allí:

Código ActionScript :

var nr = evt.target.name.split("_")[1]
this["actual_"+nr].visible = false


Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 19 Ago 2009 05:26 pm
Gracias, creo que voy encaminandome, pero asi como la pusiste no funcionaba, supuse que había que cambiar el "evt" por "event", pero tampoco. Decidí descomponerla para ver si faltaba algún paso, asi que hice algunos cambios, pero no está efectuando el split, o por lo menos no está ejecutando la última línea.

Código ActionScript :

var tpreg:int= 51;
for(var p:Number = 1; p<tpreg; p++) {
   getChildByName("boton_"+p).addEventListener(MouseEvent.CLICK,marcar);  // funciona perfecto
}
   
function marcar(event:MouseEvent):void {
   for(var m:Number = 1; m<tpreg; m++) getChildByName("actual_"+m).visible=false; // Esto funciona correctamente
   var targetNombre:String = event.currentTarget.name.toString(); 
     var temp:Array = targetNombre.split("_"); 
     var nr:int=(temp[1]);
   this["actual_"+nr].visible=true;
   }


¿Qué está mal? Flash no manda error, simplemente la última línea no se ejectuta, no se hace visible.

Saludos!

Por -Javier-

21 de clabLevel



Genero:Masculino  

Diseñador programático o Programador gráfico

firefox
Citar            
MensajeEscrito el 20 Ago 2009 12:14 pm
Posiblemente sea un tema de rutas, y actual_xxx no está al alcance, traza para ver:

trace("actual_"+nr+" es "+this["actual_"+nr])

Si sale undefined, entonces no es la ruta correcta (event.target siempre lo es porque la referencia viene en el evento)

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 21 Ago 2009 12:11 am
Eso era, exactamente: el:

Código ActionScript :

this["actual_"+nr].visible=true;

Lo reemplacé por:

Código ActionScript :

getChildByName("actual_"+nr).visible=true;

Y funcionó perfecto! Te pasaste! Realmente muy agradecido.

Por -Javier-

21 de clabLevel



Genero:Masculino  

Diseñador programático o Programador gráfico

firefox

 

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