Comunidad de diseño web y desarrollo en internet online

¿Como manipular SWF's externos?

Citar            
MensajeEscrito el 16 Mar 2012 03:26 pm
Buenos dias. Les comento mi duda..

Como bien sabemos, al cargar un SWF externo, para manipularlo (por ejemplo, decirle que valla a tal fotograma dentro del SWF externo), tenemos que agregar un Listener al evento de carga, y cuando esta este completa, asignamos una funcion donde van a estar las acciones a realizar.

Ahora bien, mi duda es, tengo un website donde necesito manipular el archivo externo una y otra vez para no recargarlo siempre. Segun que boton se valla apretando, necesito que valla hasta tal fotograma.
Para la primera vez que le asigno la ruta a la variable de carga, agrego el Listener con el Event.COMPLETE, ¿Pero luego como lo sigo manipulando?


¿Como hago para manipularlo cuando yo quiera, no solo una vez cuando se completo la carga?

Probe con esto:

Código ActionScript :

var carga: Loader = new Loader();
var ruta: URLRequest = new URLRequest("archivo.swf");

function Click_Inicio(e:MouseEvent):void //Cuando se hace click en inicio, carga el swf externo y agrega un listener, que ejecuta la funcion completo.
{
   carga.load(ruta);
   carga.contentLoaderInfo.addEventListener(Event.COMPLETE, completo);
}

function Click_Nosotros(e:MouseEvent):void //Cuando se hace click en nosotros, como el archivo YA esta cargado, va hasta el fotograma Salida (dentro del swf externo)
{
   carga.content.gotoAndPlay("Salida"); //Esta es mi duda, volver a utilizar el archivo externo
}

function completo(e:MouseEvent):void
{
  var swf: MovieClip = e.target.content;
  swf.gotoAndPlay("Entrada");
}


Ovbiamente esto no me funciono, se me ocurre agregarle un Listener con el evento COMPLETE cada vez que quiera reutilizar el swf, por logica este ya estaria cargado y entraria en la funcion.

¿Como seria entonces? Muchas gracias!!!

Por xpumax

40 de clabLevel



 

opera
Citar            
MensajeEscrito el 16 Mar 2012 03:27 pm
Aclaro que es AS3

Por xpumax

40 de clabLevel



 

opera
Citar            
MensajeEscrito el 16 Mar 2012 03:30 pm
hola, primero deberias intentar agregarlo con addChild y despues, lo manejas atraves de la variable LOADER que usaste, osea, addChild(loader);
y luego si queres hacer tweens o moverlo haces

loader.x =...;
var loaderTween:tween = new Tween(loader,"x",etc,etc,etc,etc,etc);
espero aberte ayudado.

Por skaterseba

Claber

170 de clabLevel



 

firefox
Citar            
MensajeEscrito el 16 Mar 2012 04:19 pm
Hola gracias por responder.. me habia olvidado de poner lo de addChild aca en la pregunta. Lo agrege asi si, solo que en un contenedor: contenedor_mc.addChild(carga);

Lo que quiero hacer es manipular el swf externo. Este swf tiene un video dentro donde hay varios fotogramas que dividen el video, lo que quiero hacer es que cuando se apriete un boton en la pelicula principal, este swf externo valla a tal fotograma dentro suyo.

Por xpumax

40 de clabLevel



 

opera
Citar            
MensajeEscrito el 16 Mar 2012 04:25 pm
bueno. tenes q contactarlo a traves del movieclip, luego pienso (la verdad nunca probe algo asi) pero pienso q se manejara igual osea

moviecontenedor.swfexterno.gotoAndStop(etc)
estoy %90 seguro que es asi, pero como no lo probe, no me animo a afirmar que asi sea, pero probalo ;)

Por skaterseba

Claber

170 de clabLevel



 

firefox
Citar            
MensajeEscrito el 16 Mar 2012 10:07 pm
cada swf tiene que tener su propia clase,,, y a traves de las clases se puede interactuar mejor con otros swf,,, cada clase tendra sus propias propiedades,,, metodos,,, y eventos.

te manejas bien con clases???



Saludos



eXe

Por exekiel21

Claber

164 de clabLevel



Genero:Masculino  

programador

chrome
Citar            
MensajeEscrito el 16 Mar 2012 11:55 pm
Gracias por responder.. Conosco la teoria, hasta ahora no programe ninguna pero se como y para que se usan. Pero a que te referis cuando decis que cada swf externo tendria que tener su clase?¿Como se haria con esto para manipular cada uno de ellos? Muchas gracias

Por xpumax

40 de clabLevel



 

