Comunidad de diseño web y desarrollo en internet online

Descarga de swf externos con clase Tween no funciona

Citar            
MensajeEscrito el 27 Jul 2010 01:18 am
Hola, soy nuevo en el foro y espero haber sido claro con el título del post.

Mi problema: Uso Flash SC4 con AS 2.0. Tengo una película "principal" en la que está el menú y las secciones se cargan externamente en un contenedor "cont". Para la carga y descarga de las películas externas desde el menú que está en la película principal uso el siguiente script:

on (release) {
var descarga = new mx.transitions.Tween(_root.cont, "_alpha", mx.transitions.easing.Strong.easeOut, 100, 0, 10);
descarga.onMotionFinished = function(){
unloadMovie(_root.cont);
loadMovie("./seccion1/seccion1.swf", _root.cont);
_root.cont._alpha = 0
new mx.transitions.Tween(_root.cont, "_alpha", mx.transitions.easing.Strong.easeOut, 0, 100, 10)
};
}

El script anterior funciona sin problemas y cumple con su propósito: Descarga la sección con una animación y luego carga la nueva también con una animación, ambas con tween . Mi problema es el siguiente.

Una de las secciones externas "sección3" carga a su vez en un contenedor "contgal1" una miniatura externa "mini1" que dirige a la galería1 "gal1" para que se cargue en el contenedor principal "cont". Hasta el momento he usado el siguiente script para llamar a la galería 1:

on (release) {
tellTarget("_root.principal")
_root.cont.loadMovie ("./galerias/gal1.swf")
}

Y funciona. Descarga en el contenedor "cont" la película cargada y carga la galería.

