Comunidad de diseño web y desarrollo en internet online

Cargando imágenes en runtime

Citar            
MensajeEscrito el 15 Ago 2008 07:43 pm
Estoy cargando imágens dinamicamente pero cuando llamo a la función que me informa el proceso de carga. Esta pierde el valor de i. Cuando traceo me devuelve siempre el valor del length del array e ignora 0,1 y 2.Alguien sabe porque?

Código ActionScript :

var aDirecciones:Array = [ "jpg/auto1.jpg", "jpg/auto2.jpg", "jpg/auto3.jpg" ]
var aCargadores:Array = new Array();
var aContainers:Array = new Array();
var iniY:Number = 80;

var step:Number = 120;

for ( var i:int = 0; i<aDirecciones.length; i++ )
{
   aCargadores[i] = new Loader();
   aContainers[i] = new Sprite();
   aContainers[i].x = 50;
   if ( i == 0 )
   {
      aContainers[i].y = iniY;
   }
   else
   {
      aContainers[i].y = aContainers[i-1].y + step;
   }
   this.addChild( aContainers[i] );
   aContainers[i].addChild(aCargadores[i]);
   aCargadores[i].load( new URLRequest ( aDirecciones[i] ) );
   aCargadores[i].contentLoaderInfo.addEventListener(Event.COMPLETE, aCargadores_onComplete);
   function aCargadores_onComplete (evento:Event):void
   {
      trace (i);
      //aCargadores[i].scaleX = 0.44;
      //aCargadores[i].scaleY = 0.44;
   }
}

Desde ya muchas gracias

Por Ishkandar

Claber

303 de clabLevel



Genero:Masculino  

firefox
Citar            
MensajeEscrito el 15 Ago 2008 09:47 pm
Si no le das formato al código es muy difícil de leer, casi no entiendo nada, pero te puedo decir por arriba que los valores de "i" de tu ciclo pasan desde 0 hasta 1000 en fracciones de milésimas de segundo y tu función es llamada cuando los loaders terminan de cargar uno por uno, por lo tanto cuando estos terminen por muy poco que se demoren el valor de "i" en ese momento va a ser el último valor del ciclo.

Por elchininet

Claber

3921 de clabLevel

17 tutoriales

Genero:Masculino  

Front-end developer at Booking.com

firefox
Citar            
MensajeEscrito el 16 Ago 2008 12:36 pm
Dos preguntas entonces: cómo dejo esto en formato código? y cuál sería la solución al problema?

Claudio

Por Ishkandar

Claber

303 de clabLevel



Genero:Masculino  

firefox
Citar            
MensajeEscrito el 16 Ago 2008 01:02 pm
Dejando el código mas organizado:

Código :

var aDirecciones:Array = [ "jpg/auto1.jpg", "jpg/auto2.jpg", "jpg/auto3.jpg" ]
var aCargadores:Array = new Array();
var aContainers:Array = new Array();
var iniY:Number = 80;
var step:Number = 120;

for ( var i:int = 0; i<aDirecciones.length; i++ )
{
     aCargadores[i] = new Loader();
     aContainers[i] = new Sprite();
     aContainers[i].x = 50;
     if ( i == 0 )
     {
        aContainers[i].y = iniY;
     }
     else
     {
        aContainers[i].y = aContainers[i-1].y + step;
     }
     this.addChild( aContainers[i] );
     aContainers[i].addChild(aCargadores[i]);
     aCargadores[i].load( new URLRequest ( aDirecciones[i] ) );
     aCargadores[i].contentLoaderInfo.addEventListener(Event.COMPLETE, aCargadores_onComplete);
     function aCargadores_onComplete (evento:Event):void
     {
        trace (i);
        //aCargadores[i].scaleX = 0.44;
        //aCargadores[i].scaleY = 0.44;
     }
}

Por Ishkandar

Claber

303 de clabLevel



Genero:Masculino  

firefox
Citar            
MensajeEscrito el 16 Ago 2008 01:07 pm
Aquí explican las nuevas mejoras del nuevo diseño del foro, entre ellas el formato de los códigos:

http://www.cristalab.com/blog/59715/nuevo-diseno-del-foro-y-servicios-en-cristalab.html

Ahora lo que preguntas, no hace falta que captures la variable, si quieres saber cuál loader fue el que terminó de cargar solo captúralo en el target del evento:

Código ActionScript :

function aCargadores_onComplete (evento:Event):void{

   var myLoader:Loader = Loader(evento.target.loader);

}


Si de todas formas lo que quieres es el número específico, pues nombra el loader cuando lo añadas a la DisplayList y en el nombre incluye el número para que después lo puedas extraer del mismo:

Código ActionScript :

