Comunidad de diseño web y desarrollo en internet

Acceder a funciones en MovieClips de películas .swf externas

Al crear proyectos complejos en Flash, es común tener varios archivos SWF. En estos, podemos tener MovieClips con funciones externas que queremos usar en la película principal. En Actionscript 3, logramos esto tras cargar nuestros .swf con un Loader. En este tip explicaré cómo acceder a las funciones públicas de la clase asignada a un MovieClip de la librería de un archivo .swf externo desde la película principal.

Para mostrar el proceso utilizaré un ejemplo muy simplificado. Tendremos una película swfClipA.fla en cuya biblioteca tendrá un MovieClip al que le hemos asignado una clase, en este caso la clase se llama ClipA, que estará dentro del package clases.



Para simplificar al máximo este ejemplo únicamente haremos que la clase de este clip le coloque un angulo de rotación aleatorio y coloque este valor dentro de una variable, y contendrá una función publica que devuelve dicho valor.

Código :

package clases
{
   import flash.display.MovieClip;

   public class ClipA extends MovieClip
   {
      private var angulo:uint;
      
      public function ClipA()
      {
         this.rotation = Math.round(Math.random() *360);
         angulo = this.rotation;
      }
      public function getAngulo():uint
      {
         return angulo;
      }
   }
}


Ahora bien, imaginemos que tenemos una película principal en la que cargamos este archivo swfClipA.swf. Esta sería la clase asignada a la película principal:

Código :

package clases
{
   import flash.display.Loader;
   import flash.display.MovieClip;
   import flash.net.URLRequest;
   import flash.events.Event;

   public class Main extends MovieClip
   {
      private var _swf:MovieClip;

      public function Main()
      {
         var loader:Loader = new Loader();
         var request:URLRequest = new URLRequest("swfClipA.swf");
         loader.load(request);
         loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onCargado);
      }
      private function onCargado(e:Event):void
      {
         _swf = addChild(e.target.content) as MovieClip;
      }
   }
}


Y ahora desde esta película principal acceder a la función pública del MovieClip interno del archivo externo. Lo único que tenemos que hacer es buscar la ruta de esa clase dentro del clip cargado.

Para ello realizaremos una búsqueda dentro del clip cargado y seleccionaremos cual de ellos está creado con la clase que nos interesa interactuar. Una vez encontrada podremos acceder sin problema a sus funciones públicas.

Código :

for (var i:uint = 0; i < _swf.numChildren; i++)
{
   var clip:MovieClip = _swf.getChildAt(i) as MovieClip;
   if (clip.constructor == ClipA)
   {
      var _clipA:MovieClip = clip;
   }
   trace(_clipA.getAngulo());
}


Nota: Este no es un buen ejemplo de uso en cuando a POO se refiere, ya que rompe totalmente la encapsulación de este módulo externo. Lo mejor hubiese sido que esta película externa tuviese en su clase principal toda una serie de funciones publicas, que controlasen las funciones de sus clips interiores, y toda una serie de dispatcher para comunicarse con la película principal tal como si de un componente se tratase, en lugar de andar buscando referencias a clips internos. Pero bueno, en caso de apuro tenemos este recurso.

¿Sabes SQL? ¿No-SQL? Aprende MySQL, PostgreSQL, MongoDB, Redis y más con el Curso Profesional de Bases de Datos que empieza el martes, en vivo.

Publica tu comentario

o puedes...

¿Estás registrado en Cristalab y quieres
publicar tu URL y avatar?

¿No estás registrado aún pero quieres hacerlo antes de publicar tu comentario?

Registrate