Lo primero que hay que saber es que hay 2 métodos para cargar un SWF externo.
1.- loadMovie
2.- loadMovieNum
Parecen similares, pero creanme, son diferentes. Aqui los detalles.
loadMovie
Permite cargar un SWF externo dentro de un MovieClip, así de simple no le veo mayor complicación.
Código:
Código :
this.loadMovie("ball.swf")
Ahora supongamos que queremos acomodar "ball.swf" dentro de nuestra película principal en determinada posición.
Lo que tenemos que hacer es:
Crear un MovieClip vació acomodar ese MovieClip en las coordenadas que queramos y después cargar nuestro SWF dentro del MovieClip.
Código:
Código :
clip_mc = this.createEmptyMovieClip("holder", 1); clip_mc._x = 100; clip_mc._y = 100 clip_mc.loadMovie("ball.swf")
Simple cierto.
loadMovieNum
Permite cargar un SWF externo en un nivel específico de la línea de tiempo en la que se realiza la acción
Código:
Código :
loadMovieNum("ball.swf", 10);
La limitante de este método es que no podemos acomodar el contenido mediante código.
Como siempre se pueden usar las rutas RELATIVAS para cargar un SWF en algún clip superior o inferior a la línea de tiempo donde estemos trabajando
Código:
Código :
_parent.loadMovieNum("ball.swf", 10); this.clip_mc.loadMovieNum("ball.swf", 10);
Otra pregunta muy típica es como puedo ir a un frame X dentro de un SWF que cargo.
Esto es simple poniendo un Preeload simple, para saber si ya esta cargado nuestro SWF y así poder ir a dicho frame, El error mas común es este
Código:
Código :
clip_mc = this.createEmptyMovieClip("holder", 1); clip_mc.loadMovie("ball.swf") clip_mc.gotoAndPlay(20);
Esto no funciona, por la simple razón de que la acción clip_mc.gotoAndPlay(20); se ejecuta mucho antes de que nuestro SWF haya sido cargado en su totalidad.
Queremos ir al frame 20 cuando aun dicho frame no esta disponible.
El código correcto seria:
Código:
Código :
clip_mc = this.createEmptyMovieClip("holder", 1); clip_mc.loadMovie("ball.swf"); this.onEnterFrame = function() { if (clip_mc.getBytesLoaded() != 0 && clip_mc.getBytesLoaded() == clip_mc.getBytesTotal()) { trace("cargo"); clip_mc.gotoAndPlay(20); delete this.onEnterFrame; } };
Hacemos una precarga y cuando este cargado nuestro SWF en su totalidad hacemos el gotoAndPlay.
Ahora cuando cargamos un SWF y queremos asignarle una acción de Mouse por que no funciona?
Cuando hacemos un loadMovie dentro de un Clip este Clip pierde sus acciones de Mouse, onRelease, onPress, onRollOver etc. etc.
La solución a este problema es crear 2 MovieClips anidados y cargar nuestro SWF dentro del segundo MovieClip para poder asignarle las acciones al Primer MovieClip, ¿Me explico?
Aquí el código
Código:
Código :
clip_mc = this.createEmptyMovieClip("holder", 1); son_mc = clip_mc.createEmptyMovieClip("holder2", 1); son_mc.loadMovie("ball.swf"); clip_mc.onRelease = function() { trace("Yeap, Funciona"); };
Estos son los conceptos básicos para trabajar con SWF externos y loadMovie.
Para terminar siempre hay preguntas tipo "Tengo un SWF que funciona bien solo, pero cuando lo cargo con loadMovie no funciona"
Esto es simplemente por que están usando rutas ABSOLUTAS, con rutas absolutas me refiero a _root
por ejemplo tenemos un SWF que lo que hace es: cuando presionamos un botón ponemos un mensaje en un campo dinámico el error mas común es:
Código:
Código :
ball_mc.onRelease = function() { _root.mi_txt.text = "Hola"; };
Esto funciona solo y solo si cuando la película es ejecutado sola. ya que tenemos esta estructura
|-_root
|-mi_txt
Pero que pasa cuando cargamos este SWF en otra película por ejemplo usando esto:
Código:
Código :
clip_mc = this.createEmptyMovieClip("holder", 1); clip_mc.loadMovie("ball.swf")
Deja de funcionar ya que las rutas cambiaron ahora las rutas son
|-_root
|-clip_mc
|-mi_txt
Entonces el código esta tratando de asignar un texto al campo mi_txt que se encuentra en el _root pero como la ruta ABSOLUTA cambio no funciona.
La solución es usar rutas RELATIVAS
Código:
Código :
ball_mc.onRelease = function() { this._parent.mi_txt.text = "Hola"; };
this se refiere al Botón _parent se refiere a la línea de tiempo donde esta el botón que es la misma línea de tiempo donde se encuentra nuestro campo de texto
y así no importa donde pongamos nuestro SWF siempre funcionara.
SWAT team, Añadidas algunas etiquetas para mejor comprensión