Comunidad de diseño web y desarrollo en internet online

Llamar a un array de movieclip creado a partir de un XML en una clase

Citar            
MensajeEscrito el 01 Abr 2011 03:03 pm
Hola, tengo un problema si me podeis ayudar.. Tengo una clase donde cargo de un XML las rutas de las imagenes que quiero cargar y las guardo en un array. Después con ese array de direcciones y un loader los cargo todos en un array de MovieClip. Ahora quiero devolver el array de MovieClip con todas las imagenes para acceder en el .fla y poder asignarle así el array de MovieClip a mi array, en mi escenario, para indicarle las posiciones en las que debe aparecer y demas..

Os pongo mi clase y el contenido del .fla:

Código ActionScript :


package{
   //imports
   import CargarFoto;
   import flash.display.Sprite;
   import flash.display.MovieClip;
   import flash.display.DisplayObject; 
   import flash.display.Loader;
   import flash.events.Event;
   import flash.net.URLLoader;
   import flash.net.URLRequest;
   
   public class CargarFichero extends MovieClip{
      
      //variables
      private var xml:XML;
      private var arrayDir:Array;
      private var _arrayClip:Array= new Array() ;
      private var imagen:Loader;
      private var clip:MovieClip=new MovieClip();
      
      public function CargarFichero() {
         var urlLoader:URLLoader = new URLLoader();
                  urlLoader.addEventListener(Event.COMPLETE, cargarXML);
                   urlLoader.load(new URLRequest("miXml1.xml"));            
      }
      
      public function cargarXML(event:Event){
         xml=XML(event.target.data);
         trace(xml);
         
         arrayDir = new Array();
         for each (var i:XML in xml.item){
             //trace("1::"+i.image);
             arrayDir.push(i.image);          
          }
         for (var j:uint=0; j<arrayDir.length; j++){
             var imagen=new Loader();
            imagen.load(new URLRequest(arrayDir[j]));
            this.addChild(imagen);
            clip.addChild(imagen);
            clip.name="mc"+[j];
            _arrayClip.push(clip);            
         }     
              }
       
       public function get arrayClip():Array {
          // devuelve el valor del arrayClip         
          return _arrayClip;          
       }   
   }
}

 


Código ActionScript :

       var carga:CargarFichero=new CargarFichero();
   var array:Array= new Array();
   array=carga.arrayClip;
   trace("array de 0::"+array[0]);
   for(var i:uint;i<array.length;i++){
          trace("array::"+array[i]);
        }
 


Me devuelve valor undefined el array, pero en la clase si que puedo ver que tengo un array de clips con los nombres que quiero.
Lo que quiero ahora en el .fla es conseguir asignar el array de movieclip para utilizarlo y asignarle las posiciones..
No entiendo porque llega vacio, alquien me puede ayudar? Gracias por adelantado.

Por madeline

28 de clabLevel



 

firefox
Citar            
MensajeEscrito el 01 Abr 2011 07:50 pm
El arrayclip se llena desde un XML, es decir es fruto de una operación asíncrona, con lo cual no puedes acceder directamente al valor porque todavía no ha sido cargado. Tu clase debería generar un evento cuando lo termina de cagar, que monitorizas desde tu flash para acceder al valor deseado

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 04 Abr 2011 07:58 am
Gracias por responder Jorge, estoy intentando hacer lo que me has dicho, pero me estoy liando, me puedes dar una idea de como debo llamar al evento y donde? ¿Cómo puedo hacerlo? En que punto?

Por madeline

28 de clabLevel



 

firefox
Citar            
MensajeEscrito el 04 Abr 2011 10:46 am
El evento lo disparas al final del método cargarXML

dispatchEvent(new Event("listo"));

Luego en donde quieres escuchar haces

carga.addEventListener("listo", procesar)

Y en la función procesar ya accedes al XML cargado

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 04 Abr 2011 11:57 am
Gracias Jorge, ya he entendido lo que me has dicho y me ha salido. El problema ahora es que no me sé cómo ver las imagenes que tengo cargadas en el array de movieclip.
Es decir yo quiero que se vean las imagenes que he cargado en el arrayclip en mi escenario, donde tengo unos movieclip vacios llamados (mc0,mc1,mc2,mc3) como lo hago para que se corresponda?
Lo de tenerlo en un array es para poder despues enviar este array a una clase que tengo definida que me arrastra y coloca las imagenes en otro sitio.
Espero que se entienda lo que quiero hacer sino lo intento explicar de nuevo.. alguna idea por favor?

Por madeline

28 de clabLevel



 

firefox
Citar            
MensajeEscrito el 04 Abr 2011 04:06 pm
Jo no consigo ver las imagenes que tengo cargadas en el arrayclip en la escena... porque no se ven, sigo los pasos y si que aparecen cargadas desde el xml en el array, pero no se como acceder para poder verlas...
Alguien me puede ayudar??Gracias por adelantado

Por madeline

28 de clabLevel



 

