Comunidad de diseño web y desarrollo en internet online

Problema carga swf externo con código

Citar            
MensajeEscrito el 30 Ene 2013 09:15 pm
Hola,

Estoy atascado con un pequeño problema. Cuando le doy al botón para cargar el swf externo, me salta el típico error deCannot access a property or method of a null object reference y bien, les voy a poner el código que es muy sencillo ya que lo hice para comprobar en que fallaba, pero no lo encuentro. Consta de 2 botones una escena donde coloco los swf externos y los dos swf contienen un cuadrado que lo coloco en pantalla por codigo, les coloco el código as de los tres swf. Espero haberme explicado lo mejor posible, como pueden comprobar he estado probando cosas haber que cual era el problema pero nada...

Código :

package  {
   
   import flash.display.*;
   import flash.net.*;
   import flash.events.*;
   import flash.system.*;
   import flash.geom.Rectangle;
   
   
   public class Prueba extends MovieClip
   {
      private var mi_cargador:Loader = new Loader();
      private var primero:URLRequest = new URLRequest("swf1.swf");
      private var segundo:URLRequest = new URLRequest("swf2.swf");
      private var contexth1:LoaderContext;
      private var contexth2:LoaderContext;
      private var appDomainh1:ApplicationDomain = ApplicationDomain.currentDomain; 
      private var appDomainh2:ApplicationDomain = new ApplicationDomain();
      private var C2:c2 = new c2;

      
      
      public function Prueba() 
      {
         var Boton:boton = new boton;
         stage.addChild(Boton);
         Boton.x = 25;
         Boton.y = 364;
         var B2:b2 = new b2;
         stage.addChild(B2);
         B2.x = 280;
         B2.y = 339;
         
         stage.addChild(C2);
         C2.x = 5;
         C2.y = 5;
         
         mi_cargador.load(primero);   
         mi_cargador.contentLoaderInfo.addEventListener(Event.COMPLETE, insertMovie);


         
         Boton.addEventListener(MouseEvent.CLICK, h1);
         B2.addEventListener(MouseEvent.CLICK, h2);
         
         }
      
      function insertMovie(evt:Event):void
      { 
         trace("carga completa");
         C2.addChild(mi_cargador);
   
      }
         
      private function h1(MouseEvent)
      {
         var contexth1 = new LoaderContext(false,appDomainh1);
         mi_cargador.unload();
         mi_cargador.load(primero, contexth1);
         
      }
      private function h2 ( MouseEvent)
      {
         var contexth2 = new LoaderContext(false,appDomainh2);
         mi_cargador.unload();
         mi_cargador.load(segundo, contexth2);   
         
      }
   }
   
}

Código :

package  {
   
   import flash.display.MovieClip;
   import flash.display.Sprite;
   import flash.system.ApplicationDomain;
   
   
   public class cswf1 extends MovieClip {
      
      
      public function cswf1()
      {
         var X1:x1 = new x1;
         stage.addChild(X1);
         X1.x = 25;
         X1.y = 25;
      }
   }
   
}

Código :

package  {
   
   import flash.display.MovieClip;
   
   
   public class swf2 extends MovieClip {
      
      
      public function swf2() 
      {
         var C1:c1 = new c1;
         stage.addChild(C1);
         C1.x = 25;
         C1.y = 25;
      }
   }
   
}

Por rubensa

3 de clabLevel



 

opera
Citar            
MensajeEscrito el 03 Feb 2013 01:02 pm
El problema puede deberse a que intenta cargar las clases de los swf cargados, y por eso da el Error??

Me refiero a este trozo var X1:x1 = new x1; y var C1:c1 = new c1;.

Alguien puede darme alguna pista?? El programa con el que trabajo es Adobe Flash Professional CS6 con el lenguaje AS3.

Gracias a Todos.

Por rubensa

3 de clabLevel



 

opera
Citar            
MensajeEscrito el 03 Feb 2013 06:28 pm

rubensa escribió:

El problema puede deberse a que intenta cargar las clases de los swf cargados, y por eso da el Error??

