Comunidad de diseño web y desarrollo en internet online

Comunicar 2 SWF en AS3

Citar            
MensajeEscrito el 12 Feb 2010 03:33 am
Hola!!

Me gustaria que me ayudaran a comunicar a un swf cargado con el "padre"
en el swf cargado tengo un boton(MC) que deberia hacer desaparecer a el mismo..

asi lo hacia en AS2:

SWF PADRE -boton que carga el swf externo:

Código ActionScript :

on(press){
   System.security.allowDomain("carga/audio/audio.swf");
   _root.carga_mc.loadMovie("carga/audio/audio.swf");
}



SWF HIJO -boton hace desaparecer el swf hijo:

Código ActionScript :

on(press){
   this._lockroot = false;
   unloadMovie(_root.carga_mc);
}


Como haria algo asi en AS3 ?


Otra forma seria comunicando las clases, he podido llamar funciones de otras clases de la siguiente manera:

Código ActionScript :

ClaseExterna(parent).FuncionAcumplir();

Pero eso en este caso no me funciono por la forma en que tengo organizados mis carpetas:
home.swf //este es el PADRE
cargas/swf3.swf // este es el HIJO
cargas/swf3.as // este el Document Class del HIJO

Agradezco sus colaboraciones
:wink:

Por dianita666

Claber

185 de clabLevel



 

firefox
Citar            
MensajeEscrito el 12 Feb 2010 04:06 pm
Si ya cargaste el swf hijo no importa en realidad el acomodo de carpetas, con desaparecer te refieres a descargarlo me imagino.

Tu ya hiciste la carga voy asumir que es con una variable que se llama "hijo" y es del tipo loader(esta variable debe ser global para poder descargarla)

Código ActionScript :

//En la funcion de carga completa imagino agregas a hioj a escena
//Aqui agregas uno listener a hijo para saber cuando descargarlo
function CargaCompleta(e:Event){
//OJO hijo es un loader para agregarle el listener al swf cargado es en su content
//un poco de casting
MovieClip(hijo.content).addEventListener("Descargar",DescargaHijo);
//Agregamos el loader(hijo) y no el content para poder usar la funcion .unload() del loader
addChild(hijo);
}

//La funcion que descarga el hijo
function DescargaHijo(){
hijo.unload();
//Hay otra funcion apra el player 10 que es unloadAndStop(); esta es mejor apra descargar contenido investigala por si te sirve mas
}



Ese codigo va dentro del padre dentro de la clase del hijo tienes un boton que lo descarga al darle click a ese boton el hijo debe despachar el evento "Descargar" que es el que el padre escucha.

Código ActionScript :

boton.addEventListener(MouseEvent.CLICK,Descargar);

functoin Descargar(e:MouseEvent){
dispatchEvent(new Event("Descargar"));
}


Saludos!!

Por Angel Roberto

Claber

248 de clabLevel



 

firefox
Citar            
MensajeEscrito el 12 Feb 2010 04:07 pm
pff ignora los errores de tipeo....es por estar en la oficina tecleando como el diablo XD

Por Angel Roberto

Claber

248 de clabLevel



 

firefox
Citar            
MensajeEscrito el 12 Feb 2010 05:07 pm
Hola angel

Mira este es mi As Padre, como adaptaria lo que me indicate?

Código ActionScript :

package cargas.clases{
   import flash.display.MovieClip;
   import flash.events.MouseEvent;
   import flash.events.Event;
   import flash.display.Loader;
   import flash.net.URLRequest;
   import flash.filters.BlurFilter;
   
   
   public class Principal extends MovieClip{
      private var _botones:Array;
      private var _contenedor:MovieClip;
      private var _cargador:Loader;
      
      public function Principal(){
         _botones = obtenerBotones(todo_mc.botones_mc);
         _contenedor = new MovieClip();
         addChild(_contenedor);
         construirMenu(_botones);
      }
      
      private function obtenerBotones(con:MovieClip):Array{
         var tmp:Array = new Array();
         for(var j:uint=0; j<con.numChildren;++j)
         {
            var btn:MovieClip = con.getChildByName("Btn" + j + "_mc") as MovieClip;
            tmp.push(btn);
         }
         return tmp;
      }
      
      
      private function construirMenu(arra:Array):void
      {
         for(var i:uint=0; i<arra.length;++i)
         {
            var btn:MovieClip = _botones[i] as MovieClip;
            btn.swfRuta = "cargas/swf" + i + ".swf";
            btn.addEventListener(MouseEvent.CLICK,onClickBtn);
            btn.addEventListener(MouseEvent.CLICK,desenfoque);
            btn.addEventListener(MouseEvent.CLICK,apagado);
         }
      }
      
      private function desenfoque(e:MouseEvent):void{
         var blur:BlurFilter = new BlurFilter(); 
           blur.blurX = 10;  
            blur.blurY = 10;  
            blur.quality = 5;  
             var filterArray:Array = new Array(blur);  
             todo_mc.filters = filterArray;
      }
      
      private function apagado(e:MouseEvent):void{
         todo_mc.mouseEnabled = false;
          todo_mc.enabled = false;
          todo_mc.mouseChildren = false;
      }
      
      private function onClickBtn(e:MouseEvent):void{
         _cargador = new Loader();
         _cargador.contentLoaderInfo.addEventListener(Event.COMPLETE, onCompleteLoad);
         _cargador.load(new URLRequest(e.currentTarget.swfRuta)); 
      }
      
      private function onCompleteLoad(e:Event):void{
         var swfCargado:MovieClip = e.target.content as MovieClip;
         if(_contenedor.numChildren > 0) {
            _contenedor.removeChildAt(0);
         }
         _contenedor.addChild(swfCargado);
      }
   }
}

