Comunidad de diseño web y desarrollo en internet online

Cargar SWF externo creado usando Documento de Clase

Citar            
MensajeEscrito el 05 Ene 2011 01:39 pm
Hola.

A ver si algún alma caritativa me echa un cable con este problemilla que estoy teniendo. He buscado por los foros pero no encuentro respuesta para mi duda. Es lo siguiente:

Estoy intentando cargar dentro de mi proyecto AS3 creado usando clases y toda la pesca un SWF externo creado de la misma forma. Es decir, NO basado en la linea de tiempo.

El tema está que no consigo cargarlo. El código que utlizo es este

Código ActionScript :


private var theSwf:*

.....

private function onComplete(e:Event):void 
      {
         theSwf = new MovieClip;
         swfLoader.contentLoaderInfo.removeEventListener(IOErrorEvent.IO_ERROR, onLoadingError);
         swfLoader.contentLoaderInfo.removeEventListener(ProgressEvent.PROGRESS, onProgress);
         swfLoader.contentLoaderInfo.removeEventListener(Event.COMPLETE, onComplete);

               
         theSwf = e.currentTarget.content as MovieClip;

         addChild(theSwf);
         
         theSwf.init();

      }


Solo pongo la función onComplete que es donde imagino esta el meollo no?. El tema es que intento iniciar mi swf externo llamando a init() que esta declarada como función pública en el documento de clase que usa el swf que quiero cargar.

He probado este método usando un swf basado en linea de tiempo y todo funciona perfecto, sin embargo siempre que quiero cargar éste tipo de swf me devuelve este error:

Código ActionScript :

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()


El frameRate del swf que quiero cargar es el mismo que el de mi proyecto, así que eso queda descartado. Alquien sabe que puede estar sucediendo?. Si creeis que puede haber algo raro en el código del swf que quiero cargar os lo puedo poner.

Bueno gracias de antemano. Cuelquier ayuda es bien recibida.

Salutens.

tsk.

Por teskostudio

34 de clabLevel



 

firefox
Citar            
MensajeEscrito el 05 Ene 2011 01:59 pm
BuenAS:

Da la impresión de que el swf cargado no tiene stage. En la clase principal de dicho swf añade un listener al Event.ADDED_TO_STAGE y compilalo de nuevo. Algo así:

Código ActionScript :

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
                } 
               
        } 
} 


Un saludo.

Por Lukánicos

Claber

468 de clabLevel



Genero:Masculino  

chrome
Citar            
MensajeEscrito el 05 Ene 2011 02:32 pm
Eo.

Que rapidez. :)

Oye, creo que por tu firma, he citado un post tuyo en domestika preguntando por esto mismo...como ves estoy que no sé donde acudir jeje.

Probé lo que comentas pero no funciona, me sigue saliendo el mismo error. Si no te importa te dejo aquí el código del documento de clase del swf externo que quiero cargar, por si tú vieras algo que a mi se me escapa:

Código ActionScript :

