Comunidad de diseño web y desarrollo en internet online

TypeError:Error #1009

Citar            
MensajeEscrito el 24 Sep 2009 07:04 am
Hola a todos,

estoy acabando un juego en AS3 y como soy nuevo programando de esta manera me ha surgido un problema que no he sido capaz de resolver y me tiene atascasdo, me explico:

Tengo estos ficheros
fichero.fla
Clase1.as (documento de clase)
Clase2.as

En Clase1 tengo este método

Código ActionScript :

      public function veteFinal() {
            // otras acciones 
            gotoAndStop("fin");
      }


Funciona perfectamente, ya que si lo llamo dentro de esa misma clase se ejecuta perfectamente. El problema surje cuando intento llamarlo desde Clase 2. He probado a hacerlo así

Código ActionScript :

MovieClip(root).veteFinal();

y tambien

Código ActionScript :

root.veteFinal();


y no consigo ejecutar ese método. Me jode por que es lo último que me falta para acabar este juego, que encima es mi primer proyecto completo en AS3, el error que me devuelve es este:

TypeError: Error #1009: No se puede acceder a una propiedad o a un método de una referencia a un objeto nulo.
at Clase2/metodoEjemplo();

Alguien sabe donde puede estar el error? por mas que lo intento no consigo lanzar ese método...

Por torpedete

85 de clabLevel



Genero:Masculino  

firefox
Citar            
MensajeEscrito el 24 Sep 2009 07:47 am
El error, lo que te está diciendo es que NO existe root.
root (igual que stage o que parent) SÓLO existe cuando se ha añadido un objeto a la "DisplayList".
Para ello tu Clase2 ha de:
1.-Extender de DisplayObject (o de alguna clase que extienda de DisplayObject como Sprite, MovieClip, Shape...)
2.-Haber hecho un addChild antes de llamar a esa función.

Si no extiende de DisplayObject, debemos, en el constructor, pasarle un argumento, que sea el stage. Vamos, que Clase2 será del estilo de

Código ActionScript :

package{
   public Class Clase2 {
          private var _root:MovieClip  //<---lo declaro aquí
                                        //lo llamo _root como podía llamarlo "porompompero"
          public function Clase2(mc:MovieClip){   //<--el constructor tiene un argumento de MovieClip -puede tener más
                 //igualamos la variable _root
                 _root=mc;
                ...resto de código....
          }
          //en alguna función o método que deseemos
          private function unMetodo(){
                //usamos _root
                 _root.veteFinal();
          }
    }
}

Claro que, cuando creamos un objeto de la Clase2 escribiremos, p.e.

Código ActionScript :

var clase2:Clase2=new Clase2(this)


Si extiende de DisplayObject, hemos dicho que no podemos usar root hasta que se haya añadido a la DisplayList. Normalmente dará ese error porque queremos usar root en la función Constructora. Lo que se suele hacer es que la Clase sea del estilo a

Código ActionScript :

package 
{
   import flash.display.Sprite;
   import flash.events.Event;
   public class Main extends Sprite  //<--o extends MovieClip o lo que quieras
   {
      public function Main():void 
      {
         if (stage) init();
         else addEventListener(Event.ADDED_TO_STAGE, init);
      }
      
      private function init(e:Event = null):void 
      {
         removeEventListener(Event.ADDED_TO_STAGE, init);
         // <----a partir de aquí ya podemos usar root, stage o parent---->
                       root.veteFinal()
      }
   }
}

Claro que no se empezará a ejecutar el "init" hasta que no lo añadamos a la displayList

Código ActionScript :

var clase2:Clase2=new Clase2(this)
addChild(clase2)


NOTA:La Clase de documento (tu Clase1) ha de extender NECESARIAMENTE de MovieClip

Código ActionScript :

package{
   public Class Clase1 extends MovieClip{
        ....
   }
}

Por Eliseo2

710 de clabLevel



 