//---Aquí se le pone un nombre al añadirlo a la DisplayList

aContainers[i].addChild(aCargadores[i]).name = "loader_" + i;

aCargadores[i].load(new URLRequest(aDirecciones[i]));

aCargadores[i].contentLoaderInfo.addEventListener(Event.COMPLETE, aCargadores_onComplete);

function aCargadores_onComplete(evento:Event):void {
   
   var myLoader:Loader = Loader(evt.target.loader);
   var myLoaderName:String = myLoader.name;
   
   var myNumber:uint = Number(myLoaderName.replace("loader_", ""));
   
   trace(myNumber);
   
}

Por elchininet

Claber

3921 de clabLevel

17 tutoriales

Genero:Masculino  

Front-end developer at Booking.com

firefox
Citar            
MensajeEscrito el 16 Ago 2008 01:49 pm
En realidad mandé tracear el "i" al final para tentar determinar el orígen del error que me estaba devolviendo.
La intención original es cargar todas las imágenes y cuando ese proceso esté completo modificar la escala de las mismas con ScaleX y SacleY.
Lo que no entiendo es porqué dentro del ámbito de esta función "i" nunca es 0 ni 1 ni 2.
Agradecería si me pudieses explicar como funcina coneptualmente este proceso.
Veamos si consigo aclarar mi duda. Cuando i es 0 y se manda cargar la la primera imágen, mientas esta se está cargando el "i" ya pasó para la siguiente? El problema entonces podría resumirse a lo siguiente, cuando la primera estubiese cargada aplicarle la escala a esta y así sucesivametente. Que fue lo que intenté hacer, sin éxito...claro.
La otra opción sería esprar que la última fuese cargada y aplicarle la escala a todas. El problema es que no estoy sabiendo como gerenciar lo que pasa dentro del ámbito del COMPLETE.

Claudio

Por Ishkandar

Claber

303 de clabLevel



Genero:Masculino  

firefox
Citar            
MensajeEscrito el 16 Ago 2008 03:16 pm
Mira, el problema es que AS no es lenguaje como Basic que hasta que no terminara de ejecutarse una línea no continuaba con la siguiente, AS es orientado a objetos y ejecuta todas la líneas de programación que has posteado en menos de millésimas de millisegundos, por lo tanto lo que hace el ciclo es ir desde el valor del principio hasta el valor final y crear todos los loaders y mandarles a cargar las imágenes sin esperar que estas terminen de cargarse, solamente se le da la orden, por eso es que existen los eventos, para que sepas cuando termina de cargarse la imagen, pero cuando la imagen más pequeñas (una de 1 Byte) termine de cargar, ya todos los códigos han sido ejecutados por lo que el valor de i estará el el último valor del ciclo que fue el último que ella tomó.

Ahora si lo que quieres es cambiarle la escala a los loaders, utiliza el primer ejemplo que te puse, donde capturas el loader que ha terminado de cargarse y entonces puedes variarle su escala:

Código ActionScript :

function aCargadores_onComplete(evento:Event):void {

   var myLoader:Loader = Loader(evento.target.loader);
   
   myLoader.scaleX = .44;
   myLoader.scaleY = .44;

}

Por elchininet

Claber

3921 de clabLevel

17 tutoriales

Genero:Masculino  

Front-end developer at Booking.com

firefox
Citar            
MensajeEscrito el 16 Ago 2008 05:00 pm
El código funcionó resolviendo mi problema. Pero, apelando a tu paciencia quería hacerte otra pregunta.

Cuando cargamos un XML, para poder manipularlo debemos crear una variable de esta forma

var myXML:XML = new XML(evt.target.data);

entonces para leerlo escribimos

trace ( myXML);

La línea que escribiste:

var myLoader.Loader = Loader(evt.target.loader)

trabaja bajo el mismo concepto? Por qué en este caso no precisa del constructor new? Si coloco, me devuelve un error.

Es que todavía no tengo mucha intimidad con programación.

Desde ya muchas gracias

Claudio

Por Ishkandar

Claber

303 de clabLevel



Genero:Masculino  

firefox
Citar            
MensajeEscrito el 16 Ago 2008 05:39 pm
En el caso del loader este ya había sido instanciado en este momento:

Código ActionScript :

aCargadores[i] = new Loader();


Y lo que quiero es especificar que el displayObject recibido en "evt" es un loader, de lo contrario podría decir sin hacer el cast:

Código ActionScript :

var myLoader:DisplayObject = evt.target.loader;


Pero en el caso del XML es lo mismo, lo único que ocurre es que puedes instanciarlo especificándole que objeto va a tomar como referencia (como en el ejemplo que has puesto) a diferencia del loader que cuando lo instancias no puedes ponerle un objeto de referncia, de lo contario si quisieras realizar el cast en el XML lo puedes realizar después de que este haya sido instanciado:

