Comunidad de diseño web y desarrollo en internet online

Detectar coliciones¿?

Citar            
MensajeEscrito el 23 Abr 2011 05:35 pm
Bueno sigo con problemas en la minoración de AS 2.0 a AS 3.0 ahora el problema es detectar colisiones, en lo que va del juego tengo una clase Motor que se encarga de colocar los M.Cs en
su lugar, hasta ahora ahy 2 M.Cs uno "Player" y otro "Ground" los dos son creados con addChild
esta es la clase:

Código ActionScript :

package scriptgame.motor{
   
   //Importacion de paquetes nesesarios
   import flash.display.MovieClip;
   import flash.display.Stage;
   import flash.events.Event;
   import scriptgame.util.KeyObject
   import flash.events.MouseEvent
   /********************************************/
   
   public class Motor extends MovieClip{
//   DECLARACION DE VARIABLES

   public var newPlay:Player;
   public var id:Number
   public var gr_lv1:Ground =new Ground(0,stage.height);

//FUNCION CONSTRUCTORA

   public function Motor ():void
   {
      
   
   
   
btn.addEventListener(MouseEvent.CLICK,escenario_On);


   }

   private function agregarPlayer():void

   {   
      newPlay=new Player(stage);   id++
      stage.addChild(newPlay);
      
   }   
   public function escenario_On(Evento:Event)
   {
      
   //addChild(gr_lv1);
   agregarPlayer();
   btn.visible=false;
   }
      
      
      }//End Class
   }//End package

el problema es que cuando trato de refirme a gr_lv1(Ground) me dice que estoy tratando de acceder a una propiedad no definida, no se supone que al haberle dicho que la var es publica puedo tener acceso desde fuera de la clase? ahora también probé poniendo directamente a ground en el escenario y llamándolo gr_lv1, pero teniendo el mismo problema,
entonces ¿como seria para comunicar mis mc mediante el uso de clases?
Agradesco cualquier sugerencia ya que llevo varios dias trancado con esto.
Saluda att.Maxxx

Por MaxiiSan20

Claber

168 de clabLevel



Genero:Masculino  

Montevideo

firefox
Citar            
MensajeEscrito el 23 Abr 2011 09:05 pm

MaxiiSan20 escribió:

migración de AS 2.0 a AS 3.0

Por MaxiiSan20

Claber

168 de clabLevel



Genero:Masculino  

Montevideo

firefox
Citar            
MensajeEscrito el 23 Abr 2011 11:08 pm
mmm el problema va por que no tienes definido stage o algun otro elemento no esta en la display list, debes usar el evento addToStage para acceder al stage, aclaracion que tenga una propiedad publica no se logra la mejor relacion entre las clases ,,para comunicar clases ocupas eventos, y mas en la creacion de un video juego donde los eventos se disparan en cada momento,,una colision..pasos de nivel..etc.

Jonathan

Por maneuver

243 de clabLevel



Genero:Masculino  

Mexico City

firefox
Citar            
MensajeEscrito el 24 Abr 2011 12:30 am
gracias Jonathan, si pudieras agregar mas información o poner algún ejemplo practico te lo agradecería ya que estoy bastante mareado con AS 3, y comprendo lo que dices pero no logro ponerlo en practica, gracias.

Por MaxiiSan20

Claber

168 de clabLevel



Genero:Masculino  

Montevideo

firefox
Citar            
MensajeEscrito el 24 Abr 2011 01:10 am
El error parece ser que viene desde esta linea

Código ActionScript :

public var gr_lv1:Ground =new Ground(0,stage.height);


la clase ground recibe como parametro el alto del escenario pero este aun no esta listo como para obtener el height por lo tanto debes escuchar el evento addedToStage de la clase Motor para que tengas el stage dispoible, ejemplo ;

Código ActionScript :

package  {
   import flash.display.MovieClip;
   import flash.events.Event;
   
   public class Motor extends MovieClip {
      
      /*declaramos nada mas la propiedad que en 
      este caso sera un objeto de la clase Ground*/
      public var gr_lv1:Ground;
      
      public function Motor() {
         // constructor code
         
         //trace(stage.width); tirar error porque stage no esta disponible
         
         this.addEventListener(Event.ADDED_TO_STAGE, init);
      }
      
      private function init(e:Event):void {
         trace("Event :" , e.type , "Stage :" , stage);
         /*funciona por que el motor esta en la display list
         instancias y ahora si le pasaras un valor existente, en este caso un int con el 
         tamaño del stage*/
         gr_lv1 = new Ground(0,stage.stageHeight);
      }

   }
   
}