firefox
Citar            
MensajeEscrito el 04 Abr 2011 05:08 pm
Veo que est{ashaciendo un this.addchild, es decir lo estás agregando en donde estés, pero al no darle x e y, seapilan uno arriba de otro .. el código está en el timeline?

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 04 Abr 2011 05:30 pm
No tengo una clase que me carga el xml y luego llamo a esta clase en el timeline.
Esta es la clase:

Código ActionScript :

public class CargarFichero extends MovieClip{
      
      //constantes
      public static const XML_CARGADO:String = "xml_clip_lleno"; 
      
      //variables
      private var xml:XML;
      private var arrayDir:Array;
      private var _arrayClip:Array= new Array() ;      
      private var imagen:Loader;
      private var clip:MovieClip=new MovieClip();      
      
      public function CargarFichero() {
         var urlLoader:URLLoader = new URLLoader();
                  urlLoader.addEventListener(Event.COMPLETE, cargarXML);
                   urlLoader.load(new URLRequest("miXml1.xml"));         
      }
            
      public function cargarXML(event:Event){
         var z:int=77;
         xml=XML(event.target.data);
         trace(xml);         
         
         arrayDir = new Array();
         for each (var i:XML in xml.item){             
             arrayDir.push(i.image);          
          }
         for (var j:uint=0; j<arrayDir.length; j++){         
            var imagen=new Loader();
            imagen.load(new URLRequest(arrayDir[j]));
            this.addChild(imagen);
            clip.addChild(imagen);
            clip.name="mc"+[j];
            clip.x=700;
            clip.y=z+100;            
            _arrayClip.push(clip);                         
         }
         dispatchEvent(new Event(CargarFichero.XML_CARGADO));              
         }
   }
}


Ahora por otro lado en el timeline:

Código ActionScript :

        import MoverAlimentos;
   import CargarFichero;
   
   //Cargar las imagenes
   var carga:CargarFichero=new CargarFichero();
   carga.addEventListener(CargarFichero.XML_CARGADO, procesar);
   
        function procesar(event:Event){ 
      var array:Array=new Array();
      //var alimentosArray:Array =[mc0, mc1, mc2, mc3];
        array=carga.arrayClip; 
      for(var i:uint;i<array.length;i++){
         //["mc"+i]=array[i];
         //alimentosArray.push(array[i]);         
         trace("array::"+array[i]);         
      }
      var relacionesArray:Array = [targetmc0, targetmc1, targetmc2, targetmc3];
      var mueveAlimentos:MoverAlimentos = new MoverAlimentos(stage, array, relacionesArray);
   
      mueveAlimentos.addEventListener(MoverAlimentos.RELACION_HECHA, onHayRelacion);
      mueveAlimentos.addEventListener(MoverAlimentos.NO_RELACION, onNoHayRelacion);
      mueveAlimentos.addEventListener(MoverAlimentos.TODO_HECHO, onTodoHecho);
   }


Lo que quiero hacer es que mi array de movieclip cargados contenga los valores "var alimentosArray:Array =[mc0, mc1, mc2, mc3];" es decir los movieclip que yo tenia en la escena ahora los cargo con un xml como te he dicho pero no se me ven y tampoco se como hacer para que me pase a la otra funcion el array con los nombres de los movieclip..

Espero que me entiendas sino me intento explicar de nuevo, de todas formas no entiendo porque no se estan cargando, muchas gracias por tu ayuda, jo no hay manera no encuentro lo que me pasa

Por madeline

28 de clabLevel



 

firefox
Citar            
MensajeEscrito el 04 Abr 2011 06:07 pm
Estas proponiendo soluciones técnicas antes de plantear el problema. No me cuentes a que clase quieres pasarlo ni de arrays, dime que quieres lograr visualmente

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 04 Abr 2011 06:14 pm
Pues tengo en mi escena definidos 4 movieclip (mc0,mc1,mc2,mc3) vacios en unas posiciones concretas y quiero colocar mis imagenes cargadas con un xml en dichas posiciones.
Y necesito tener esos movieclip en un array.
Pero no hay manera de que se vean las imagenes cargadas.
Espero que ahora me hayas entendido, gracias por responder tan rapido

Por madeline

28 de clabLevel



 

firefox
Citar            
MensajeEscrito el 04 Abr 2011 06:19 pm
Si los clips están en escena, entonces en tu loop algo asi

Código ActionScript :

var ldr = new Loader();
ldr.load(new URLRequest(array[i]))
this.getChldByName("mc"+i).addChild(ldr);


Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 04 Abr 2011 06:20 pm
Por cierto, lo de meter las imagenes en un array de movieclip es porque se lo tengo que enviar asi a mi otra clase donde permito que mis imagenes hagan las operaciones de drag y drop, si no cargo las imagenes del xml como un movieclip no me va a funcionar despues...

Por madeline

28 de clabLevel



 

firefox
Citar            
MensajeEscrito el 04 Abr 2011 06:27 pm
He puesto lo que me has dicho en el loop del .fla y me aparece este error:
1061: Llamada a un método addChild posiblemente no definido mediante una referencia con tipo estático flash.display:DisplayObject.
En esta línea: this.getChildByName("mc"+i).addChild(ldr);

