Comunidad de diseño web y desarrollo en internet online

[AS3] problema con loader de imagenes externas

Citar            
MensajeEscrito el 30 Abr 2010 11:02 am
Hola a todos, a ver si alguien me puede resolver un problemilla que tengo...


Estoy montando una visor de imagenes en as3. Todas las imágenes son externas y las cargo mediante un loader y se va llamando con un timer... cuando compilo el swf me funciona perfectamente... no me da ningún error, pero en cuanto lo publico en un website no sé porque diablos hay un momento en que las imágenes dejan de verse, todo negro. Aún así hay un preloader que me indica que algo está cargando... sólo que luego parece no mostrarlo...

Código ActionScript :

private function loadNextPhoto(_index:int):void
{      
   nextData = getObject(_index);   //recojo información de un xml... básicamente para el path   
   var _loaderContext:LoaderContext = new LoaderContext(true);
   loader = new Loader();
   loader.contentLoaderInfo.addEventListener(Event.COMPLETE, nextPhotoLoaded);
   loader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, loadingProgress);                     
   loader.load(new URLRequest(nextData.path), _loaderContext);
}

private function nextPhotoLoaded(e:Event):void 
{         
   loader.contentLoaderInfo.removeEventListener(Event.COMPLETE, nextPhotoLoaded);   
   loader.contentLoaderInfo.removeEventListener(ProgressEvent.PROGRESS, loadingProgress);                                    
   nextImageBmp = Bitmap(loader.content);                        
         
   try { loader.unloadAndStop(); } catch (error:Error) { }         
   try { System.gc(); } catch (error:Error) { }   
                  
        // fadeOut de la imagen que mostraba en pantalla
   Tweener.addTween(imageMc, { alpha: 0, time: 1, transition: "easeInQuint", onComplete: endTransitionToZero } );         
}      

private function endTransitionToZero():void
{
        //cambio la imagen.
   imageMc.removeChildAt(0);         
   removeChild(imageMc);
   imageMc = new MovieClip();
   imageMc.x = 450;         
   imageMc.y = 75;   
   imageMc.alpha = 0;         
   nextImageBmp.x = -(nextImageBmp.width / 2);
   imageMc.addChild(nextImageBmp);
   addChild(imageMc);   
         
   // fadeIn de la imagen recién cargada      
   Tweener.addTween(imageMc, { alpha: 1, time: 0.5, transition: "easeOutQuint"});
}


bueno, si alguien se toma la molestia podéis ver el error chequeando photo.html


grácias de antemano!!

Por Albert Pérez

1 de clabLevel



 

chrome
Citar            
MensajeEscrito el 30 Abr 2010 12:57 pm
¿Ya resolviste el problema?
Las fotos dieron la vuelta y volvieron a empezar y no he visto el problema que planteas.

Por elchininet

Claber

3921 de clabLevel

17 tutoriales

Genero:Masculino  

Front-end developer at Booking.com

firefox
Citar            
MensajeEscrito el 03 May 2010 08:17 am
Mmm... no, la verdad es que no lo resolví. Ocurre que no falla en todos los ordenadores... ¿problemas de memoria?

Por Albert Pérez

1 de clabLevel



 

chrome
Citar            
MensajeEscrito el 03 May 2010 10:17 am
Te puede pasar que el tiempo del Timer no sea lo suficientemente largo para que dé tiempo a cargar la foto. La solución es "sustituir" el Timer por un onEnterFrame

Código ActionScript :