ahora en tu clase principal o Main instancia al motor y accedes al objeto ground

Código ActionScript :

var motor:Motor = new Motor();
addChild(motor);

trace(motor.gr_lv1)


output

Código :

Event : addedToStage Stage : [object Stage]
[object Ground]


pff haver si no te enrede más..para lo de comunicar clases hay un tutorial del uso de los eventos para comunicarlas.

Jonathan

Por maneuver

243 de clabLevel



Genero:Masculino  

Mexico City

firefox
Citar            
MensajeEscrito el 24 Abr 2011 02:09 am
Gracias por responder tan rapido pero mi problema no es crearlo si no aceder a el mira,
cuando intento hacer uso de hitTest por ej desde la clase player ahi es donde me tira el error,
capas que me di a entender mal

Código ActionScript :


package scriptgame.motor{
   
   import scriptgame.util.KeyObject
   import flash.ui.Keyboard;
   import flash.display.MovieClip;
   import flash.display.Stage;
   import flash.display.DisplayObject;
   import flash.events.Event;
   import flash.events.KeyboardEvent;
   import flash.events.MouseEvent
   
public class Player extends MovieClip
   {
      
      private var stageRef:Stage;
      private var key:KeyObject;
      private var friccion:Number=0.99
      private var yspeed:Number=0
      private var grav:Number =0.3   
      
      
      public function Player(stageRef:Stage) 
      {   
         this.x = 200
         this.y = 150
         this.width = 20
         this.height = 56
         this.stageRef = stageRef;
         key = new KeyObject(stageRef);
         var mirar =this.scaleX
         addEventListener(Event.ENTER_FRAME, mover, false, 0, true);
         addEventListener(Event.ENTER_FRAME, gravedad, false, 0, true);
      }
      
      public function mover(e:Event) : void
      {
         if (key.isDown(Keyboard.LEFT)) 
         this.play(), x -= 2   
         else if (key.isDown(Keyboard.RIGHT))
            this.play(), x += 2;
         
         
      }
      
      public function gravedad(evento:Event)
      {
            if( this.hitTestObject( gr_lv1 )) {y=0}      
            else{   yspeed += grav;   y += yspeed   ;  }
      }
                  
   }//End Class
}//End package



El problema es cuando intento pasarle al hitTest como parametro gr_lv1 me dice
1120: Acceso a una propiedad gr_lv1 no definida.

Por MaxiiSan20

Claber

168 de clabLevel



Genero:Masculino  

Montevideo

firefox
Citar            
MensajeEscrito el 24 Abr 2011 02:12 am
y esta es la clase Ground

Código ActionScript :

package scriptgame.motor{
   
   //Importacion de paquetes nesesarios
   import flash.display.MovieClip;
   import flash.display.Stage;
   import flash.events.Event;
   
   public class Ground extends MovieClip{
      
   public function Ground(a,b)
   {
      this.x=a
      this.y=b-this.height+36
      }
   

   }//End class
}//End package

Por MaxiiSan20

Claber

168 de clabLevel



Genero:Masculino  

Montevideo

firefox
Citar            
MensajeEscrito el 24 Abr 2011 04:06 am
...quieres encapsular todo en player..algunos comportamientos deberian de hacerlos la clase Motor..pero el problema radica en que este objeto ground no tiene referencia en la clase Player asi como le pasas la referencia del Stage en el constructor pasa la referencia del objeto ground.

PD. por performance usa un solo ENTER_FRAME.

Jonathan

Por maneuver

243 de clabLevel



Genero:Masculino  

Mexico City

firefox
Citar            
MensajeEscrito el 24 Abr 2011 04:37 am
En realidad quiero que en la clase player estén encapsuladas todas las acciones del player..
perdona mi ignorancia pero exactamente como le pasaría la referencia?
gracias nuevamente

Por MaxiiSan20

Claber

168 de clabLevel



Genero:Masculino  

Montevideo

firefox
Citar            
MensajeEscrito el 24 Abr 2011 02:32 pm
puedes usar el mismo constructor de la clase Player o usar un get/set de una propiedad de la clase player ejemplo :

