Comunidad de diseño web y desarrollo en internet online

Web con varios swf

Citar            
MensajeEscrito el 29 Dic 2007 03:26 pm
Hola a todos!!

Me gustaría haceros una consulta sobre AS3 en Flash CS3. Hasta ahora había trabajado en AS2, y realizaba mis webs despedazadas en varios SWF. En mi barra de menú tenía una serie de botones, y al pulsar sobre cada menú, me cargaba un swf externo. Cogí esta costumbre para no meterlo todo en escenas ó en la línea de tiempo, asi me cargaban las páginas más deprisa.

En AS3 todo ha cambiado, y quiero llegar a hacer lo mismo. He conseguido que al pulsar sobre cada botón, cargo el botón inicial, pero lo que quiero es desactivar ese swf al pulsar sobre otro botón. No quiero ir cargando las películas unas encima de otras, y que además, se me vayan quedado activos los botones...

He visto un post en AS2 aquí:

http://www.cristalab.com/foros/t21396.html

En AS3 de momento he llegado hasta aquí...

Código :

inicio_btn.addEventListener(MouseEvent.CLICK, inicioClick);

function inicioClick(event:MouseEvent):void {
   var loader:Loader = new Loader();
   loader.load(new URLRequest("inicio.swf"));
   loader.x=230;
   loader.y=80;
   addChild(loader);
}


Pero claro... ahi me he quedado...

¿Cómo desactivo y elimino los swf cargados?

Muchas gracias a quién pueda responderme!

Por xoxo

4 de clabLevel



 

firefox
Citar            
MensajeEscrito el 30 Dic 2007 09:52 pm
¿Cómo desactivo y elimino los swf cargados?

Lo más fácil es utilizar el método unload() del objeto Loader. Para ello, en vez de crear tu objeto Loader como local (dentro de la función), créalo como variable de clase, así puedes utilizarlo para cargar y descargar películas.

Es importante que antes de descargar tu swf vigiles que no haya ninguna comunicación (listeners) entre el swf cargado y el cargador. Dicho de otra manera, cada swf tendría que tener un método kill() para matar las posibles referencias (en caso de que sea necesario, claro).

Saludos!

Por llops

294 de clabLevel

1 tutorial

 

Barcelona

firefox
Citar            
MensajeEscrito el 01 Ene 2008 03:28 am
Hola Llops, muchas gracias por responderme, lo he resuelto como me has dicho, declarando la variable fuera, y haciendo un unload en cada botón.

Bien, ahora tengo una pequeña duda. Vamos a suponer que en una de esos swf tengo un vídeo. Tal y como lo tenía, al pulsar sobre un botón, el vídeo seguía sonando, asi que lo he solucionado poniendo un "flash.media.SoundMixer.stopAll();" en tooodos y cada uno de los botones.

Problema solucionado pero...

Supongamos que quiero que mientras alguien visite la web haya un reproductor de mp3. Claro está estaría en el swf principal. Al pulsar sobre un botón, eso se me para.

¿Qué debería escribir dentro de todos y cada uno de los botones para que me detuviera el sonido, si existiese, de los swf externos cargados pero no de la película principal?

Muchísimas gracias a quien pueda responderme. ¡Feliz Año! :-)

Por xoxo

4 de clabLevel



 

firefox
Citar            
MensajeEscrito el 01 Ene 2008 08:39 pm
Sigue sonando porque hay que detener cualquier stream que haya abierto.
Lo más limpio sería coger el evento unload que se dispacha al descargar un swf, y luego cerrar únicamente el stream que haya abierto. Algo así:

Código :

function pararVideo(e:Event) { 
    video.close();
}
loader.loaderInfo.addEventListener(Event.UNLOAD, pararVideo);


Un saludo!

Por llops

294 de clabLevel

1 tutorial

 

Barcelona

firefox
Citar            
MensajeEscrito el 01 Ene 2008 09:28 pm
Gracias por tu respuesta! :)