Por dianita666

Claber

185 de clabLevel



 

firefox
Citar            
MensajeEscrito el 12 Feb 2010 05:54 pm
Hola en tu funcion complete agregas ese listener para descargar y en lugar de agregar la vriable swfCargado agregas el cargador

Código ActionScript :

private function onCompleteLoad(e:Event):void{ 
        MovieClip(_cargador.content).addEventListener("Descargar",DescargaHijo); 
         if(_contenedor.numChildren > 0) { 
            _contenedor.removeChildAt(0); 
         } 
         _contenedor.addChild(_cargador); 
      } 


Nada mas faltaria en el hijo poner el codigo que despecha el evento descargar.

Por Angel Roberto

Claber

248 de clabLevel



 

firefox
Citar            
MensajeEscrito el 12 Feb 2010 06:16 pm
y como sería el codigo en hijo?
intente esto:

Código ActionScript :

private function encima(event:MouseEvent):void{
      MovieClip(root).Principal.quitar();
     }


Pero me da este error:

Código ActionScript :

sisas
ReferenceError: Error #1069: No se encontró la propiedad Principal en clases.Galeria y no hay ningún valor predeterminado.
   at clases::Galeria/encima()

Por dianita666

Claber

185 de clabLevel



 

firefox
Citar            
MensajeEscrito el 12 Feb 2010 06:47 pm
Lo mejor es que el hijo no este accediendo a metodos del padre por eso el listener,que es lo que quieres que pase en la funcion encima?? yo tenia la idea de que querias descargar el swf hijo.

Si lo quieres descargar tendria que ser asi.

Código ActionScript :

private function encima(event:MouseEvent):void{ 
      dispatchEvent(new Event("Descargar"));
     } 


Parece que sigues un poco con la logica de AS2 lee un poco sobre los eventos aqui mismo hay varios lados donde lo explican bien:

Saludos!!

Por Angel Roberto

Claber

248 de clabLevel



 

firefox
Citar            
MensajeEscrito el 12 Feb 2010 06:58 pm
Gracias de nuevo Angel!!!

Por dianita666

Claber

185 de clabLevel



 

firefox
Citar            
MensajeEscrito el 12 Feb 2010 07:02 pm
No hay de que para esto es cristalab ;)

Por Angel Roberto

Claber

248 de clabLevel



 

firefox
Citar            
MensajeEscrito el 12 Feb 2010 07:03 pm
Oye una cosilla mas:
¿como hago para remover funciones de la misma clase dentro de la funcion encima?

probe esto pero no funciono:

Código ActionScript :

public function DescargaHijo(e:Event):void{
            removeChild(_contenedor);
            btn.removeEventListener(MouseEvent.CLICK,desenfoque);
      }

Por dianita666

Claber

185 de clabLevel



 

firefox
Citar            
MensajeEscrito el 12 Feb 2010 07:28 pm
Lo que no funciona es el removeEventListener??

Creo que el problema puede ser que le agregas al boton 3 listeners de click y cada que agregas uno nuevo este reemplaza al anterior
desde alli viene el problema si necesitas mandar llamar trs funciones en el click solo pon un listener

Código ActionScript :

//Yo quitaba los segundos listeners
 btn.addEventListener(MouseEvent.CLICK,onClickBtn); 
// btn.addEventListener(MouseEvent.CLICK,desenfoque); 
// btn.addEventListener(MouseEvent.CLICK,apagado); 

/Hay que modificar la funcion desenfoque y apagado para dejar de recibir un evento
function onClickBtn(e:MouseEvent){
desenfoque();
apagado();
}

// asi seria necesario remover un solo listener
btn.removeEventListener(MouseEvent.CLICK,onClickBtn); 


Haber si con eso funciona

Por Angel Roberto

Claber

248 de clabLevel



 

firefox
Citar            
MensajeEscrito el 12 Feb 2010 07:35 pm
me da este error:

Código ActionScript :

1136: Número de argumentos incorrecto.  Se esperaba 1.

Por dianita666

Claber

185 de clabLevel



 

firefox
Citar            
MensajeEscrito el 12 Feb 2010 07:54 pm
diana recuerda que estamos aqui para darte una guia no esperes que el codigo funcione tal como te lo pongo solo lo pongo para ayudarte a que resuelvas tu problema, pero si debes de tratar de entender lo que estas haciendo o cada error va parecerte algo del otro mundo cosa que no es asi, en ese caso es una funcion que esta declarada esperando un parametro al ser llamada y no lo recibe, me imagino que debe ser en la funcion desenfoque o apagado ya que estas dos funciones recibian de parametro un MouseEvent si las mandas llamar asi desenfoque(); apagado(); no mandas ningun parametro...por eso te puse que las modificaras para dejar de recibir parametros.

Saludos!!

Por Angel Roberto

Claber

248 de clabLevel



 

firefox

 

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