AS3: Cargando un SWF
Buenas a todos!
Hace unos dias hice este experim ento con PV3D. La verdad es que de AS3 voy realmente mal, lo bonito que era AS1 e incluso AS2 para los que no tenemos mucha idea de codigo durillo :_(
El problema es que el experimento ocupa 7megas, y claro lo primero que piensas es: voy a ponerle una barra de carga. Cosa hasta ahora bien facil, pero ahora con AS3 va a ser que no lo es...
Para complicar las cosas ese experimento basicamente tiene 6 movieclips en la libreria que se exportan al primer frame, asi que poner una barra de carga en la propia movie seria inutil, ya que no saldria hasta que no se hubiesen cargado esos 6 movieclips, asi que despues de darle muchas vueltas lo ultimo que intente hacer fue un preloader.swf que carga el panorama_anim.swf. Pero simplemente no funciona, si teneis la version debug del player vereis que da un error de inicializacion de la clase principal de panorama_anim.swf. Con flash antiguos medio funciona, pero con cosas con clases no parece que funcione. No se si es un problema parecido a cuando se usaba antes el _root y luego no habia manera de cargar esos flashes en otro pero lo parece...
Este es el codigo al que he llegado despues de unas cuantas horas de busca por aqui y por alli...
<code>
package
{
import flash.display.*;
import flash.events.*;
import flash.net.URLRequest;
import flash.text.*;
public class preloader extends Sprite
{
private var f:String = "";
private var tf:TextField = new TextField();
public function preloader()
{
// Getting FlashVars
var paramObj:Object = LoaderInfo(this.root.loaderInfo).parameters;
for (keyStr in paramObj) {
switch (keyStr)
{
case "f":
valueStr = String(paramObj[keyStr]);
f = valueStr;
}
}
var loader:Loader = new Loader();
//loader.contentLoaderInfo.addEventListener(Event.INIT, initHandler);
//loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
loader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, onLoadProgress);
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, completeHandler);
var request:URLRequest = new URLRequest(f);
loader.load(request);
//addChild(loader);
tf.autoSize = TextFieldAutoSize.LEFT;
tf.textColor = 0xFF0000;
addChild(tf);
tf.text = f;
}
private function onLoadProgress (event:ProgressEvent):void
{
var loaded:int = event.bytesLoaded;
var total:int = event.bytesTotal;
var percent:int = loaded/total*100;
tf.text = "Loading: "+String(percent)+"%";
}
/*
private function initHandler(event:Event):void
{
var loader:Loader = Loader(event.target.loader);
var info:LoaderInfo = LoaderInfo(loader.contentLoaderInfo);
tf.text = "initHandler: loaderURL=" + info.loaderURL + " url=" + info.url;
}
*/
private function ioErrorHandler(event:IOErrorEvent):void {
trace("ioErrorHandler: " + event);
}
private function completeHandler(event:Event):void {
addChild(event.target.content);
}
}
}
</code>
Por ejemplo, si intento cargar la demo de John Grden usandolo asi:
LINK
Me devuelve esto:
<code>
TypeError: Error #1009: Cannot access a property or method of a null object reference.
at Falcon3D_cameraFollow/::init()
at Falcon3D_cameraFollow$iinit()
</code>
Alguien tiene idea de esto?
Gracias de antemano!
ventdaval
vale vale, entiendo (no comparto ^^) lo de no usar el timeline... pero, no es mas facil usar un preloader externo?
Usuario desconocido
No no, si que se puede. Esto es mas bien para hacer precargas de el mismo .SWF. En flash, con la libreria cuando pones 'Exportar al primer frame' siempre te ocurre eso, que hasta que no se carga ese frame no se puede mostrar nada mas. Con flash8- era mas que nada con imagenes, asi que lo mejor era ponerlas en el Stage en el segundo frame o cosas asi (que es como resolvi yo mi problema.
En caombio, lo que expone Keith es un motodo sin documentar que anyade un .swf rollo cabecera antes incluso que lo que se exporta al primer frame. Y que se puede usar en modo de preloader.
Lo que ocurre con flash9 es que ya no hay timeline. Bueno, si la hay, pero por alguna manera la gente intenta no usarla (yo acabe usandola para arreglar mi problema). Asi que cuando exportas imagenes de la libreria para poderlas usar en el Main.as o lo que sea siempre tendras el problema que hasta que no se hayan cargado los datos del primer frame no se vera nada mas que blanco.
No se si me he explicado ahora :S Siento haber mezclado conceptos.
ventdaval
mrdoob
And the winner is....
bit-101!!
Buf, no entiendo na...
Significa que no se puede cargar el SWF dentro de otro? porque? :-?
ozke
Lo de apollo es un intento claro de ir a x un cachito del pastel de Java. Digo yo vaya ;P
juandelgado
mrdoob
el problema es que estaba indocumentado el asunto :S
Yo tengo la teoria conspiranoia de que Adobe no quiere que se hagan aplicaciones AS3 sin Flex.
Usuario desconocido
Haha, si, ya vi unas cuantas presentaciones, menudo mejunge se esta haciendo ahi X) Estos de adobe van a por todas. Aunque, para ser sincero, ninguna de las demos que he visto me ha hecho interesarme por el producto aun.
hardface
Has visto esto tio ¿?
http://labs.adobe.com/wiki/index.php/Apollo
Usuario desconocido
No bueno, una vez lo sabes no es tan complicado, el problema es que estaba indocumentado el asunto :S
hardface
La puta! esto me recuerda al Amstrad aquel que era un procesador de textos, que para hacer un 'CLS', borrado de pantalla, había que hacer una tesis doctoral... buah!
Usuario desconocido
And the winner is....
bit-101!!
hardface
diosssssssss.... esto se pone serio.... adios a mis parches! :(
ventdaval
mrdoob
lo bonito que era AS1 e incluso AS2 para los que no tenemos mucha idea de codigo durillo :_(
Oh si... Ya veras como en un tiempo saldran mil y un wrappers para funciones de AS2 en AS3... :P Incluso apostaria por una libreria tipo prototype (la de JS) para AS3... xD
No entiendo muy bien tu problema, pero por si acaso (y pa descartar que sea tu preloader), prueba creando un nuevo swf vacio, con esto en el primer frame:
<code>var l = new Loader();
addChild(l);
l.load(new URLRequest("test.swf"));
l.contentLoaderInfo.addEventListener ( ProgressEvent.PROGRESS, doProgress);
function doProgress(e) {
var l=e.bytesLoaded;
var t=e.bytesTotal;
var p=l*100/t;
miTF.text=Math.round(p)+"%";
}</code> (y claro, cambias test.swf por lo que sea ^^)
Usuario desconocido
*bump*
Uhm.. nadie?