Supongo que el código es para la película principal, porque "loader" se encuentra en la principal, pero... si "video" lo tengo en la película secundaria ¿cómo puedo pasar esa variable a la película principal?

Porque claro, ahora no sabe qué es video...

uyy... esto se me está complicando, pero no quiero hacer mi película por escenas y "gotos..."

Mil gracias y feliz año a todos!! :love:

Por xoxo

4 de clabLevel



 

firefox
Citar            
MensajeEscrito el 02 Ene 2008 09:07 am

xoxo escribió:

si "video" lo tengo en la película secundaria ¿cómo puedo pasar esa variable a la película principal?

Como bien dices, el Loader estará en la película principal, pero la idea es que cada objeto se encargue de limpiar sus propios recursos, de ahí lo que te comentaba en el primer post de crear un método kill. Depende mucho de como esté estructurada tú película, pero la idea es que cada swf incorpore un método que se encargue de limpiar sus recursos.

Imaginemos que tienes principal.swf (se encargar de cargar/descargar las películas), modulo1.swf (contiene una animación en linea de tiempo) y modulo2.swf (contiene un video). Cada uno de estos swf tiene una clase Main asociada (más limpio que tener el código en linea de tiempo, pero no inprescindible). Antes de cargar un nuevo módulo quieres que cada película limpie sus "recursos", para ello, cada peli incorpora su propio método:

Clase Main de modulo1.swf

Código :

public function kill():void 
   {
      // Para la animación del movieclip
      miMovieClip.stop();
   }


Clase Main de modulo2.swf

Código :

public function kill():void 
   {
      // Para el video
      miVideo.close();
   }


Luego, en tu clase Main de principal.swf, deberías guardar una referencia de la película que está cargada, algo tan simple como una variable de clase asociada al contenido del Loader. Cuando vayas a descargar una peli, invocarías este código:

Código :

private function limpiarRecursos(e:Event):void
   {
      // peliculaCargada guarda una referencia del swf
      peliculaCargada.kill();
   }
   loader.loaderInfo.addEventListener(Event.UNLOAD, limpiarRecursos);



Aunque hay varias formas de hacer lo que necesitas, lo que te propongo está encaminado a mantener una buena encapsulación, por eso importante que te quedes con la idea de que cada uno se encargue de "limpiarse a sí mismo". El ejemplo no es el más preciso, porque por ejemplo no haría falta detener una animación, ya que al descargar el swf desaparecería, pero sí que es muy importante con otros casos, como audio, video, sockets... La clase principal no tiene porqué saber qué necesita cada peli para limpiar sus recursos, simplemente sabe que dispone de un método que debe llamar al descargar la peli, como lo haga cada una ya es cosa suya.

Bueno, espero que haya quedado clara la idea :)
Suerte!!

Por llops

294 de clabLevel

1 tutorial

 

Barcelona

firefox
Citar            
MensajeEscrito el 10 Ene 2008 11:26 pm
Simplemente lo he resuelto parando el video antes de descargar la película.

Muchas gracias por la ayuda, sin vosotros no lo hubiera conseguido. :-)

Por xoxo

4 de clabLevel



 

firefox
Citar            
MensajeEscrito el 11 May 2009 02:21 pm
Si alguien se toma la molestia de subir un *.fla a modo de ejemplo se lo voy a agradecer muchisimo, ya que mis conocimientos en actionscript son rudimentarios y no encuentro la forma de lograr detener el stream del video (youtube) desde mi swf.

Muchisimas gracias!

Por marlhardy

0 de clabLevel



 

chrome
Citar            
MensajeEscrito el 19 Feb 2010 06:38 pm
Buenas marlhardy.

¿Conseguiste realizar esto? Tengo el mismo problema ¿Me podrias pasar un ejemplo?

Un saludo y gracias de antemano.

Por burningman

7 de clabLevel



 

firefox
Citar            
MensajeEscrito el 03 Jul 2011 06:24 am

Por samul96

1 de clabLevel



 

chrome

 

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