Lo que yo deseo es usar el primer script para que la descarga sea animada por tween. Sin embargo, al reemplazar el segundo código simple por el que uso para las demás secciones no funciona. He probado varias combinaciones y si le agrego al primer script: tellTarget("_root.principal") después de on (release) { sólo aplica la función alpha pero no carga la sección nueva, sólo queda con el alpha en 0. Y es lo unico que he logrado que haga.

Espero haber sido claro con mi problema y que alguien pueda ayudarme porque me estoy volviendo loco y es lo único que me falta para que mi web quede como deseo.

Agradeciendo de antemano les saluda,

Roberto.

Por eareddhel

83 de clabLevel



Genero:Masculino  

msie8
Citar            
MensajeEscrito el 27 Jul 2010 02:57 pm
eareddhel, postea el código que te resulta (y que te da problemas) cuando adaptas el primer script a abrir la galería.

Por elchininet

Claber

3921 de clabLevel

17 tutoriales

Genero:Masculino  

Front-end developer at Booking.com

firefox
Citar            
MensajeEscrito el 27 Jul 2010 08:38 pm
Gracias, lo único que he logrado para que funcione es, como dije, agregar la sentencia "tellTarget" como pongo a continuación:

on (release) {
tellTarget("_root.principal")
var descarga = new mx.transitions.Tween(_root.cont, "_alpha", mx.transitions.easing.Strong.easeOut, 100, 0, 10);
descarga.onMotionFinished = function(){
unloadMovie(_root.cont);
loadMovie("./seccion1/seccion1.swf", _root.cont);
_root.cont._alpha = 0
new mx.transitions.Tween(_root.cont, "_alpha", mx.transitions.easing.Strong.easeOut, 0, 100, 10)
};
}

Al dejarlo así, aplica el efecto tween de alpha, pero no descarga la sección, o sea, no realiza el "unloadMovie" y por lo tanto tampoco carga la sección nueva. ¿Tendrá algo que ver con que el contenedor de destino es el mismo que el de origen (donde está cargada la sección y la miniatura)?

Por eareddhel

83 de clabLevel



Genero:Masculino  

msie8
Citar            
MensajeEscrito el 28 Jul 2010 03:07 pm
@eareddhel:
¿ese código lo tienes insertado en un botón que se encuentra en el swf que está leído dentro del MovieClip "cont"?
Por otro lado, ¿dónde se encuentra el MovieClip "principal" al que intentas acceder desde el tellTarget?

Por elchininet

Claber

3921 de clabLevel

17 tutoriales

Genero:Masculino  

Front-end developer at Booking.com

firefox
Citar            
MensajeEscrito el 29 Jul 2010 05:17 am
Bueno, va como sigue:

"index.html" carga el swf "principal".
"principal" tiene los botones del menú y un contenedor "cont" en el que se cargan las secciones.
en "cont" se carga la sección "seccion3"
"seccion3" tiene un contenedor "contgal1"
en "contgal1" se carga el swf "mini01" en el que está el botón que no me funciona.
"mini01" llama al swf "gal01" para que se cargue en "cont" que está en el swf "principal"

Esa es la idea. Quizás sea un poco enredada la estructura, pero me funciona bien en todos los aspectos, menos en éste. Insisto en que el script que "sí funciona", es decir, que carga en "cont" la galeria "gal01" es el siguiente:

on (release) {
tellTarget("_root.principal")
_root.cont.loadMovie ("./galerias/gal1.swf")
}

Sin embargo, esta instrucción hace que lo que está cargado en "cont" desaparezca con brusquedad. Lo que he estado usando en los botones que están en "principal" para que carguen en "cont" es el script que he puesto más arriba con la clase Tween. Pero ese mismo script deja de funcionar cuando lo pongo en el botón que está en "mini01" Ese mismo script funciona a medias cuando le pongo la instrucción - tellTarget("_root.principal") -, y con "a medias" me refiero a que sólo aplica el alpha pero no descarga lo que está en "cont". Espero haberme hecho entender pues sé que es un poquito confuso.

Muchas gracias por responder. Llevo semanas probando modificaciones para que la segunda parte en la que debería dar la orden de descargar "cont" con el alpha y luego cargar la sección pedida funcione. Espero que puedan dar con el error.

Saludos.

Por eareddhel

83 de clabLevel



Genero:Masculino  

msie8
Citar            
MensajeEscrito el 29 Jul 2010 06:11 am
Dejo una muestra de lo que estoy haciedo con los .fla y sus respectivos .swf para que vean como está diseñado el sitio, con la misma estructura y dos botones, uno con el scrit que sí funciona (sin animación) y otro con el script que no funciona (el de la clase tween) Espero no violar ninguna norma del foro al ponerl el link, pero como el archivo está subido por mí espero que no exista problema.

http://www.megaupload.com/?d=IPA8R0GK

Y una vez muchas gracias por la ayuda.

Saludos, Roberto.

Por eareddhel

83 de clabLevel



Genero:Masculino  

msie8
Citar            
MensajeEscrito el 29 Jul 2010 10:12 am
Ahora ya me hago una idea de como lo tienes organizado. Tienes razón... es bastante enredada la estructura de tus archivos. Debes evitar siempre que te sea posible leer películas dentro de otras repetitivamente pues te traerá problemas como los que ahora estás teniendo. Para futuros proyectos lee este post puede que te resulte más fácil hacer lo que estás intentando de esta manera.

En el foro no es muy bien visto que cuelgues un archivo para que te lo revisen, la razón es que en un futuro tu archivo puede que no esté en la red y una persona con tu mismo problema no podría ver la solución, es mejor para el bien de la comunidad que las preguntas y respuestas queden documentadas y escribiendo el código en los posts.

Fijándome en tus códigos veo que hay muchas referencias a "_root" y por lo que veo haces referencia a la raiz lo mismo dentro de los SWFs leídos que en el SWF principal, no es recomendable utilizar "_root" para programar, lee a partir de este post y entenderás por qué.

Por otro lado elimina los "tellTargets", están desfasados desde Flash 5.

Te recomiendo que en el código que no te funciona hagas un test poco a poco, ve situando parents hasta que en el trace salga el MovieCliop llamado "cont", debe salirte como "_level0.cont":

Código ActionScript :

//---Primero pruebas con esto:
on (release) {
   trace(this._parent);
}

//---Después con esto:
on (release) {
   trace(this._parent._parent);
}

//---Después con esto:
on (release) {
   trace(this._parent._parent._parent);
}


Sigue añadiendo "_parent" hasta que al presionar el botón te salga en el trace "_level0.cont" que es el MovieClip con el que deseas trabajar, cuando esto suceda remplazas el trace de esos parents por lo siguiente:

Código ActionScript :

var cont:MovieClip = this._parent._parent; //(debes utilizar la cantidad de parents que te resultó)


El código debería quedar algo como esto:

Código ActionScript :

on (release) {

   var cont:MovieClip = this._parent._parent; //(debes utilizar la cantidad de parents que te resultó)
   
   var descarga = new mx.transitions.Tween(cont, "_alpha", mx.transitions.easing.Strong.easeOut, 100, 0, 10);
   
   descarga.onMotionFinished = function():Void {
      
      unloadMovie(cont);
      loadMovie("./seccion1/seccion1.swf", cont);
      cont._alpha = 0;
      new mx.transitions.Tween(cont, "_alpha", mx.transitions.easing.Strong.easeOut, 0, 100, 10);
      
   }

}


Creo que así debe resultar, de lo contrario postea de nuevo.
Un saludo

Por elchininet

Claber

3921 de clabLevel

17 tutoriales

Genero:Masculino  

Front-end developer at Booking.com

firefox
Citar            
MensajeEscrito el 30 Jul 2010 05:01 am
Gracias por la respuesta elchininet, hice lo que me dijiste y con el primer "this._parent" me dio "_level0.cont", así que dejé el script de la siguiente forma:

Código ActionScript :

on (release) {
   var cont:MovieClip = this._parent;
   var descarga = new mx.transitions.Tween(cont, "_alpha", mx.transitions.easing.Strong.easeOut, 100, 0, 10);
      descarga.onMotionFinished = function() :Void {
      unloadMovie(cont);
   loadMovie("gal01.swf", cont);
      cont._alpha = 0
      new mx.transitions.Tween(cont, "_alpha", mx.transitions.easing.Strong.easeOut, 0, 100, 10)
   };
}

Y ¡Oh sorpresa! Me carga la sección con el tween de salida y luego el de entrada. Pero (¿por qué siempre ha de haber un "pero"?) la nueva sección se carga en el contenedor donde está la miniatura, o sea el en contenedor "contgal1" y no en el contenedor "cont" que es donde deseo que cargue. Me pregunto el por qué carga en "contgal1" en lugar de en "cont" que es el contenedor en el que se le está indicando que cargue. De verdad que me estoy estresando con ésto. Una vez más gracias por la buena voluntad en este frustrante caso.

Saludos,

Por eareddhel

83 de clabLevel



Genero:Masculino  

msie8
Citar            
MensajeEscrito el 30 Jul 2010 07:47 am
Bueno, de tanto intentar, creo que comprendí al final la idea de usar tantos "_parent" como fuese necesario. Al pricipio pasó lo que puse más arriba porque como me salió al primer parent el "_level0.cont" creí que con eso bastaría y no. Entonces, comencé a poner como sugerías más "_parent" y entonces sí funcionó. Tuve que poner dos "_parent" para que me cargara donde deseaba, con lo que el problema queda resuelto. Eso en la versión de ejemplo que subí aquí.

Pero como siempre surge algo, me encontré con otro problema, aunque creo que eso ya pasa por la forma en que tengo distribuidas las secciones y los contenedores, y es que al probar el script en la web completa, hay secciones donde funciona y otras no, siendo el mismo botón cargado externamente. ¿La razón? Ahora la comprendo: los niveles. Porque, por ejemplo, el botón en la sección 1 (lo que pasa es que algunos botones de la sección de categorías, los destacados, se repiten en el home) necesitó de 3 "_parent" para funcionar y en la sección de categorías de 4 "_parent". Mi pregunta es si existe alguna forma de "estandarizar" el script, de manera que siempre redirija al contenedor "cont", de forma que independientemente del contendor donde sea cargado el botón (por ejemplo, "cont>contgal>boton" o "cont>categoriauno>contgal>mini>boton") siempre cargue en el contenedor "cont" que se encuentra en la película principal, tal como hacía el primer script que usé:

Código ActionScript :

on (release) {
tellTarget("_root.principal")
_root.cont.loadMovie ("gal1.swf")
}

Lo que hacía ese script era llevarme a la galería siempre, independiente de dónde pusiera el botón, ya sea en el mismo "cont" o en un contenedor dentro de "cont" e incluso dentro de otro mc, lo que no sucede con:

Código ActionScript :

on (release) {
   var cont:MovieClip = this._parent._parent._parent;
   var descarga = new mx.transitions.Tween(cont, "_alpha", mx.transitions.easing.Strong.easeOut, 100, 0, 10);
      descarga.onMotionFinished = function() :Void {
      unloadMovie(cont);
   loadMovie("gal01.swf", cont);
      cont._alpha = 0
      new mx.transitions.Tween(cont, "_alpha", mx.transitions.easing.Strong.easeOut, 0, 100, 10)
   };
}

En resumen, ¿será posible mejorar el script para que funcione igual que el que no tiene la clase tween?

Nuevamente gracias por la ayuda y tus aportes elchininet.

Saludos,

Por eareddhel

83 de clabLevel



Genero:Masculino  

msie8
Citar            
MensajeEscrito el 30 Jul 2010 10:00 am
El problema es que la forma en que lo tienes hecho está demasiado complicada, cualquier cosa que quieras mejorar te traerá más problemas, pudieras hacer un while hasta que se encuentre el "cont", pero como bien has dicho hay ocaciones en que te sale de primera (esto me parece que ocurre por algún _lockroot en algún sitio). Lo mejor es que trabajes con funciones genéricas, no programes dentro de los botones y distribuyas tus secciones de una forma más fácil de trabajar, lee los links que te dejé, te darán algunas ideas.

Por elchininet

Claber

3921 de clabLevel

17 tutoriales

Genero:Masculino  

Front-end developer at Booking.com

firefox
Citar            
MensajeEscrito el 30 Jul 2010 09:03 pm
Pero es eso lo que busco, una función genérica a la que pueda agregarle la clase tween, porque he intentado modificar el script que sí funciona pero no me resulta. De todas maneras si llego a encontrar la solución la postearé aquí.

Nuevamente muchas gracias por todo.

Saludos,

Por eareddhel

83 de clabLevel



Genero:Masculino  

msie8
Citar            
MensajeEscrito el 02 Ago 2010 10:40 pm
Y bueno, después de mucho probar y probar, opté por una solución que quizás no es la mejor pero por el momento y a la espera de encontrar una solución mejor (quizás cuando me decida a incursionar en AS 3.0) terminé por usar el script siguiente en base a la solución elchininet:

Código ActionScript :

on (release) {
   var cont:MovieClip = this._parent._parent._parent;
   var descarga = new mx.transitions.Tween(cont, "_alpha", mx.transitions.easing.Strong.easeOut, 100, 0, 10);
      descarga.onMotionFinished = function() :Void {
      unloadMovie(cont);
   loadMovie("gal01.swf", cont);
      cont._alpha = 0
      new mx.transitions.Tween(cont, "_alpha", mx.transitions.easing.Strong.easeOut, 0, 100, 10)
   };
}


El problema que tenía era que me cargaba de esa forma en distintos niveles, así que lo que hice fue precisar el máximo de "_parent" que necesitaría, y entonces en las secciones donde necestiaba menos, sólo puse los contenedores dentro de otros "mc" hasta que diera con el nivel a cargar. Insisto en que no es lo mejor, pero así logré hacer que todo funcionara.

Gracias una vez más a elchininet por toda la ayuda. Doy por cerrado este tema, a no ser que aparezca otra solución mejor.

Saludos,

Por eareddhel

83 de clabLevel



Genero:Masculino  

msie8
Citar            
MensajeEscrito el 03 Ago 2010 09:23 am
Me alegro que lo hayas solucionado ;)

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.