opera
Citar            
MensajeEscrito el 17 Mar 2012 02:41 am
Bueno todo depende de lo que uno quiera hacer. Pero Flash tiene la opcion de asignar una clase a tu swf. A traves de la clase podes comunicarte con otras clases. Y bueno supone que tenes un sitio con 4 secciones. Cada seccion es un swf,,, para cargar cada seccion tiene que haber un swf principal. Seria muy engorroso controlar lo que sucede dentro de cada seccion desde el swf principal. Lo mejor seria que el swf principal controle la cargar y descarga de cada seccion y que cada seccion controle lo que sucede en su interior ya que una seccion se conoce bien a si misma y no es necesario que otra seccion sepa como realiza sus procesos. La manera de controlarse a si misma es a traves de una clase, donde se definen sus propiedades y metodos. Un ejemplo practico seria que cada clase tenga dos metodos publicos, uno para la animacion de entrada y otro para la animacion de salida, asi swf1.animacionEntrada() y swf1.animacionSalida(),,, las cuales son llamadas desde el swf principal. El swf principal tambien necesita saber cuando termino la animacion de salida,,, para asi mostrar la nueva seccion. Para esto es necesario que la seccion le avise que esto paso y lo hace por medio de un evento que dispara a todos los que estan esperando que suceda.





Usar clases es muy practico.

Espero te sea de ayuda


Saludos


eXe

Por exekiel21

Claber

164 de clabLevel



Genero:Masculino  

programador

chrome
Citar            
MensajeEscrito el 23 Mar 2012 06:45 pm
Buenas! Perdon por contestar tan tarde. Estuve probando lo que me dijiste, me oriento mucho en lo que tenia que hacer, me vi el curso de clases (el de POO) de Cristalab. Te digo lo que entendi en base a lo que me dijiste:

Por un lado tengo 4 seccion (en archivos separados obviamente). Creo una clase, y en cada seccion instancio esa clase (esta bien hasta aca o la clase la tengo q asociar mediante flash?). En esta clase tengo 2 metodos publicos (animacionEntrada(), animacionSalida()), y el metodo animacionSalida() dispararia un evento con eventDispatcher cuando termine dicha animacion.

Por otro lado tengo el swf principal. Calculo que ahi se cargan las secciones cada uno en un Loader. Entonces, el evento que dispara una seccion son los botones del menu. Estos tendrian un listener, que responderian al evento CLICK, e irian a la funcion Click, donde: Por un lado se llamaria al metodo animacionSalida() (para que la seccion anterios "salga"), y cuando esta dispare el evento de que termino de salir, se llama al metodo animacionEntrada().

¿Esta bien asi? ¿Esto ultimo como se haria? digo, la parte de llamar a los metodos y de capturar el evento que dispara la animacionSalida(). ¿Seria algo como "loader.instanciadeclase.metodo"?

Muchas gracias che, me estas re ayudando!

Por xpumax

40 de clabLevel



 

chrome
Citar            
MensajeEscrito el 23 Mar 2012 08:35 pm
Esta seria la clase de una seccion por ejemplo:

Código ActionScript :

package {
     import flash.display.MovieClip;
     import flash.events.Event;

     public class Seccion1 extends MovieClip
     
     public const ANIMATION_OUT_FINISH:String = "animation out finish";
     
     public function Seccion1():void
     {



     }
     public function animacionEntrada():void
     {


     }
     public function animacionSalida():void
     {


     }
     private function finAnimacion():void //esta funcion se ejecua al terminar la animacion de salida
     {
          dispatchEvent(new Event(ANIMATION_OUT_FINISH));
     }

}
}


Y en el principal tendrias que hacer algo asi:

Código ActionScript :

...
import flash.events.Event;
...
private var seccion:MovieClip;
private var nuevaSeccion:MovieClip;
...
private function handlerSectionLoaded(e:Event):void
{     
     nuevaSeccion = MovieClip(e.target.content);
     seccion.addEventListener(seccion.ANIMATION_OUT_FINISH, handlerShowNewSection);
     seccion.animacionSalida();     
}
private function handlerShowNewSection(e:Event):void
{
     if (seccion)
     {
          removeChild(seccion);
     }
     seccion = nuevaSeccion;
     nuevaSeccion = null;

     addChild(seccion);
}




Saludos


eXe

Por exekiel21

Claber

164 de clabLevel



Genero:Masculino  

programador

chrome
Citar            
MensajeEscrito el 24 Mar 2012 12:04 am
Ahh ya voy entendiendo mejor.. Unas pocas dudas nomas: ¿En donde se invoca el metodo animacionEntrada()? ¿El segundo codigo que me pasaste es una clase o va en el fotograma del principal? ¿Donde se cargan los loader con cada seccion?
Creo que en eso tengo duda, despues la logica de como funciona la voy agarrando..

Gracias!

Por xpumax

40 de clabLevel



 

chrome
Citar            
MensajeEscrito el 24 Mar 2012 03:09 am
jeje,, me olvide ese detalle. Seria luego del addChild(seccion):

Código ActionScript :

...
addChild(seccion);
seccion.animacionEntrada();
...



Saludos



eXe

Por exekiel21

Claber

164 de clabLevel



Genero:Masculino  

programador

chrome
Citar            
MensajeEscrito el 25 Mar 2012 07:15 am
Ya caze todo.. Lo unico en lo que me trabe es en como me doy cuenta cuando termina la animacion de salida, para haci decirle que valla a la funcion y dispare el evento

Por xpumax

40 de clabLevel



 