Por madeline

28 de clabLevel



 

firefox
Citar            
MensajeEscrito el 04 Abr 2011 06:38 pm
hazle un cast

MovieClip(this.getChildByName("mc"+i)).addChild(ldr);

jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 05 Abr 2011 10:42 am
Gracias Jorge, así si que me carga las imágenes.
Ahora me surge otra duda, crees que puedo poner todo lo que tengo en el .fla en otra clase Aplicación que me ejecute todo lo de ese fotograma?
Es que tengo que crear una serie de botones que me vaya pasando de un fotograma a otro y no estoy segura de que sea buena idea?
Gracias una vez más.

Por madeline

28 de clabLevel



 

firefox
Citar            
MensajeEscrito el 06 Abr 2011 04:41 pm
Hola! me ha surgido otra duda, cómo podría colocar el código en mi clase cargarFichero, es decir como accedo desde una clase a los MovieClip definidos en la escena, para colocar mi bucle dentro de la clase cargaXML.

Me refiero a como colocar el siguiente código:

Código ActionScript :

var ldr = new Loader();

ldr.load(new URLRequest(array[i]))

(MovieClip)this.getChldByName("mc"+i).addChild(ldr);



Para que me reconozca los movieclip que tengo en escena que se van llamando mc0, mc1,..
en otras ocasiones me funcionaba poniendo parent en vez de this pero ahora me sale el error:

TypeError: Error #1009: No se puede acceder a una propiedad o a un método de una referencia a un objeto nulo.
at CargarFichero/cargarXML()
at flash.events::EventDispatcher/flash.events:EventDispatcher::dispatchEventFunction()
at flash.events::EventDispatcher/dispatchEvent()
at flash.net::URLLoader/flash.net:URLLoader::onComplete()

Lo estoy cargando exactamente después de almacenar en el array las direcciones del XML en la funcion escrita antes de cargarXML.
Si alguien me ayuda, gracias, no encuentro como se accede a un MovieClip del escenario desde una clase.

Por madeline

28 de clabLevel



 

firefox
Citar            
MensajeEscrito el 06 Abr 2011 05:05 pm
La ruta padre es siempre root, aunque usarla implica acoplamiento, es decir si quieres mover algo te traes contigo todos los errores, pero prueba

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 07 Abr 2011 08:51 am
Ya tienes razón da problemas, pero necesito quitar todo el código posible del .fla y añadir botones de repetir la carga de imagenes...
Me da este error:
1061: Llamada a un método getChildByName posiblemente no definido mediante una referencia con tipo estático flash.display:DisplayObject.
(MovieClip(root.getChildByName(s))).addChild(imagen);

Tanto si lo pongo así, como si lo declaro primero como un DisplayObject:
var obj:DisplayObject= root.getChildByName(s);
Me salta el mismo error..

Por madeline

28 de clabLevel



 

firefox
Citar            
MensajeEscrito el 07 Abr 2011 10:11 am
Esta mal el cast, sería

Código ActionScript :

var container:MovieClip = MovieClip(root).getChildByName(s) as MovieClip
container.addChild(imagen);


Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 07 Abr 2011 11:48 am
Nada de esta forma se ejecuta pero me vuelve al error:
TypeError: Error #1009: No se puede acceder a una propiedad o a un método de una referencia a un objeto nulo.
at CargarFichero/cargarXML()
at flash.events::EventDispatcher/flash.events:EventDispatcher::dispatchEventFunction()
at flash.events::EventDispatcher/dispatchEvent()
at flash.net::URLLoader/flash.net:URLLoader::onComplete()
Como que no encuentra el valor de s no?? que es mi movieclip

Por madeline

28 de clabLevel



 

firefox
Citar            
MensajeEscrito el 07 Abr 2011 11:51 am
Exacto, s no tiene un valor que exista, traza s a ver que string es, y asegúrate que ya haz hecho el addChild de ese MC antes del getChildByName

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 07 Abr 2011 02:21 pm
s es igual a mc0, mc1,.. segun el valor de j en el bucle, y cada uno se corresponde con el nombre de un movieclip que tengo en la escena, por eso no se como hacer el addChild, se supone que ya esta hecho no?

Por madeline

28 de clabLevel



 

firefox
Citar            
MensajeEscrito el 07 Abr 2011 02:24 pm
Que lo trace no significa que este en el displaylist, asegurate que haz hecho el addChild antes de usar getChildByName

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 07 Abr 2011 02:48 pm
No sé como hacer el addChild, de qué lo debo hacer si el movieClip esta en la escena? y s sólo es el String con el nombre.

Por madeline

28 de clabLevel



 

firefox
Citar            
MensajeEscrito el 07 Abr 2011 02:50 pm
Si dices que esta en el escenario, a lo mejor la ruta no es root (timeline principal), sino algun clip anidado

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 12 Abr 2011 11:48 am
Está arreglado!, muchas gracias por tu ayuda.

Por madeline

28 de clabLevel



 

firefox

 

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