package 
{
   import flash.display.MovieClip;
   import flash.display.Stage;
   import flash.display.StageAlign;
   import flash.display.StageScaleMode;
   import flash.display.Sprite;

   import flash.text.TextField;
   import flash.text.TextFieldAutoSize;
   import flash.text.AntiAliasType;
   import flash.text.TextFormat;

   import flash.events.Event;
   import flash.utils.setTimeout;
   
   import caurina.transitions.Tweener;
   import caurina.transitions.properties.ColorShortcuts;
   ColorShortcuts.init();

   [SWF(backgroundColor="0xFFFFFF", frameRate="31")] 
   public class Main extends MovieClip
   {


      private var t:TextField;
      private var tf:TextFormat;

      private var theFont:Arial = new Arial();

      private var textContainer:Sprite;
      private var bg:Sprite;

      
      
      public function Main()
      {
         super();
         
         if(stage){
            init();
         } else {
            addEventListener(Event.ADDED_TO_STAGE, init);
         }

      }

      public function init(e:Event = null):void
      {
         if(e){
            removeEventListener(Event.ADDED_TO_STAGE, init);
         }
         
         tf = new TextFormat  ;
         tf.font = theFont.fontName;
         tf.color = 0xFFFFFF;
         tf.size = 35;

         bg = new Sprite;
         bg.graphics.beginFill(0xFFFFFF * Math.random());
         bg.graphics.drawRect(0,0,stage.stageWidth, stage.stageHeight);
         bg.graphics.endFill();
            
         addChild(bg);
         

         createText();

         
      }
      
      private function createText():void 
      {
         textContainer = new Sprite;
         
         addChild(textContainer);
         
         t = new TextField;
         t.multiline = false;
         t.defaultTextFormat = tf;
         t.antiAliasType = AntiAliasType.ADVANCED;
         t.text = "THIS IS A SWF";
         t.autoSize = TextFieldAutoSize.LEFT;
         t.selectable = false;
         t.embedFonts = true;
         
         textContainer.addChild(t);
         
         textContainer.x = stage.stageWidth * .5 - textContainer.width * .5;
         textContainer.y = stage.stageHeight * .5 - textContainer.height * .5;
         
         addInteraction();
         
         
      }
      
      private function addInteraction():void 
      {
         setTimeout(colorize, 3000);
      }
      
      private function colorize():void 
      {
         Tweener.addTween(bg, {_color:0xFFFFFF * Math.random(), time:.5, transition:"linear"});
         Tweener.addTween(textContainer, {_color:0xFFFFFF * Math.random(), time:.5, delay:.3, transition:"linear", onComplete:addInteraction()});
      }
      
   
   }

}


Ante todo muchas gracias por tu ayuda.

Salutens!

Por teskostudio

34 de clabLevel



 

firefox
Citar            
MensajeEscrito el 05 Ene 2011 03:29 pm
BuenAS:
Prueba

Código ActionScript :

package  
{ 
   import flash.display.MovieClip; 
   import flash.display.Stage; 
   import flash.display.StageAlign; 
   import flash.display.StageScaleMode; 
   import flash.display.Sprite; 
   
   import flash.text.TextField; 
   import flash.text.TextFieldAutoSize; 
   import flash.text.AntiAliasType; 
   import flash.text.TextFormat; 
   
   import flash.events.Event; 
   import flash.utils.setTimeout; 
   
   import caurina.transitions.Tweener; 
   import caurina.transitions.properties.ColorShortcuts; 
   
   [SWF(backgroundColor="0xFFFFFF", frameRate="31")]  
   public class Main extends MovieClip 
   { 
      [Embed(
            source='arial.ttf',
            fontName='Arial',
            mimeType='application/x-font',
            advancedAntiAliasing='true'
      )]
      private var EmbedFont:Class;
      
      private var t:TextField; 
      private var tf:TextFormat; 
      
      private var textContainer:Sprite; 
      private var bg:Sprite; 
      
      public function Main() 
      { 
         super(); 
         
         if(stage){ 
            init(); 
         } else { 
            addEventListener(Event.ADDED_TO_STAGE, init); 
         } 
         
      } 
      
      public function init(e:Event = null):void 
      { 
         if(e){ 
            removeEventListener(Event.ADDED_TO_STAGE, init); 
         } 
         ColorShortcuts.init();
         
         tf = new TextFormat("Arial");
         tf.color = 0xFFFFFF; 
         tf.size = 35; 
         
         bg = new Sprite; 
         bg.graphics.beginFill(0xFFFFFF * Math.random()); 
         bg.graphics.drawRect(0,0,stage.stageWidth, stage.stageHeight); 
         bg.graphics.endFill(); 
         
         addChild(bg); 
         
         
         createText(); 
         
         
      } 
      
      private function createText():void  
      { 
         textContainer = new Sprite; 
         
         addChild(textContainer); 
         
         t = new TextField(); 
         t.multiline = false; 
         t.defaultTextFormat = tf; 
         t.antiAliasType = AntiAliasType.ADVANCED; 
         t.text = "THIS IS A SWF"; 
         t.autoSize = TextFieldAutoSize.LEFT; 
         t.selectable = false; 
         t.embedFonts = true; 
         
         textContainer.addChild(t); 
         
         textContainer.x = stage.stageWidth * .5 - textContainer.width * .5; 
         textContainer.y = stage.stageHeight * .5 - textContainer.height * .5; 
         
         addInteraction(); 
         
         
      } 
      
      private function addInteraction():void  
      { 
         setTimeout(colorize, 3000); 
      } 
      
      private function colorize():void  
      { 
         Tweener.addTween(bg, {_color:0xFFFFFF * Math.random(), time:.5, transition:"linear"}); 
         Tweener.addTween(textContainer, {_color:0xFFFFFF * Math.random(), time:.5, delay:.3, transition:"linear", onComplete:addInteraction()}); 
      } 
      
      
   } 
   
}