firefox
Citar            
MensajeEscrito el 24 Sep 2009 11:22 am
Hola Eliseo,

lo he resuelto de la primera de las maneras que me dices, un todo va OK, muchísimas gracias, ya puedo dar por finiquitado mi primer proyecto AS3.

La putada es que no entiendo muy bien el porqué, ya que esa clase (Clase2) extiende MovieClip y he hecho un addChild dentro de la misma antes de llamar a esta última función que antes fallaba.

Bueno, voy a mirar un poco mas lentamente tu explicación a ver si me aclaro mejor, ya que viniendo de AS2 y de "la vieja escuela" de programación, todo lineal... esto de los "objetos" me descoloca un poco y creo que ando mas en "Programación Desorientada a Objetos" que en orientada a ellos :D

Lo dicho, muchísimas gracias por tu ayuda y a ver si poco a poco voy pillando esto, thanks!

Por torpedete

85 de clabLevel



Genero:Masculino  

firefox
Citar            
MensajeEscrito el 24 Sep 2009 11:55 am

torpedete escribió:

La putada es que no entiendo muy bien el porqué, ya que esa clase (Clase2) extiende MovieClip y he hecho un addChild dentro de la misma antes de llamar a esta última función que antes fallaba.


Observa que el error lo dá en el método "metodoEjemplo()", es ahí donde debes tener un "root" (o un "stage" o un "parent") y es esa función la que ejecutas antes de hacer el addChild. Si no es así, ya somos dos los que no entendemos nada :( (*)

(*)También existe la posibilidad de que no tenga nada que ver con root y que sea otro objeto el que sea null

Por Eliseo2

710 de clabLevel



 

firefox
Citar            
MensajeEscrito el 24 Sep 2009 12:28 pm
teóricamente hago el addChild antes de ejecutar ese método por primera vez...


Código ActionScript :

      public function Clase2(mc:MovieClip, mc2:MovieClip) {   
         //otras cosas sin importancia...
         var miMarcador:marcador=new marcador();//creo el objeto
         _parent.addChild(miMarcador); //aquí hago el addChild
         miMarcador.addEventListener(Event.ENTER_FRAME,metodoPrueba);//añado listener, aun no ha ejecutado
      }
      
      public function metodoPrueba(event:Event){
         //otras lineas de código
         _root.veteFinal();
      }
      }


El objeto que me daba null tenía que ser ese por cojones, por que cambiado eso, problema desaparecido, pero bueno, que tampoco te preocupes lo más mínimo. Esto es una situación puntual y lo que quiero es ir asentando las bases, ahora no me preocupa en exceso el no entender completamente donde está este problema. En cierto modo, si me vuelve a pasar lo mas probable es que sea por lo primero que me comentaste, y ya me has enseñado la manera de solventarlo :D

Así que una vez mas, muchas gracias por la ayuda :D

Por torpedete

85 de clabLevel



Genero:Masculino  

firefox
Citar            
MensajeEscrito el 05 Mar 2010 03:09 pm
Tuve un problema también con el Error #1009.
Tenia botones que había hecho previamente que funcionaran como MovieClip para que al ingresar a la página se animaran.
EN un frame inmediato los cambie para que funcionaran como Botones e hice cambios para que fueran sensibles al mouse cuando se ponia sobre el boton y cuando se presioba.

Usando el comando habitual para que me llevara a mi contenido de boton:

btn_1.addEventListener(MouseEvent.CLICK, on1Click);

function on1Click(e:MouseEvent):void
{
gotoAndPlay("contenido1");n
}

Sin embargo me aparecia el error.

Lo que hice fue cambiar cada contenido en Uo Over y Down, de Movie Clip a Graphik y problema resuelto.

Me había dejado los contenidos como MovieClip y de alguna forma por eso no funcionaba.

Ojala esto ayude a otros y ojalá se entendió, sino, me explico de nuevo.
Saludos

Por iimk

16 de clabLevel



 

msie7

 

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