Comunidad de diseño web y desarrollo en internet online

Addchild me da error

Citar            
MensajeEscrito el 01 Jul 2011 09:46 am
Buenas, pues eso, que intento desde un clase (Control) agregar otra clase (Smash, la que controla el juego), y me da el siguiente error:


No se puede acceder a una propiedad o a un método de una referencia a un objeto nulo.
at Smash()
at Control()

He probado de agregar otra clase (gameover), que no es mas que un movieclip con texto, y si que me lo agrega..

El codigo:

Código Flex :

package 
{
   import flash.display.MovieClip;
   
   
   public class Control extends MovieClip
   {
      public var smash:Smash;
      
      public function Control() 
      {
         smash = new Smash();
         addChild(smash);
      }
      
   }

}


Aunque el error sera por algo de la case Smash, lo que no se a que se refiere...

Por Phyronx

41 de clabLevel



 

chrome
Citar            
MensajeEscrito el 01 Jul 2011 01:11 pm
Smash extiende algun tipo de DisplayObject? sino, creo que no puedes agreagarlo como 'child'.

Por Acreonte

Claber

1543 de clabLevel

5 tutoriales
6 articulos

Genero:Masculino  

Digital Scientist

firefox
Citar            
MensajeEscrito el 01 Jul 2011 11:47 pm
Smash extiende a Moveclip...

Seguí este tutorial que por cierto os lo recomiendo:

http://inzomnia-bsas.blogspot.com/2009/10/aprender-as-30-desarrollando-un-juego.html

Y ahora estoy creando uno diferente pero siguiendo un poco los pasos, y en este hace lo mismo con una classe que extiende a movieclip tambien...

Os pongo la clase entera:

Código ActionScript :

public class Control extends MovieClip
   
   {
      public var smash:Smash;
         public var pantallaGameOver:PantallaGameOver;
      
      public function Control() 
      {
         smash = new Smash();
         smash.addEventListener( AvatarEvent.MUERTO, pjMuerto );
         addChild(smash);
      }
      
      public function pjMuerto(avatarEvent:AvatarEvent) {
         
         pantallaGameOver = new PantallaGameOver();
      
         pantallaGameOver.x = 0;
         pantallaGameOver.y = 0;
         addChild( pantallaGameOver );

        smash = null;
         
         
         }
         
         
         public function restartGame():void
{
        smash = new Smash();
        smash.addEventListener( AvatarEvent.MUERTO, pjMuerto);
        addChild( smash );

        pantallaGameOver = null;
}


El error entero 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 Smash()
at Control()

Asi que de la clase control, borre lo qe hay dentro del constructor, el new Smash... y entonces funciona, aunque sin la classe smash no hay nada...

Por Phyronx

41 de clabLevel



 

chrome
Citar            
MensajeEscrito el 02 Jul 2011 12:08 am
Acabo de probar de cambiar lo del contructor, por lo de la funcion pjMuerto, y pantallaGameOver tambien extiende a movieclip, pero asi si que funciona.. El error entonces es al cargar la classe Smash por algo mal que hay en esa clase,no?

Por Phyronx

41 de clabLevel



 

chrome
Citar            
MensajeEscrito el 03 Jul 2011 12:25 pm
Es posible. Puedes poner aca tu codigo de la clase Smash?

Por Acreonte

Claber

1543 de clabLevel

5 tutoriales
6 articulos

Genero:Masculino  

Digital Scientist

firefox
Citar            
MensajeEscrito el 03 Jul 2011 12:26 pm
He probado otra cosa:

En la classe Smash, lo he quyitado todo, e ido agregando cosas a ver cuando me daba el fallo, y resulta que es en estas lineas:


tiempo.addEventListener(TimerEvent.TIMER, mover);
stage.addEventListener( MouseEvent.CLICK, Disparar );
stage.addEventListener(KeyboardEvent.KEY_DOWN, prosionaTecla);
stage.addEventListener(KeyboardEvent.KEY_UP, liberaTecla);


Si quito las 3 ultimas, los listener del stage funciona (aunque claro no se mueve ).
Si creo una instancia de Smash, no puedo ponerle listeners al stage?

PD: Tambien puse los listener envez de en el stage, en el smash, que tiene un movieclip con el fondo y tal, y me da el mismo error...

PD2:
Esta vez cambe esto :

stage.addEventListener(KeyboardEvent.KEY_DOWN, prosionaTecla);

Por esto :

stage.addEventListener(AvatarEvent.MUERTO, prosionaTecla);

Y funciona.... Asi que decididamente el fallo es con los keyboardevent y el MouseEvent..

Alguien que me lo aclare por favor...

Por Phyronx

41 de clabLevel



 

chrome
Citar            
MensajeEscrito el 03 Jul 2011 12:32 pm
Te pongo todo el codigo del Smash como pedise, no sea que sea otra cosa. Es algo extenso y seguro que mal estructurado o algo ;)