Me refiero a este trozo var X1:x1 = new x1; y var C1:c1 = new c1;.

Alguien puede darme alguna pista?? El programa con el que trabajo es Adobe Flash Professional CS6 con el lenguaje AS3.

Gracias a Todos.



cambia stage.addChild(C1);
por

this.addChild(C1);
y recuerda las clases con mayuscula, y los objetos con minuscula.

Por liryum

4 de clabLevel



 

chrome
Citar            
MensajeEscrito el 04 Feb 2013 09:34 am
BuenAS:

A parte de otros problemas como el que te han comentado, cuando accedes al stage es FUNDAMENTAL asegurarse de que la instancia se ha añadido al stage; si accedes al stage de una clase ANTES, te va a dar un error de objeto nulo.

En el constructor de la clase en la que vas a acceder al stage utiliza algo similar a esto:

Código ActionScript :

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

private function init(event:Event = null):void
{
   if (event)
      removeEventListener(Event.ADDED_TO_STAGE, init);
   
        //Aquí puedes acceder al stage
}


Y aunque no vayas a acceder al stage es buena práctica añadir este listener en la clase documento (la clase principal de tu aplicación).

Por otro lado, como también han comentado, sigue el convenio de llamar a las clases empezando por mayúcula, y las instancias, por minúscula. La gente está acostumbrada a leer una clase como MiClase, y la instancia como miClase, y le cuesta seguir un código cuando está escrito al revés, o de forma aleatoria ;)

Un saludo.

Por Lukánicos

Claber

468 de clabLevel



Genero:Masculino  

chrome
Citar            
MensajeEscrito el 04 Feb 2013 09:36 am
...he hecho un copy&paste de la primera clase que tenía a mano y se llamaba "UtilsSetting" :) , en tu caso este debe de ser el nombre de la clase (o sea, añade el listener en el constructor de la clase)

Por Lukánicos

Claber

468 de clabLevel



Genero:Masculino  

chrome
Citar            
MensajeEscrito el 06 Feb 2013 09:59 am
Gracias por los consejos. Soy nuebo en esto de la programación y todo lo que me digais me irá genial.
Hoy pongo en practica todo lo que me habeis comentado. Haber si soluciono este problemilla jeje.

Un saludo. Ruben.

Por rubensa

3 de clabLevel



 

opera
Citar            
MensajeEscrito el 06 Feb 2013 07:29 pm
Hola compañeros,

He estado probando lo que me habéis enseñado, y he corregido unos cuantos puntos que comentáis. Como lo de usar las mayúsculas y minúsculas en su debido momento.

Bien con toda mi concentración y empeño, coloqué donde creo que se debería colocar cada una de las cosas, y bueno aquí van los errores que me salen:

Estos errores me salen cuando inicio la aplicación, lo curioso es que me carga el swf.

ReferenceError: Error #1069: Property ADDED_TO_STAGE not found on flash.events.Event and there is no default value.
at cswf1/init()[C:\Users\Ruben\Documents\Curso app\Practicas\Prueba\cswf1.as:30]
at flash.display::DisplayObjectContainer/addChild()
at Prueba/insertMovie()[C:\Users\Ruben\Documents\Curso app\Practicas\Prueba\Prueba.as:47]

Este error me sale cuando pincho de nuevo en el botón que carga el swf1. Que curiosamente me carga el swf1, algo lento pero lo carga.

ReferenceError: Error #1069: Property ADDED_TO_STAGE not found on flash.events.Event and there is no default value.
at cswf1/init()[C:\Users\Ruben\Documents\Curso app\Practicas\Prueba\cswf1.as:30]

Este error es cuando pincho en el botón que carga el swf2. Que no me carga el swf2.

TypeError: Error #1009: Cannot access a property or method of a null object reference.
at swf2()[C:\Users\Ruben\Documents\Curso app\Practicas\Prueba\swf2.as:12]


En este último error puede ser debido a que el archivo .AS se llama igual que el archivo .FLA, por lo tanto igual que el .SWF??

