Comunidad de diseño web y desarrollo en internet online

Destruir tween de una película a otra

Citar            
MensajeEscrito el 30 Sep 2009 12:15 am
Qué tal:

Espero el título sea lo suficientemente claro.
Esto es lo que tengo:


  • Película contenedora que carga nuevas películas con botones de avance y retroceso.
  • Cada película que es cargada en la película contenedora. Cada película cargada tiene animaciones con la clase new Tween();


El problema es que, si avanzo o retrocedo rápidamente para ver una película siguiente o anterior los tween se quedan en memoria y se repiten en la nueva película.

Es decir, si tengo una animación de un fadein ejecutándose y de pronto avanzo o retrocedo a una nueva película, el fadein de la nueva película inicia donde se quedó la anterior.

Ya he probado destruyendo la variable tween cada que entro en una nueva película, ya probé en el cargador descargar las películas predecesoras con removeMovieClip(miPelicula). Y no le hallo! :twisted:

Anexo el código de mis películas:

Contenedor:

Código PHP :

function cargaPelicula(peliculaParaCargar:String):Void {
   var listener:Object = new Object(); 
   var cargador:MovieClipLoader = new MovieClipLoader(); 
   cargador.addListener(listener);
   var preload:MovieClip;
   listener.onLoadStart = function(clip:MovieClip):Void {
      clip.setMask(mascaraContenidos);
      clip._visible = false; 
      clip.stop(); 
      preload = _root.attachMovie("preloader","preload",_root.getNextHighestDepth(),{_x:escenarioMitadLargo, _y:(escenarioMitadAlto-altoBotones)}); 
      //trace("película Start"); 

   } 
   listener.onLoadProgress = function(clip:MovieClip):Void { 
      //trace("película progress"); 
   } 
   listener.onLoadInit = function(clip:MovieClip):Void {
      clip._visible = true;
      clip._lockroot = true;//cambia las rutas de los movieclips cargados a relativas no absolutas
      clip.play();
      //trace("película Init cargada"); 
   } 
   listener.onLoadComplete = function(clip:MovieClip):Void {
      removeMovieClip(preload); 
      //trace("película complete");
      //cargador.removeListener(listener);
      //delete cargador;
      //cargador.unloadClip(peliculaParaCargar);
   }
   cargador.loadClip(peliculaParaCargar, contenidosMain); 
} 


Funciones tween:

Código PHP :

if (tweenFade != undefined){
   tweenFade.rewind();
   delete tweenFade;
} else {
   tweenFade= new Tween();
}
function fade(movieClip, easing, inicio, fin, tiempoSeg):Void {
   //delete tweenFade;
   tweenFade = new Tween(movieClip, "_alpha", easing, inicio, fin, tiempoSeg, true);
   listenerFade = new Object();
   tweenFade.addListener(listenerFade);
   tweenFade.onMotionFinished = function():Void  {
      tweenFade.removeListener(listenerFade);
   };
}
if (tweenMover != undefined){
   tweenMover.rewind();
   delete tweenMover;
} else {
   tweenMover = new Tween();
}
function mover(movieClip, propiedad, easing, inicio, fin, tiempoSeg):Void {
   //delete tweenMover;
   tweenMover = new Tween(movieClip, propiedad, easing, inicio, fin, tiempoSeg, true);
   listenerMover = new Object();
   tweenMover.addListener(listenerMover);
   tweenMover.onMotionFinished = function():Void  {
      tweenMover.removeListener(listenerMover);
   };
}
//-------------------------------------------------------------------------------
//----------------------------   FUNCIONES GENERALES   --------------------------
//-------------------------------------------------------------------------------
titulo._alpha = 0;
grafico1._alpha = 0;
grafico2._alpha = 0;
var tituloPosY:Number = titulo._y;
var grafico1PosX:Number = grafico1._x;
var grafico2PosX:Number = grafico2._x;
fade(titulo,Strong.easeOut,titulo._alpha,100,1);
mover(titulo,"_y",Strong.easeOut,tituloPosY-100,tituloPosY,1);
listenerFade.onMotionFinished = function():Void  {
   fade(grafico1,Strong.easeOut,grafico1._alpha,100,1.5);
   mover(grafico1,"_x",Bounce.easeOut,grafico1PosX-300,grafico1PosX,1.5);
   fade(grafico2,Strong.easeOut,grafico1._alpha,100,1.5);
   mover(grafico2,"_x",Bounce.easeOut,grafico2PosX+300,grafico2PosX,1.5);
};


¿Alguna idea?
De antemano agradezco su ayuda. ^^

Por yconoclasta

12 de clabLevel



Genero:Masculino  

diseñador aventurero soñador

firefox
Citar            
MensajeEscrito el 30 Sep 2009 11:27 am
La clase Tween tiene un método stop si mal no recuerdo, que deberías invocar antes de volver a cargar. Igual te sugeriría uses otra biblioteca de Tween, por ejemplo Tweener http://code.google.com/p/tweener/, ya que la original tiene muchos problemas

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 30 Sep 2009 03:02 pm
Gracias por tu respuesta Jorge, si la clase tiene un stop y ya lo utilicé (en lugar del rewind)

Código PHP :

if (tweenMover != undefined){ 
   tweenMover.rewind(); 
   delete tweenMover; 

pero no funciona tampoco.
¿Qué tal Tweener? ¿Es de las más actuales?
Sé que hay varias bibliotecas para esto mismo pero sólo he probado la propietaria de flash. Revisaré la que sugieres.

De todas maneras si alguien sabe de una solución con la clase Tween propietaria de Flash, le agradezco.

Saludos.
Alex.

Por yconoclasta

12 de clabLevel



Genero:Masculino  

diseñador aventurero soñador

firefox
Citar            
MensajeEscrito el 30 Sep 2009 03:04 pm
La clase Tween original tiene problemas de encapsulación que se acentúan al aplicar el Tween a distintos targets o manipular el evento onEnterFrame

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 20 Ene 2010 02:51 pm
Muy buenas.

Yo tenia el mismo problema.

Lo único que tienes que hacer es crear una funcion para bloquear y parar los movimientos y listo.

function pararAnimacion(){


movi1.stop();
movi2.stop();
delete movi1;
delete movi2;

}


Cuando desees parar la animacion Tween pues llamas a la función.

Un saludo.

Por edudome

3 de clabLevel



Genero:Masculino  

firefox
Citar            
MensajeEscrito el 20 Ene 2010 05:53 pm
Hola:

Gracias por sus respuestas. Efectivamente la solución es como la que propone Edudome.
Hay que destruir los Tweens. Yo lo hago por medio de una función que se ejecuta antes de cargar la nueva película y que destruye todos los tweens.

Código ActionScript :

function verificaDestruyeTweens(){
   for(objeto in contenidosMain){
      if (contenidosMain[objeto].toString() == "[Tween]") {
         trace("objeto: "+contenidosMain[objeto]);
         contenidosMain[objeto].onMotionChanged = function() {
            this.stop();
            delete this;
         }
      }
      delete contenidosMain[objeto];
   }
}


Saludos.

Por yconoclasta

12 de clabLevel



Genero:Masculino  

diseñador aventurero soñador

firefox

 

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