Código ActionScript :

package
{
   import Armas.Pistola;
   import Monsters.Monstruo1;
   import flash.display.DisplayObject;
   import flash.display.MovieClip;
   import flash.events.TimerEvent;
   import flash.events.KeyboardEvent;
   import flash.geom.Point;
   import flash.utils.Timer;
   import flash.ui.Keyboard;
   import flash.events.MouseEvent;
   
   
   public class Smash extends MovieClip
   {
      public var pj:Pj;
      public var monstruo1:Monstruo1;
      public var smash:Smash;
      
      static const balaVel:Point = new Point(0, 0);
      public var balas:Array;
      
      public var tiempo:Timer;
      
      var pressArriba:Boolean=false;
      var pressAbajo:Boolean=false;
      var pressIzquierda:Boolean=false;
      var pressDerecha:Boolean=false;
      var velocidad:int = 2;
      
      
      public function Smash() 
      {
         pj = new Pj();
         addChild (pj);
                  
         monstruo1 = new Monstruo1();
         addChild(monstruo1);
         
         tiempo = new Timer(25);
         tiempo.start();
         
         tiempo.addEventListener(TimerEvent.TIMER, mover);
         smash.addEventListener( MouseEvent.CLICK, Disparar );
         smash.addEventListener(KeyboardEvent.KEY_DOWN, prosionaTecla); 
         smash.addEventListener(AvatarEvent.MUERTO, liberaTecla);
         
         
         balas = new Array();
      }
      
      
      public function Disparar( mouseEvent:MouseEvent ):void 
         {
           var a1 = mouseY - pj.y;
      var b1 = mouseX - pj.x;
      
      
      var Bala = new Pistola(a1,b1);
      Bala.x = pj.x;
      Bala.y = pj.y;
      Bala.rotation = pj.rotation;
            
      balas.push( Bala );
      addChild(Bala);
      
          }
          
          public function prosionaTecla (Tecla:KeyboardEvent):void {
         
         switch(Tecla.keyCode) {
            
            case 65 :pressIzquierda = true; pj.play();   break;
            case 87 :pressArriba=true;pj.play();break;
            case 68 :pressDerecha=true;pj.play();break;
            case 83 :pressAbajo=true;pj.play();break;
            }
      }
      
      
      public function liberaTecla(Tecla:KeyboardEvent) {
                     
                  
         switch (Tecla.keyCode) {
            
            case 65 :pressIzquierda = false;pj.stop();break;
            case 87 :pressArriba=false;pj.stop();break;
            case 68 :pressDerecha=false;pj.stop();break;
            case 83 :pressAbajo=false;pj.stop();break;
         }
                  }
                  function mover(e:TimerEvent) {
             
         pj.rotation = Math.atan2(mouseY - pj.y, mouseX - pj.x) * 180 / (Math.PI) + 90;

                          
   if ( pj.hitTestObject( monstruo1 ) ) 
{
   tiempo.stop();
   dispatchEvent( new AvatarEvent( AvatarEvent.MUERTO ) );
   
   }
   
      
         
      if (monstruo1){monstruo1.moverMonstruo();}
         trace (monstruo1.x);
          for each (var  Bala:Pistola in balas ) 
        {
         if ( Bala.hitTestObject( monstruo1 ) )
         {
            
            removeChild(monstruo1);
            
            }
              Bala.moverbala ();
            
                      }
             
            if (pressAbajo == true) {
               
                  pj.y+=velocidad;
            }

            if (pressArriba==true) {

                  pj.y -= velocidad;

}
            if (pressIzquierda==true) {

                  pj.x-=velocidad;
}
            if (pressDerecha==true) {

                  pj.x+=velocidad;
}
         }
   }


}

Por Phyronx

41 de clabLevel



 

chrome
Citar            
MensajeEscrito el 03 Jul 2011 12:38 pm
Instanciar la clase dentro de la misma clase no es necesario.

Código ActionScript :

public var smash:Smash; 

No tiene sentido.
Por ende, lo siguiente no tiene sentido:

Código ActionScript :

smash.addEventListener( MouseEvent.CLICK, Disparar ); 
smash.addEventListener(KeyboardEvent.KEY_DOWN, prosionaTecla);  
smash.addEventListener(AvatarEvent.MUERTO, liberaTecla); 


Ya que estas en Smash, agrega los listeners directamente:

Código ActionScript :

addEventListener( MouseEvent.CLICK, Disparar ); 
addEventListener(KeyboardEvent.KEY_DOWN, prosionaTecla);  
addEventListener(AvatarEvent.MUERTO, liberaTecla); 

Quiza te ayude.

Por Acreonte

Claber

1543 de clabLevel

5 tutoriales
6 articulos

