Cargar SWF externo con AS3
Hola!!! A ver si me sacáis de este tapón que me he metio. xD
La cuestión es que quiero cargar un swf externo en AS3, supongo que es una cuestión simple peor que a mi no me sale ni atrás.
Os explico un poco la situación:
Tengo un menú que cuando clickas a un botón va al frame " tal", pos yo quiero en el frame "tal" se cargue una película externa determinada.
Como lo puedo hacer?
Probé con:
<code>var request:URLRequest = new URLRequest("peliexterna.swf");
var cargar:Loader = new Loader()
cargar.load(request);
addChild(cargar);</code>
Pero claro cuando le das al botón no encuentra le película y me sale el siguiente error:
<fieldset>TypeError: Error #1009: No se puede acceder a una propiedad o a un método de una referencia a un objeto nulo.</fieldset>
Espero haberme explicao bien.
Gracias de antemano!
tpmmds
Hola:
Creo que el problema es otro. Si no encontrara el swf, el mensaje de error sería No se encuentra la dirección URL
¿Accedes al contenido del swf cargado? Es que si es el caso deberías crear una función controladora del evento COMPLETE (o INIT), y es a partir de que se produzca el evento cuando puedes acceder al contenido del swf
Añade el código
<code>
cargar.contentLoaderInfo.addEventListener(Event.COMPLETE, onCompleteListener)
function onCompleteListener(evt:Event){
var contenidoSwf:* = evt.target.content
}
</code>
En contenidoSwf tienes el contenido del swf, una vez que se ha cargado (puedes utilizar el evento INIT si lo que quieres es acceder a algún método, y no quieres esperar a que se cargue todo el swf).
Un saludo
Ramirezduval
Muuchas gracias por la respuesta, si yo accedo al contenido del swf y es correcto.
creo que la solución esta por hay lo que no se darla. la cosa esta como que no carga la clase asociada a la swf que quiero cargar, cabe destacar que el swf funciona al reproducirlo solo.
mi código actual es el siguiente:
<code>var request:URLRequest = new URLRequest("fotos/As3_CrossFade.swf");
var cargar:Loader = new Loader()
cargar.load(request);
addChild(cargar);
cargar.contentLoaderInfo.addEventListener(Event.COMPLETE, onCompleteListener)
function onCompleteListener(evt:Event){
var contenidoSwf:* = evt.target.content
}</code>
y el mensaje de error que me exactamente es este:
<fieldset>TypeError: Error #1009: No se puede acceder a una propiedad o a un método de una referencia a un objeto nulo.
at fotos_rotante$iinit()[\\fotos\slide_fotos.as:30]</fieldset>
Agradecería una ayudita! tpmmds Si algún dia pasas por mi ciudad te debo una birra!
tpmmds
Hola:
No sé exactamente lo que quieres "coger" del swf, por lo que doy varias posibilidades:
1. Quieres obtener un movieClip que está en el stage (si estuviese anidado en otros, deberías dar la ruta, o sea películaA.películaB.peliculaC["miMovieClip"]) y que se llama miMovieClip
Deberías hacer
<code>
var pelicula:MovieClip = contenidoSwf["miMovieClip"]
</code>
2. Quieres utilizar un método que está dentro de la clase de documento del swf, o una función que has escrito en el Frame 1 de la línea de tiempo del swf. Por ejemplo, un método que multiplica dos números y devuelve el resultado:
<code>
trace(contenidoSwf.multiplica(2, 4));
</code>
En el swf deberías haber creado el método/función:
<code>
public function multiplica (val1:Number, val2Number):Number{
return val1*val2;
}
</code>
Al cargar el swf deberías ver en la ventana output el valor 8 (2*4)
Si quieres acceder a contenidoSwf fuera del método onCompleteListener, haz que contenidoSwf sea una propiedad. Al principio de la clase define:
<code>
private var contenidoSwf:*;
</code>
Espero que te sirva todo este rollo :-)
Un saludo
Ramirezduval
Gracias tpmmds, al final conseguí medio solucionar el tema con este código:
<code>var contenedor:MovieClip = new MovieClip();
var loader:Loader = new Loader();
loader.load(new URLRequest("general.swf"));
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, insertMovie);
function insertMovie(evt:Event):void{
addChild(contenedor).name = "contenedor";
contenedor.addChild(loader).name = "loader";
}</code>
Lo que pasa que el flash que quiero cargar tiene una clase asociada, la cual no carga ni patrás! alguien sabría como hacerlo.
PS: Si utilizo un flash sin clase asociada carga de lujo!
<fieldset>Una ayudita por favorr!</fieldset>
"Con voz de los que piden en el tren"
tpmmds
¿No estarás intentando cargar un swf con un include a una clase de AS2? Si es el caso, AS2 y AS3 son incompatibles: no puedes acceder a métodos de AS2 desde AS3, ya que cada uno "corre" en una máquina virtual distinta (AVM1 y AVM2)
Si es esto, me parace que el problema tiene difícil solución, salvo que conviertas todo el código AS2 en AS3
galias
Es una pregunta que puede sonar tonta, pero no por eso menos importante. La hago porque veo lo que se viene posteando y no lo veo:
¿Estás haciendo los import de las clases verdad?
Ramirezduval
tpmmds no no ambas películas son el as3, el problema esta en cargar la clase de la película que quiero cargar.
Galias sobre los import de la clase no los estoy haciendo en la película principal por que teóricamente la clase es la clase asociada al documento que quiero cargar, no se si me entiendes... Probablemente el problema debe ser que debería hacer un import de la clase desde la película principal lo intente pero no salió bien... no se que hacer. creo que al final obtaré por hacer algo mas simple y que mas o menos funcione.
Ya os contaré y muchas gracias! espero algún día poder ayudarles.
tpmmds
Hola:
Ramirezduval
Galias sobre los import de la clase no los estoy haciendo en la película principal por que teóricamente la clase es la clase asociada al documento que quiero cargar,
Pues va a ser lo que decía Galias. Si estás utilizando una clase de documento; o sea escribiendo un archivo as que empieza por package, tiene un constructor, métodos y toa' la pesca, debes incluir los imports de todas las clases que estés utilizando.
Otra cosa sería que utilizaras la directiva include, para incluir código AS de un archivo as. Esto sí es equivalente a escribir en el Frame1 de Flash y no es necesario escribir los imports (de hecho, los imports, así como la declaración de las instancias que hay en el escenario, los hace Flash por nosotros, que es muy buena gente :-) )
Un saludo.
kamlofsky
Hola:
Hola, estoy armando un proyecto, tengo dos archvios flash con as3.
Uno principal y otro secundario.
Estoy tratando de que el principal cargue al secundario como swf utilizando URLRequest
var loadVariables:Loader = new Loader();
var filePath:URLRequest = new URLRequest("secundario.swf");
loadVariables.load(filePath);
loadVariables.contentLoaderInfo.addEventListener(Event.COMPLETE, insertMovie);
function insertMovie(evt:Event):void{
Mymovie.addChild(loadVariables) as MovieClip;
}
Hasta aqui bastante bien porque lo carga, el problema esta es que no ejecuta el codigo as3 que se encuentra en el secundario.swf
Tambien necesito pasar una variable del principal al secundario.
gracias.
Antonio
tpmmds
Hola, Antonio:
Te contesto aquí la pregunta del blog. Me da que no encuentras los métodos/funciones/variables del swf que cargas porque los estés buscando en MyMovie y no en loadVariables, donde realmente está el swf. Prueba a hacer:
MyMovie = loadVariables.content
Ahora, si en el swf existía un método PUBLICO llamado procesarVariable(var:Number), puedes pasarle un valor así:
MyMovie.procesarVariable(123)
Por cierto, para acceder al código AS del swf no es necesario esperar a la carga completa de éste; puedes utilizar el evento Event.INIT (que se propaga cuando el código AS está listo para usarse), en lugar del COMPLETE. Esto es útil por si quieres dar valores iniciales a algo del swf que se va a mostrar, antes de que acabe la descarga.
Un saludo.
locopump
YO se cual es el error, aunque se que ya paso mucho tiempo lo dejaré porsiacaso otra persona quiera saber la respuesta, ya que no encontre respuesta por ningun lado, todo esto en el primer Frame:
import flash.display.MovieClip;
import flash.display.Sprite;
var contenedor:MovieClip = new MovieClip();
var loader:Loader = new Loader();
loader.load(new URLRequest("imagenes/tu_imagen.swf");
//Nombre exacto con mayusculas y minusculas incluso el jpg ya que aveces ponen .SWF, .Swf, .SwF, etc
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, insertMovie);
//insertMovie es la función que viene a continuación
//FUNCION INSERTAR PELICULA
function insertMovie(evt:Event):void {
addChild(contenedor).name = "contenedor";
contenedor.addChild(loader).name = "loader";
contenedor.width=50; //ancho
contenedor.height=150; //alto
contenedor.x=0; //posicion x
contenedor.y=0; //posicion y
}
YO trabajo mayormente con XML porqe me facilita la creacion de codigo, por ejemplo si pongo 500 imagenes no voy a estar haciendo este codigo 500 veces, solo hago un php con un
for($i=0;$i<500;$i++){
//AQUI HAGO UN CODIGO QUE ME CREE UN ARCHIVO XML CON TODOS LOS NOMBRES DE LAS IMAGENES
//por ejemplo echo 'imagen'.$i.'.swf';
//y luego ya lo jalo del XML en el Action Script de Flash
}
Si quieren saber algo mas no duden en consultarme a mi correo
RobertoAbril
tpmmds
Hola, espero que después de tanto tiempo sirva de algo reabrir el hilo. Estoy teniendo este mismo problema, no consigo cargar un swf creado con documento de clase. Tal y como se comenta por ahí el mismo código me sirve para cargar un swf hecho en la linea de tiempo.
El tema esta que viendo este post me surge la duda de si con lo que cito arriba te refieres a importar las clases que utiliza el swf externo dentro de la clase que carga dicho swf. Es así?. Lo digo porque, aunque parezca extraño, ya no sé que más probar, no entiendo que sucede ya que siempre que intento cargar mi swf creado con ducumento de clase me dice:
TypeError: Error #1009: No se puede acceder a una propiedad o a un método de una referencia a un objeto nulo.
at Main()
O si intento inicar el swf mediante la función pública init() que declaro dentro del mismo me dice:
TypeError: Error #1009: No se puede acceder a una propiedad o a un método de una referencia a un objeto nulo.
at Main()
TypeError: Error #1006: init no es una función.
at com.tsk.utils::SwfHolder/onComplete()
Que puede estar pasando?. Será problema del codigo de mi swf externo?
Gracias de antemano.
Un saludo.
Lukánicos
BuenAS:
Creo que tiene que ver con que el swf cargado no tiene stage. Añade al constructor de tu clase documento (en Cristalab también lo he pegado, y quizá sea más fácil leerlo, ya que aquí se pierden las tabulaciones):
package
{
import flash.display.Sprite;
import flash.display.StageAlign;
import flash.display.StageScaleMode;
import flash.events.Event;
[SWF(backgroundColor="0xFFFFFF", frameRate="25")]
public class ClasePrincipal extends Sprite
{
public function ClasePrincipal()
{
super();
if (stage)
init()
else
addEventListener(Event.ADDED_TO_STAGE, init, false, 0, true);
}
private function init(event:Event=null):void
{
if (event)
removeEventListener(Event.ADDED_TO_STAGE, init);
//Escribe aquí el código que tendrías en el constructor y que hace referencia al stage
}
}
}
Y como se dice más arriba, si lo que quieres es ejecutar un método/función, no hay que esperar al evento COMPLETE; ya cuando se produce el evento Event.INIT, el código AS está disponible y puedes empezar a llamar a dichos métodos.
Un saludo.
RobertoAbril
Eo. gracias de nuevo, te respondí en cristalab.
Mejor seguimos allí que esto es un lio macho.
Salutens y merci otra vez!