Código ActionScript :

var myXML:XML = new XML();
myXML = XML(evt.target.data);

Por elchininet

Claber

3921 de clabLevel

17 tutoriales

Genero:Masculino  

Front-end developer at Booking.com

firefox
Citar            
MensajeEscrito el 19 Ago 2008 11:03 am
Y ahora la última y la mas difícil. Quiero colocar 3 TextFields que indiquen el proceso de carga según la fórmula

Código PHP :

var porciento:Number = Math.floor( evt.bytesLoaded * 100 / evt.bytesTotal )
txtPorcentaje[i].text = porciento.toString();


Desde ya muchas gracias. Claudio

Por Ishkandar

Claber

303 de clabLevel



Genero:Masculino  

firefox
Citar            
MensajeEscrito el 19 Ago 2008 01:58 pm
Utiliza el primer método que te puse, donde podías calcular el número del loader por su nombre, de esta forma puedes referirte a un textfield que tenga de nombre de instancia "txtPorcentaje" + un número:

Código ActionScript :

//---Dentro del ciclo

this.addChild( aContainers[i] ).name = "loader" + i;
this.addChild(myTexto).name = "txtPorcentaje" + i; //---Se añade esl texto, se supone que ya se haya creado

//---Evento de Progreso

aCargadores[i].contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, aCargadores_progress);

//---Función de progreso

function aCargadores_progress(evt:ProgressEvent):void {

   var myLoader:Loader = Loader(evt.target.loader);
   var myLoaderName:String = myLoader.name;

   var myNumber:uint = Number(myLoaderName.replace("loader", ""));

   var myTexto:TextField = this.getChildByName("myTexto" + myNumber) as TextField;
   
   var porciento:Number = Math.floor(evt.bytesLoaded / evt.bytesTotal * 100); 
   
   myTexto.text = String(porciento);

}

Por elchininet

Claber

3921 de clabLevel

17 tutoriales

Genero:Masculino  

Front-end developer at Booking.com

firefox
Citar            
MensajeEscrito el 22 Ago 2008 02:17 pm
El código quedó así:

Código PHP :

var aDirecciones:Array = [ "jpg/auto1.jpg", "jpg/auto2.jpg", "jpg/auto3.jpg" ]
var aCargadores:Array = new Array();
var aContainers:Array = new Array();
var aPorcentajes:Array = new Array();
var iniY:Number = 80;
var step:Number = 120;
var iniYPorcentaje:Number = 100;

for ( var i:int = 0; i<aDirecciones.length; i++ )
{
   aCargadores[i] = new Loader();
   aContainers[i] = new Sprite();
   aPorcentajes[i] = new TextField();
   aPorcentajes[i].name = "loader" + i;
   aContainers[i].x = 50;
   aPorcentajes[i].x = 300;
   if ( i == 0 )
   {
      aContainers[i].y = iniY;
      aPorcentajes[i].y = iniYPorcentaje;
   }
   else
   {
      aContainers[i].y = aContainers[i-1].y + step;
      aPorcentajes[i].y = aPorcentajes[i-1].y + step;
   }
   this.addChild( aContainers[i] );
   this.addChild( aPorcentajes[i] );
   aContainers[i].addChild(aCargadores[i]);
   aCargadores[i].load( new URLRequest ( aDirecciones[i] ) );
   aCargadores[i].contentLoaderInfo.addEventListener( ProgressEvent.PROGRESS, aCargadores_onProgress );
   aCargadores[i].contentLoaderInfo.addEventListener(Event.COMPLETE, aCargadores_onComplete);
   function aCargadores_onProgress ( evento:ProgressEvent ):void
   {
      var myLoader:Loader = Loader( evento.target.loader );
      var myLoaderName:String = myLoader.name;
      var myNumber:uint = Number(myLoaderName.replace("loader", ""));
      var aPorcentajes:TextField = this.getChildByName( "aPorcentajes" + myNumber ) as TextField;
      var porciento:Number = Math.floor( evento.bytesLoaded * 100 / evento.bytesTotal );  //Parcial * 100 / total
      aPorcentajes.text = String(porciento);
   }
   function aCargadores_onComplete (evento:Event):void
   {
      var myLoader:DisplayObject = evento.target.loader;
      myLoader.scaleX = 0.44;
      myLoader.scaleY = 0.44;
   }
}


Pero me está devolviendo este error:

Error #2099: The loading object is not sufficiently loaded to provide this information.
at flash.display::LoaderInfo/get loader()

Desde ya muchas gracias. Claudio

Por Ishkandar

Claber

303 de clabLevel



Genero:Masculino  

firefox

 

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