Genero:Masculino  

Digital Scientist

firefox
Citar            
MensajeEscrito el 03 Jul 2011 12:50 pm
Gracias por responder Acreonte.

Lo del smash:Smash, era residuo de antes de que creara la clase control..

Hice lo que me dijiste, quitarlo y poner los listener directamente:

Código ActionScript :

tiempo.addEventListener(TimerEvent.TIMER, mover);
         addEventListener( MouseEvent.CLICK, Disparar );
         addEventListener(KeyboardEvent.KEY_DOWN, prosionaTecla); 
         addEventListener(KeyboardEvent.KEY_UP, liberaTecla);


Ahora no me da el error, pero no funciona ni el mouseevent ni los keyboardevents, vamos que ni dispara si se mueve ;)

Por Phyronx

41 de clabLevel



 

chrome
Citar            
MensajeEscrito el 03 Jul 2011 01:03 pm
oh, ok. El KeyboardEvent es mejor si lo esta detectando el stage:

Código ActionScript :

stage.addEventListener(KeyboardEvent.KEY_DOWN, prosionaTecla);


Disparar, como es un 'CLICK', va en un boton o en algo que haces click con tu raton. No se si Smash es un objeto que funciona como boton, sino es asi, es mejor usa el evento MOUSE_DOWN quiza agregandolo al stage tambien.

Código ActionScript :

stage.addEventListener( MouseEvent.MOUSE_DOWN, Disparar ); 

Asi, cuando hagas click en cualquier parte del escenario, disparar se va a reproducir.

Y, parece que tecla liberada fuese mejor si tambien se agrega al stage

Código ActionScript :

stage.addEventListener(AvatarEvent.MUERTO, liberaTecla);


Cuentanos como te va

Por Acreonte

Claber

1543 de clabLevel

5 tutoriales
6 articulos

Genero:Masculino  

Digital Scientist

firefox
Citar            
MensajeEscrito el 03 Jul 2011 01:24 pm
Smash es la clase del escenario, es un movieclip.

Hice lo que medijiste.
El mouse Down bien,

Pero lo de stage.addEventListener nada.
Me devuelve al error principal:

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

Probé de de ponerlo solo en el listener del mouse, haber si cambiaba lago, y igual.

Por Phyronx

41 de clabLevel



 

chrome
Citar            
MensajeEscrito el 04 Jul 2011 12:51 pm
Vamos a ver...

He conseguido que dispare, osea que funcione el:

addEventListener(MouseEvent.MOUSE_DOWN, Disparar);

Como?? Haciendo funcionar un poco las neuronas, no te rias... El movieclip del Smash, osea el dibujo de la pantalla, resuta que lo hice mal.. ya que dibuje las paredes, alguna linea pero el suelo en si no.. asi que al pulsar en la pared disparaba... solucion poner suelo.. Tonto que soy.. :twisted:

Ahora bien, los:

addEventListener(KeyboardEvent.KEY_DOWN, presionaTecla);
addEventListener(KeyboardEvent.KEY_UP, liberaTecla);

No funcionan... No me da error...

Por Phyronx

41 de clabLevel



 

chrome
Citar            
MensajeEscrito el 04 Jul 2011 08:56 pm
Y si importas Stage?

Código ActionScript :

import flash.display.Stage;

Por Acreonte

Claber

1543 de clabLevel

5 tutoriales
6 articulos

Genero:Masculino  

Digital Scientist

firefox
Citar            
MensajeEscrito el 04 Jul 2011 09:13 pm
ya lo probe tambien

Por Phyronx

41 de clabLevel



 

chrome
Citar            
MensajeEscrito el 04 Jul 2011 09:16 pm
Esto no tiene sentido:

Código ActionScript :

if ( pj.hitTestObject( monstruo1 ) )  
{ 
   tiempo.stop(); 
   dispatchEvent( new AvatarEvent( AvatarEvent.MUERTO ) ); 
    
   } 

Para que disparar un evento que solo sera escuchado en la misma clase?
Mejor llama directamente la funcion que tienes en el listener:

Código ActionScript :

if ( pj.hitTestObject( monstruo1 ) )  
{ 
   tiempo.stop(); 
   liberaTecla();    
} 

liberaTecla no necesita el parametro 'Tecla' ya que no hay evento que la llame.

Por Acreonte

Claber

1543 de clabLevel

5 tutoriales
6 articulos

Genero:Masculino  

Digital Scientist

firefox
Citar            
MensajeEscrito el 04 Jul 2011 09:24 pm
Esto de disparar el evento lo saque de el tutorial donde empece a aprender..
Lo que hace es al chocar, cargar la pantalla de game over.
Si solo libero tecla, se queda el muñeco parado pero nada mas.. Creo que no te he entendido.

Por Phyronx

41 de clabLevel



 

chrome

 

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