Como no tenía la fuente, la he incrustado en el swf, por lo que debes COPIAR EN LA CARPETA DONDE COMPILES ESTA CLASE la fuente arial.ttf

Le he cambiado de sitio algún comando que estaba un poco desubicado, pero carga perfectamente desde otro swf ;).

Un saludo.

Por Lukánicos

Claber

468 de clabLevel



Genero:Masculino  

chrome
Citar            
MensajeEscrito el 05 Ene 2011 04:46 pm
Hola!.

Bueno,muchas gracias por el detalle de incluso probarlo tío. En serio que se agradece.

Algo raro que me ha pasado con tu código es que al compilar me tiraba un error si tenia la fuente ubicada en el mismo directorio que el swf diciendome que no podia codificarla. Sin embargo al cambiar de directorio la fuente, tira sin problemas y compila bien ?¿.

Lo malo es que sigue sin cargar desde otro swf. Le he dado vueltas y he pensado que quizás se debiese a que estoy intentando cargar el swf desde un paquete que no tiene ninguna referencia directa al stage (al cual llamo myStage en el documento de clase del swf donde quiero cargar éste externo) pero he visto que aunque no pase ninguna referencia de myStage a la clase, ésta sigue pudiendo referenciar al stage, o al menos aparece como tal usando:

Código ActionScript :

trace(this.stage)


Además que el problema en todo caso estaría en el stage del swf externo no?. En fin, total, que me he rallado y he creado un documento en blanco que básicamente sólo carga el swf externo. El código es este:

Código ActionScript :

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

   import flash.net.URLRequest;

   import flash.display.Loader;



   public class Main extends MovieClip
   {

      private var loader:Loader;
      private var theSWF:MovieClip;

      public function Main()
      {
         addEventListener(Event.ADDED_TO_STAGE, init);
      }

      private function init(e:Event):void
      {
         removeEventListener(Event.ADDED_TO_STAGE, init);
         loadAsset();
      }

      private function loadAsset():void
      {
         loader = new Loader;
         loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onComplete);
         loader.load(new URLRequest("swf/externalSwf.swf"));
      }

      private function onComplete(e:Event):void
      {
         loader.contentLoaderInfo.removeEventListener(Event.COMPLETE, onComplete);
         trace(e.currentTarget.content.width);
         theSWF = e.currentTarget.content;
         addChild(theSWF);
         //theSWF.init();
      }

   }

}


Aún así nada. Que no carga. Lo curioso es que si te fijas hay un trace del loader.content.width que no para de repetirse y que me tira 0 continuamente como si estuviera dentro de un loop . Por otra parte si intento acceder a theSWF.init(), esta vez me tira el error:

Código ActionScript :

ArgumentError: Error #1063: Discordancia del recuento de argumentos en Main/init(). Se esperaba 1 y se obtuvo 0.
   at Main/onComplete()


Ese error viene del swf que carga no?....Por supuesto con un swf basado en la linea de tiempo funciona perfecto. Me devuelve las dimensiones del swf y no hay loop en los trace.

Tienes idea de porque me pasa esto?. Tu usas FlashBuilder para trabajar con as?, porque si es así quizás se deba a que yo uso Flash CS5.

La verdad que no entiendo nada.

De todas formas gracias otra vez. Por cierto, tu no serás Luís de COCONUT verdad? es que eso de buenAS me suena mucho :D


Salutens!!

Por teskostudio