Código ActionScript :

package  {
   import flash.display.MovieClip;
   import flash.display.Stage;
   import flash.events.Event;
   
   public class Player extends MovieClip {
      
      private var $__stage:Stage;
      private var $__ground:Ground;
      
      public function Player($stage:Stage,$ground:Ground) {
         // constructor code
         $__stage = $stage;
         $__ground = $ground;
         
         initPlayer();
         
      }
      
      function initPlayer():void
      {
         trace("do something");
      }
      
      public function set ground(value:Ground):void
      {
         $__ground = value;
         initPlayer();
      }
      
      public function get ground():Ground
      {
         return this.$__ground;
      }
      

   }
   
}

y en la clase Motor

Código ActionScript :

private function init(e:Event):void {
         trace("Event :" , e.type , "Stage :" , stage);
         /*funciona por que el motor esta en la display list
         instancias y ahora si le pasaras un valor existente, en este caso un int con el 
         tamaño del stage*/
         gr_lv1 = new Ground(0,stage.stageHeight);
         //como parametro
         player = new Player(stage,gr_lv1);
         //player.ground = gr_lv1;  o atravez de un get/set 
      }


amigo estas creando un juego y aun no sabes esto..creo que debes empezar por cosas mas sencillas,aprender las bases de la OOP etc.

Jonathan

Por maneuver

243 de clabLevel



Genero:Masculino  

Mexico City

firefox
Citar            
MensajeEscrito el 24 Abr 2011 11:46 pm
Gracias con esto se me aclaro bastante.
Realmente no encuentro mejor forma de aprender que practicando (ensayo y error) y que mejor modo que un videojuego.
Gracias por tu ayuda dejo el código del player con la gravedad y hitTesting

Código ActionScript :

package scriptgame.motor{
   
   import scriptgame.util.KeyObject
   import flash.ui.Keyboard;
   import flash.display.MovieClip;
   import flash.display.Stage;
   import flash.display.DisplayObject;
   import flash.display.Stage
   import flash.events.Event;
   import flash.events.KeyboardEvent;
   import flash.events.MouseEvent
   
public class Player extends MovieClip
   {
      private var friccion:Number=0.99
      private var yspeed:Number=0
      private var grav:Number =0.3   
      
      private var stageRef:Stage;
      private var key:KeyObject;
      private var $ground=Ground
      private var gr_lv1
      private var newPlay= this
      
            
      public function Player(stageRef:Stage,$_ground) 
      {   
         $ground = $_ground
      
         this.x = 200
         this.y = 150
         this.width = 20
         this.height = 56
         this.stageRef = stageRef;
         key = new KeyObject(stageRef);
         
         
         addEventListener(Event.ENTER_FRAME, mover, false, 0, true);
         addEventListener(Event.ENTER_FRAME, gravedad, false, 0, true);
         
      }
      
      public function mover(e:Event) : void
      {
         if (key.isDown(Keyboard.LEFT)) 
             x -= 2   
         else if (key.isDown(Keyboard.RIGHT))
             x += 2;
            
      }
      
      public function gravedad(evento:Event)
      {
         gr_lv1= $ground
         
         if( this.hitTestObject( gr_lv1)){y-=0}   
         
         else{yspeed += grav; newPlay.y += yspeed;  }
      
      }
                                                         
   }//End Class
}//End package

Por MaxiiSan20

Claber

168 de clabLevel



Genero:Masculino  

Montevideo

firefox
Citar            
MensajeEscrito el 25 Abr 2011 06:15 pm
.pff tu clase parece una ensalada..la pregunta seria ya funciona ?..

Jonathan

Por maneuver

243 de clabLevel



Genero:Masculino  

Mexico City

firefox
Citar            
MensajeEscrito el 27 Abr 2011 02:01 am
sii funca.. bueno todavia me estoy acoplando a esto de usar clases realmente se me dificulta mucho, gracias por tu sugerencia realmente me me sirvió de mucho aprender los de las referencias

Por MaxiiSan20

Claber

168 de clabLevel



Genero:Masculino  

Montevideo

firefox
Citar            
MensajeEscrito el 27 Abr 2011 02:06 am
si ahí parecía ensalada ahora que parecerá...
acá dejo un link con el el super Game XD
[url] http://maxiwork.comoj.com//flash_games/Game.swf [/url]

Código ActionScript :