Una última petición, porque en (private function init(event:Event = null):void) Colocamos el =null y el :void ??

Muchas gracias por la paciencia, y todos los conocimientos que me aportáis.

Aquí como deje todo el código de los tres archivos:

Código :

package 
{

   import flash.display.*;
   import flash.net.*;
   import flash.events.*;
   import flash.system.*;
   import flash.geom.Rectangle;


   public class Prueba extends MovieClip
   {
      private var mi_cargador:Loader = new Loader();
      private var primero:URLRequest = new URLRequest("swf1.swf");
      private var segundo:URLRequest = new URLRequest("swf2.swf");
      private var c2:C2 = new C2  ;



      public function Prueba()
      {
         var boton:Boton = new Boton  ;
         stage.addChild(boton);
         boton.x = 25;
         boton.y = 364;
         var b2:B2 = new B2  ;
         stage.addChild(b2);
         b2.x = 280;
         b2.y = 339;

         stage.addChild(c2);
         c2.x = 5;
         c2.y = 5;

         mi_cargador.load(primero);
         mi_cargador.contentLoaderInfo.addEventListener(Event.COMPLETE, insertMovie);
                                    //Listeners de los botones
         boton.addEventListener(MouseEvent.CLICK, h1);
         b2.addEventListener(MouseEvent.CLICK, h2);
      }
      function insertMovie(event:Event = null):void
      {
         trace("carga completa");
         c2.addChild(mi_cargador);
         if(Event)
         {
            mi_cargador.contentLoaderInfo.removeEventListener(Event.COMPLETE, insertMovie);
         }
      }
      private function h1(MouseEvent)
      {
         mi_cargador.unload();void
         mi_cargador.load(primero);
         mi_cargador.contentLoaderInfo.addEventListener(Event.COMPLETE, insertMovie);
      }
      private function h2( MouseEvent)
      {
         mi_cargador.unload();void
         mi_cargador.load(segundo);
         mi_cargador.contentLoaderInfo.addEventListener(Event.COMPLETE, insertMovie);
      }
   }
}

Código :

package  {
   import flash.display.*;
   import flash.events.*;
   public class cswf1 extends MovieClip 
   {
      public function cswf1()
      {
         if (stage)
         {      
            init();
         }
            else
         {
            addEventListener(Event.ADDED_TO_STAGE, init);
         }
      }
      private function init(Event = null):void
      {
         var x1:X1 = new X1;
         this.addChild(x1);
         x1.x = 25;
         x1.y = 25;
            if (Event)
         {
            removeEventListener(Event.ADDED_TO_STAGE, init);
         }
      }
   }   
}

Código :

package 
{
   import flash.display.*;
   import flash.events.*;
   public class swf2 extends MovieClip
   {
      public function swf2()
      {
         if (stage)
         {
            init();
         }
         else
         {
            addEventListener(Event.ADDED_TO_STAGE, init);
         }
      }
      private function init(event:Event = null):void
      {
         var c1:C1 = new C1  ;
         this.addChild(c1);
         c1.x = 25;
         c1.y = 25;
         if (Event)
         {
            removeEventListener(Event.ADDED_TO_STAGE, init);
         }
      }
   }
}


Disculpad mi ignorancia, y si me explico un poco mal.
Un saludo Ruben.

Por rubensa

3 de clabLevel



 

opera
Citar            
MensajeEscrito el 06 Feb 2013 08:09 pm
Siento escribir tan pronto, pero no puedo editar mi mensaje por lo tanto, debo dejarlo aquí, bien.

He cambiado el nombre del .AS del archivo swf2.fla, al apretar el segundo botón no me salta el error, pero no se carga nada y en las salidas me indica lo siguiente:

[SWF] swf2.swf - 2330 bytes tras la descompresión
[UnloadSWF] Prueba%20swf.swf
Prueba de película finalizada.


Entiendo que lo carga y seguido lo descarga, no entiendo como es que sucede esto.

Gracias y repito siento volver a escribir.

Por rubensa

3 de clabLevel



 

opera

 

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