34 de clabLevel



 

firefox
Citar            
MensajeEscrito el 05 Ene 2011 07:06 pm
BuenAS:

Y tu "Saluten" también me suena ;) Si es que con esto de Flash/AS da la impresión de que somos cuatro gatos.

El error de discordancia del recuento de argumentos es por llamar al método init() sin pasarle el evento. Prueba algo así(darle por defecto el valor null):

Código ActionScript :

private function init(e:Event=null):void 
{ 
    removeEventListener(Event.ADDED_TO_STAGE, init); 
    loadAsset(); 
}


Si no es estrictamente necesario, no manipules el stage del swf cargado, ya que posiblemente te lance errores de seguridad del sandbox (dejalo para el final, cuando consigas el resto).

El error que da con la fuente incrustada con Embed puede ser debido (casi seguro) a que Flash CS5 utiliza el nuevo TL de Flex 4. Si compilas con CS5/TLF (Flex 4) suele ser recomendable incrustar la fuente con embedAsCFF='false':

Código ActionScript :

[Embed(
   source='nombre_fuente.ttf',
   fontName='Mi Fuente',
   mimeType='application/x-font',
   advancedAntiAliasing='true',
   embedAsCFF='false'
)]
var FontName:Class;

y con CS4 (Flex 3):

Código ActionScript :

[Embed(
   source='nombre_fuente.ttf',
   fontName='Mi Fuente',
   mimeType='application/x-font',
   advancedAntiAliasing='true'
)]
var FontName:Class;


Un saludo.

Por Lukánicos

Claber

468 de clabLevel



Genero:Masculino  

chrome
Citar            
MensajeEscrito el 05 Ene 2011 08:15 pm
Eo.

Jeje, madre mía que pequeño es esto del internete al fin y al cabo no?

Jaja, creo que con mi anterior post te lié más que otra cosa con el stage y demás.En realidad no intentaba manipular el stage del swf cargado (ojala). Sólo le daba vueltas a una posible causa del problema. Olvídalo. Quedó descartado al ver que con algo tan simple como lo de arriba tampoco carga.

El error que me tira de discordancia de argumentos se origina en el swf QUE CARGA (por si acaso) y sólo cuando intento cargar un swf creado con documento de clase, entonces a parte del error de discordancia, el player hace cosas raras y entra en una especie de bucle en el que no acaba de hacer nada. Si lo que cargo es un swf creado en linea de tiempo, no me tira ningún error.

Esta claro que algo pasa o en la manera de cargar el swf (que ha de ser "especial" si se trata de un swf con documento de clase) o en el constructor del swf cargado (que ha de incluir "algo" que no sé), pero no consigo verlo. Tu has hecho esto alguna vez? quiero decir, es posible o estoy perdiendo el tiempo?.

Ante todo gracias por tu ayuda tío. Se agradece.

Salutens

Por teskostudio

34 de clabLevel



 

firefox
Citar            
MensajeEscrito el 16 Ene 2011 03:48 pm
Eo.

Solucione el tema. Lo dejo aquí por si alguien en un futuro se encuentra en mi situación.


El problema era que estaba utilizando el mismo nombre en los dos documentos de clase. Tanto el del swf que hacía de asset como el del swf que cargaba el otro tenian como nombre Main.as. Supongo que ese era el motivo por el que el player se comportaba de forma rara.

Ahora funciona perfecto con el truquelage de añadir un evento de escuha en el asset. Muchas gracias por la info. Mejor tarde que nunca jeje


Salutens!

Por teskostudio

34 de clabLevel



 

firefox
Citar            
MensajeEscrito el 29 Mar 2011 03:00 am
graciassss forooo me sacaron de un gran apurooooo!!!!

Por samir

1 de clabLevel



 

chrome
Citar            
MensajeEscrito el 27 Feb 2012 12:50 pm
Sé que el tema es de hace un año pero sólo entro para dar las gracias porque me estaba volviendo loca (tb llamaba Main a las dos clases documento). Gracias por dar la solución una vez has conseguido hacerlo funcionar

Por lore711

23 de clabLevel



 

chrome

 

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