Tengo en pantalla varios frames con muchos objetos pero hay unos en especial que necesito leer, son MovieClips y para leerlos hago un barrido de todos los objetos en pantalla y por medio de su nombre (con un formato que yo elegi) les agrego listeners y propiedades, vean la funcion
Código ActionScript :
public function carga(objeto:Object) {
//Principal es el swf padre de donde leere mis movieclips
principal=objeto;
var nombre:String=new String();
var short_name:String=new String();
//Hago el ciclo para recorrer cada objeto en pantalla
for (var i=0; i<principal.numChildren; i++) {
//Valido que sea MovieClip
var clip=principal.getChildAt(i);
if (clip is MovieClip) {
nombre=clip.name;
} else {
nombre="nada";
}
//valido el formato del nombre que es de tipo("c"+numero+"_"+numero) ej: c1_0
if (nombre.indexOf("c")==0 && nombre.indexOf("cerrar")==-1 && -->
<-- nombre.indexOf("contenedor_plantilla")==-1) {
//Indice es una propiedad que yo agrego(mas adelante explicare)
if(MovieClip(principal.getChildAt(i)).indice==undefined){
short_name=nombre.substring(nombre.indexOf("_"));
MovieClip(principal.getChildAt(i)).destino=Number(short_name.substring(short_name.indexOf("_")+1));
var temp:Point=new Point(MovieClip(principal.getChildAt(i)).x,MovieClip(principal.getChildAt(i)).y);
MovieClip(principal.getChildAt(i)).indice=origenes_array.length;
origenes_array.push(MovieClip(principal.getChildAt(i)));
transform_array.push(MovieClip(principal.getChildAt(i)).transform.colorTransform);
pos_array.push(temp);
trace(temp);
}else{
//Lineas de prueba
MovieClip(principal.getChildAt(i)).x=pos_array[MovieClip(principal.getChildAt(i)).indice].x;
MovieClip(principal.getChildAt(i)).y=pos_array[MovieClip(principal.getChildAt(i)).indice].y;
}
trace(MovieClip(principal.getChildAt(i)).indice);
MovieClip(principal.getChildAt(i)).buttonMode=true;
MovieClip(principal.getChildAt(i)).addEventListener(MouseEvent.CLICK,click_origen);
MovieClip(principal.getChildAt(i)).colorear=false;
}
}
trace("origenes:",origenes_array.length);
trace("posicion",pos_array.length,"transform",transform_array.length);
}
/////////////////////////////////////////////////////////
Lo que hago es tener en escena ciertos movieclips que necesito que detecten el click del mouse y ademas validar si es correcto o incorrecto para esto uso el formato de nombre solo habra dos tipos de nombre, n=numero cualquiera, cn_1 o cn_0 (1 correcto 0 incorrecto) en caso de ser correcto lo coloreo verde o incorrecto rojo por eso guardo su transform en otro arreglo, la posicion era innecesaria ya que nunca los muevo pero como se movian comence a guardar la posicion pero de nada sirvio, mando llamar otra funcion que se llama restaurar que lo que hace es regresarles su transform original.
Código ActionScript :
public function restaurar() {
for each(var item:MovieClip in origenes_array){
if(item.colorear){
item.transform.colorTransform=transform_array[item.indice];
item.colorear=false;
}
}
Los listeners los quito en la misma funcion que detecta el click le dan click y les remuevo el listener (no lo muestro por que lo creo innecesario).
Todo ese codigo lo tengo dentro de una clase (no es mi clase de documento) la clase de documento se encarga de gestionar este codigo, como datos curiosos tengo varios:
Tenia un swf con los objetos, este swf mandaba llamar estos metodos (desde su clase de documento) y nada fallaba, pero fue necesario extraer el codigo del swf, la idea es hacer archivos en masa varios diseñadores ponen esos objetos en pantalla y los nombran en base a lo mencionado antes y un cambio en mi calse significaba republicar uno por uno cada archivo entonces hice un swf con todo el codigo ahora la clase de documento de cada archivo manda cargar el swf de codigo y si le hago algun cambio solo republico ese y se refleja en todos, es por eso que a carga le mando de parametro lo que vendria siendo mi escena principal quedaria algo asi.
Main>>codigo
Y desde codigo leo objetos de Main, hay en linea de tiempo varios fotogramas y yo los elijo al azar y en cada uno se manda llamar carga por eso yo valido que si hay un fotograma donde ya llegue no lo almaceno en mis arreglos el problema esque llego por ejemplo al fotograma 1 leo 3 objetos y me voy al fotograma 2 (con 3 objetos) y solo me lee dos y el tercer objeto aparece movido (yo por codigo no los muevo solo guardo la referencia) hasta aqui me quede ya no se que mas hacerle para que no los mueva y los lea bien.
Dato curioso 2: En linea de tiempo los objetos a leer pueden y generalmente son un mismo movieclip que los diseñadores meten a pantalla varias veces y ellos nombran asi que puedo tener un MovieClip de tipo cuadro que se llame c1_0 en el frmae 1 y un MovieClip de tipo cuadro que se llame c1_0 en el frame 2 (esto no deberia representar problema pero es un dato),dichos movieclips no tienen ninguna clase asociada solo estan en pantalla y no deberian moverse cuando llamo carga
Esto funcionaba bien hasta que implemente meter el codigo en otro swf externo, alguna idea?? esta mal que el hijo tenga referencias a objetos del padre?? algun dia terminara este post??
Alguien ayudeme (tono de desesperacion).