package scriptgame.motor{
   
   import scriptgame.util.KeyObject
   import flash.ui.Keyboard;
   import flash.display.MovieClip;
   import flash.display.Stage;
   import flash.display.DisplayObject;
   import flash.display.Stage
   import flash.events.Event;
   import flash.events.KeyboardEvent;
   import flash.events.MouseEvent
    import flash.events.TimerEvent;
    import flash.utils.Timer;

 
   
public class Player extends MovieClip
   {
      private var friccion:Number=0.63
      private var yspeed:Number=0
      private var grav:Number =0.4
      private var salto:Number= 12
      private var tsalto=0
      
      public var ptBajo:Number=height/2
      public var ptAlto:Number=-height/2
      public var ptIzq:Number=-width/2
      public var ptDer:Number=width/2
      
      private var dx
      private var dy
      private var vel:Number = 2
      private var maxvel:Number = 28
      private var stageRef:Stage;
      private var key:KeyObject;
      private var $ground=Ground
      private var gr_lv1
      private var newPlay= this
      private var newShot:Shot
      private var mirar:Number
      
      
      
      
      public function Player(stageRef:Stage,$_ground) 
      {   
         $ground = $_ground
      
         this.x = 200
         this.y = 150
         this.stop();
         this.stageRef = stageRef;
         key = new KeyObject(stageRef);
          var tiempo:Timer= new Timer(1,0)
         
         addEventListener(Event.ENTER_FRAME, mover, false, 0, true);
          tiempo.addEventListener(TimerEvent.TIMER,chkContact )
          tiempo.start();
         
      }
      
      public function mover(e:Event) : void
      {
         if (key.isDown(Keyboard.LEFT)) 
             this.dx -= this.vel,this.gotoAndStop(2),this.scaleX=-1,mirar=1   
         else if (key.isDown(Keyboard.RIGHT))
             this.dx += this.vel,this.gotoAndStop(2),this.scaleX= 1,mirar=0   
         else if (key.isDown(Keyboard.UP))
            { y -= salto, tsalto++}
         else if (key.isDown(Keyboard.DOWN))
            { this.gotoAndStop(3)}
         
         else if (key.isDown(Keyboard.CONTROL))
            { 
            newShot=new Shot(this.x,this.y,mirar)
            stage.addChild(newShot)
            }
            
      else if (!key.isDown(Keyboard.LEFT)) this.gotoAndStop(1),this.scaleX=1   
      //
      else if (tsalto >= 2)(salto=0)    
      
      gravedad();
      iniPlay(this)
      movesOn()
      }
      
      public function gravedad()
      {
         gr_lv1= $ground
         
          if( gr_lv1.hitTestPoint (this.x,this.y+25,true))
          {
             y-=0,yspeed=0
          }   
         
      else {yspeed += grav; newPlay.y += yspeed;}
      }
      
      private function iniPlay(mc):void
      {
      if (mc.dx==undefined){mc.dx=0,mc.dy=0}
      }
      
      public function movesOn():void
      {
         this.x+=this.dx;
         this.dx*=this.friccion;
         this.y+=this.dy; 
         if (this.dx > maxvel)this.dx=maxvel
         else if (this.dx<-maxvel)this.dx=-maxvel
      }
      
      public function chkContact(evento:TimerEvent)
      {
         
         if (gr_lv1.hitTestPoint(this.x,this.y+ptBajo,true))
         this.y--  ,this.dy =0 ;
         if (gr_lv1.hitTestPoint(this.x,this.y+ptAlto,true))
         this.y++  , this.dy =Math.abs(this.dy)
         
         //Colicion en lado Izq
         if (gr_lv1.hitTestPoint(this.x+ptIzq,this.y,true))
         this.x++  , this.dx =0
         if (gr_lv1.hitTestPoint(this.x+ptIzq,this.y+ptBajo/3,true))
         this.x++  , this.dx =0
         //Colicion en lado Derecho
         if (gr_lv1.hitTestPoint(this.x+ptDer,this.y,true))
         this.x--  , this.dx =0
         if (gr_lv1.hitTestPoint(this.x+ptDer,this.y+ptBajo/3,true))
         this.x--  , this.dx =0      
      }
                                                                  
   }//End Class
}//End package

Por MaxiiSan20

Claber

168 de clabLevel



Genero:Masculino  

Montevideo

firefox

 

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