chrome
Citar            
MensajeEscrito el 26 Mar 2012 03:49 am
pues,,, depende de la animacion q hagas. podes agregar un onEnterFrame y chekear si llego al final de la animacion.


Saludos


eXe

Por exekiel21

Claber

164 de clabLevel



Genero:Masculino  

programador

chrome
Citar            
MensajeEscrito el 26 Mar 2012 04:23 am
Hola! Es solo esto en la clase:

Código ActionScript :

public function animacionEntrada()
      {
         this.gotoAndPlay("Entrada");
      }
      public function animacionSalida()
      {
         this.gotoAndPlay("Salida"); //aca tendria que haber un listener que escuche un evento que se dispara cuando termina la animacion, y dirijirse a la funcion de abajo
      }
      private function finAnimacion():void //esta funcion se ejecua al terminar la animacion de salida
        {
           dispatchEvent(new Event(ANIMATION_OUT_FINISH));
        }


Es solo un "this.gotoAndPlay" que recorre todo el fotograma salida

Por xpumax

40 de clabLevel



 

chrome
Citar            
MensajeEscrito el 26 Mar 2012 08:28 am
Hola! Ya solucione lo del evento, con un ENTER_FRAME.
En fin, digamos que vengo bien. Pero me salto este error, es en el archivo Principal.swf:

"TypeError: Error #2007: El valor del parámetro child debe ser distinto de null.
at flash.display::DisplayObjectContainer/addChild()
at Principal_fla::MainTimeline/handlerShowNewSection()
at flash.events::EventDispatcher/dispatchEventFunction()
at flash.events::EventDispatcher/dispatchEvent()
at Seccion_Laempresa/finAnimacion()"

Te paso el codigo:

Código ActionScript :

...
var carga_em: Loader = new Loader();
var carga_ca: Loader = new Loader();
var ruta_em: URLRequest = new URLRequest("Laempresa.swf");
var ruta_ca: URLRequest = new URLRequest("Catalogo.swf");

var seccion: MovieClip;
var nuevaSeccion: MovieClip;

laempresa.addEventListener(MouseEvent.CLICK, cargaswf_em); //Un boton que al hacer click carga una seccion
catalogo.addEventListener(MouseEvent.CLICK, cargaswf_ca);

function cargaswf_em(e:MouseEvent) //Aca carga un boton, y cuando termina la carga va a "handlerSectionLoader"
{
   carga_em.load(ruta_em);
   carga_em.contentLoaderInfo.addEventListener(Event.COMPLETE, handlerSectionLoader);
}
function cargaswf_ca(e:MouseEvent)
{
   carga_ca.load(ruta_ca);
   carga_ca.contentLoaderInfo.addEventListener(Event.COMPLETE, handlerSectionLoader);
}

function handlerSectionLoader(e:Event):void //Aca estan las funciones que me pasaste
{
   nuevaSeccion = MovieClip(e.target.content);
   if (seccion)
   {
      seccion.addEventListener(seccion.ANIMATION_OUT_FINISH, handlerShowNewSection);
      seccion.animacionSalida();
   }
   else //Esto es para la primera vez, que seccion va a ser nulo
   {
      seccion = nuevaSeccion;
      nuevaSeccion = null;
      
      contenedor_mc.addChild(seccion);
      seccion.animacionEntrada();
   }
}
function handlerShowNewSection(e:Event):void
{
   if (seccion)
   {
      contenedor_mc.removeChild(seccion);
   }
   seccion = nuevaSeccion;
   nuevaSeccion = null;
   
   contenedor_mc.addChild(seccion);
   seccion.animacionEntrada();
}


Asi solucione el tema de la animacionSalida() en la clase:

Código ActionScript :

...
public function animacionSalida()
      {
         this.gotoAndPlay("Salida");
         this.addEventListener(Event.ENTER_FRAME, finAnimacion);
      }
      private function finAnimacion():void //esta funcion se ejecua al terminar la animacion de salida
        {
           if (currentFrame == frameEnd)
         {
              dispatchEvent(new Event(ANIMATION_OUT_FINISH));
         }
        }
...



¿Puede ser por ahi que el ENTER_FRAME, al quedarse parado en el ultimo fotograma, siga disparando y disparando el evento, en vez de detenerse una vez que llega?


Te debo unas cuantas cervezas xD

Por xpumax

40 de clabLevel



 

chrome
Citar            
MensajeEscrito el 26 Mar 2012 01:40 pm
proba asi:

Código ActionScript :

...
public function animacionSalida()
      {
          this.addEventListener(Event.ENTER_FRAME, finAnimacion);
          this.gotoAndPlay("Salida");
        
      }
      private function finAnimacion(e:Event):void //esta funcion se ejecua al terminar la animacion de salida
        {
           if (currentFrame == frameEnd)
         {
             this.removeEventListener(Event.ENTER_FRAME, finAnimacion); 
             dispatchEvent(new Event(ANIMATION_OUT_FINISH));
         }
        }
...


Saludos


eXe

Por exekiel21

Claber

164 de clabLevel



Genero:Masculino  

programador

chrome

 

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