vartiempo:Number=0
addEventListener(Events.ENTER_FRAME,onEnterFrame)
onEnterFrame=function(){
 if ((getTimer()-tiempo)>1000){
  tiempo=getTimer()
  tuFuncion() //<---aquí tu función
 }

Vale, usa una variable "siguiente_foto_cargada" que pones a true o false antes y después de empezar la carga y cambias la condición como

Código ActionScript :

 
onEnterFrame=function(){
 if (((getTimer()-tiempo)>1000) && siguiente_foto_cargada) {
  tiempo=getTimer()
  tuFuncion() //<---aquí tu función
 }

Por Eliseo2

710 de clabLevel



 

firefox
Citar            
MensajeEscrito el 05 May 2010 05:35 pm
No creo que el problema esté en usar el Timer en sí sino en cómo lo ha implementado (aunque no ha posteado la porción de código donde lo utiliza), el problema debe estar que ejecuta el Timer a cada "x" cantidad de milisegundos, sin controlar si cuando se ejecuta el Timer y manda a cargar la siguiente imagen la anterior ya ha sido cargada. Es por eso a lo mejor que con una conexión rápida no se aprecia ningún problema porque cuando el Timer se ejecuta la imagen ya ha sido leída sin problemas.

Yo te recomendaría que crearas el objeto Timer con un repeatCount de 1 y que sólo cuando se termine de cargar una imagen y se llame al evento COMPLETE ejecutes el método start del timer y mandes a cargar la segunda imagen, así siempre habría una sola imagen cargándose y evitas problemas.

Por elchininet

Claber

3921 de clabLevel

17 tutoriales

Genero:Masculino  

Front-end developer at Booking.com

firefox
Citar            
MensajeEscrito el 06 May 2010 08:22 am
Hola de nuevo,


Tienes razón, no posteé esa parte porque pensé que ahí no estaba el error. Reposteo con la parte del timer:

Código :


private function loadNextPhoto(_index:int):void 
{       
   nextData = getObject(_index);   //recojo información de un xml... básicamente para el path    
   var _loaderContext:LoaderContext = new LoaderContext(true); 
   loader = new Loader(); 
   loader.contentLoaderInfo.addEventListener(Event.COMPLETE, nextPhotoLoaded); 
   loader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, loadingProgress);                      
   loader.load(new URLRequest(nextData.path), _loaderContext); 
} 
 
private function nextPhotoLoaded(e:Event):void  
{          
   loader.contentLoaderInfo.removeEventListener(Event.COMPLETE, nextPhotoLoaded);    
   loader.contentLoaderInfo.removeEventListener(ProgressEvent.PROGRESS, loadingProgress);                                     
   nextImageBmp = Bitmap(loader.content);                         
          
   try { loader.unloadAndStop(); } catch (error:Error) { }          
   try { System.gc(); } catch (error:Error) { }    
                   
   // fadeOut de la imagen que mostraba en pantalla 
   Tweener.addTween(imageMc, { alpha: 0, time: 1, transition: "easeInQuint", onComplete: endTransitionToZero } );          
}      

private function endTransitionToZero():void 
{ 
    //cambio la imagen. 
   imageMc.removeChildAt(0);          
   removeChild(imageMc); 
   imageMc = new MovieClip(); 
   imageMc.x = 450;          
   imageMc.y = 75;    
   imageMc.alpha = 0;          
   nextImageBmp.x = -(nextImageBmp.width / 2); 
   imageMc.addChild(nextImageBmp); 
   addChild(imageMc);    

   // fadeIn de la imagen recién cargada       
   Tweener.addTween(imageMc, { alpha: 1, time: 0.5, transition: "easeOutQuint", onComplete: endTransitionToOne } );
} 

private function endTransitionToOne():void
{
   timer.start();
   timer.addEventListener(TimerEvent.TIMER, onTimer);
}   

private function onTimer(e:TimerEvent):void 
{      
   index = getNextIndex();                  
   loadNextPhoto(index);            
}



En realidad no empiezo el timer hasta que la foto está cargada y mostrada en pantalla. luego timer. Cuando termina cargo siguiente foto... y cuando está cargada la muestro y vuelta a empezar.

Claro, la website tiene más funcionalidades que controlan el timer (eventos de teclado, play/pause mediante botón o sobre la misma foto) que he omitido para no pegar la classe entera. Pero si alguien la quiere ver entera... no hay problema.

gracias de nuevo,
Albert

Por Albert Pérez

1 de clabLevel



 

chrome
Citar            
MensajeEscrito el 06 May 2010 04:52 pm
Bueno, pues veo que el error parece no estar ahí, sólo rectifica que cuando creas el Timer el repeatCount esté en 1 y por otro lado no hace falta que añadas el evento TimerEvent.TIMER al Timer cada vez que cargues una imagen, basta con que añadas el evento al inicio de crear el objeto Timer, dentro de la función lo que debes es llamar sólo al método start().

A lo mejor esto aclara tu problema, mira este tuto, aunque es antiguo y está un poco entrevesado el código, puedes observar maneras de trabajar con la transición de imágenes, quizás te ayude.

Por elchininet

Claber

3921 de clabLevel

17 tutoriales

Genero:Masculino  

Front-end developer at Booking.com

firefox

 

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