locked
Colisión entre Dos objetos. RRS feed

  • Pregunta

  • Hola, estoy incursionando en algunos aspectos de XNA y me he encontrado con un problemilla. 

    Tengo dos objetos que rebotan exitosamente contra los limites de la ventana, ahora quiero que si colicionan entre ellos reboten..., para esto estoy usando la clase BoundingBox, la cual me dio resultado.

    No se como hacer que cambien la trayectoria que llevan.

     else if (bb_Malo.Intersects(bb_Sprite)) //bb_Malo es el BoundingBox del objeto Uno mientras que bb_Sprite es el del Dos.

                {

                    //Aqui es donde no se como Calcular el cambio de trayectoria.                

                }

    lunes, 26 de septiembre de 2011 13:50

Respuestas

Todas las respuestas

  • Mmm, es simple, pero para poder ayudarte me vendria bien que pongas el code que usas para el movimiento.

    lunes, 26 de septiembre de 2011 19:04
  • Aqui lo mando, Gracias !

    if (maloPosition.X > MaxiX)

                {

                    maloSpeed.X *= -1;

                    maloPosition.X = MaxiX;

                }

     

                else if (maloPosition.X < MiniX)

                {

                    maloSpeed.X *= -1;

                    maloPosition.X = MiniX;

                }

     

                if (maloPosition.Y > MaxiY)

                {

                    maloSpeed.Y *= -1;

                    maloPosition.Y = MaxiY;

                }

     

                else if (maloPosition.Y < MiniY)

                {

                    maloSpeed.Y *= -1;

                    maloPosition.Y = MiniY;

                }

                if (bb_Malo.Intersects(bb_Sprite))

                {

                    //                

                }

    lunes, 26 de septiembre de 2011 19:54
  • Mira, te conviene guardar las direcciones de los sprites en un Enum. Si trabajas con clases, creas un enum en la clase del sprite que queres mover con las direcciones posibles (N,S,E,O,SE,SO,NE,NW son las mas comunes para lo que queres hacer va perfecto) y despues checkear. ahora pongo un ejemplo.

     

    enum Direcciones
    {
    Norte,
    Sur,
    Este,
    Oeste,
    Noreste,
    Sudeste,
    Noroeste,
    Sudoeste
    }
    public class Malo
    {
    Vector2 Position;
    Texture2D Imagen;
    BoundingBox Colision;
    Direcciones DireccionMalo;
    float Velocidad;
    
    public Malo(Vector2 _Posicion,BoundingBox _Colision,Texture2D _Imagen)
    {
    this.Position=_Posicion;//La posicion del objeto
    this.Colision=_Colision;//El bounding box que te permita checkear colision
    this.Imagen=_Imagen;//El sprite a mover
    this.DireccionMalo=Norte;//Fija una posicion inicial
    }
    
    private void MoverDerecha(float _Cantidad)
    {
    this.Position.X+=_Cantidad;
    }
    private void MoverIzquierda(float _Cantidad)
    {
    this.Position.X-=_Cantidad;
    }
    private void MoverArriba(float _Cantidad)
    {
    this.Position.Y-=_Cantidad;
    }
    private void MoverAbajo(float _Cantidad)
    {
    this.Position.Y+=_Cantidad;
    }
    
    public void Actualizar()
    {
    switch DireccionMalo
    {
    case Norte:
      MoverArriba(this.Velocidad);
      break;
    case Sur:
      MoverAbajo(this.Velocidad);
      break;
    case Este:
      MoverDerecha(this.Velocidad);
      break;
    case Oeste:
      MoverIzquierda(this.Velocidad);
      break;
    case Sudeste:
      MoverDerecha(this.Velocidad/2);
      MoverAbajo(this.Velocidad/2);
      break;
    case Sudoeste:
      MoverIzquierda(this.Velocidad/2);
      MoverAbajo(this.Velocidad/2);
      break;
    case Noroeste:
      MoverArriba(this.Velocidad/2);
      MoverIzquierda(this.velocidad/2);
      break;
    case Noreste:
      MoverArriba(this.Velocidad/2);
      MoverDerecha(this.Velocidad/2);
      break;
    }
    }
    }
    }
    

     


    Entonces a la hora de checkear colisiones lo haces asi:

    If(Malo.Colision.Intersects(sprite)){
    
    <pre>  switch Malo.DireccionMalo
    {
    case Norte:
      Malo.DireccionMalo=Sur;
      break;
    case Sur:
      Malo.DireccionMalo=Norte;
      break;
    case Este:
      Malo.DireccionMalo=Oeste;
      break;
    case Oeste:
      Malo.DireccionMalo=Este;
      break;
    case Sudeste:
      Malo.DireccionMalo=Sudoeste;
      break;
    case Sudoeste:
      Malo.DireccionMalo=Sudeste;
      break;
    case Noroeste:
      Malo.DireccionMalo=Noreste;
      break;
    case Noreste:
      Malo.DireccionMalo=Noroeste;
      break;
    }
    }
    

    martes, 27 de septiembre de 2011 12:41
  • Hola, por si aún no lo has resuelto puedes ver el siguiente ejemplo donde rebotan pelotas usando el BoundingBox: http://escarbandocodigo.wordpress.com/2010/03/15/colisiones-xna-usando-boundingbox-%E2%80%93-rebotando-pelotas/, para cambiarles la dirección se multiplica la velocidad por -1 a cada pelota que ha colisionado.
    Martin Reina http://escarbandocodigo.wordpress.com/
    miércoles, 28 de septiembre de 2011 15:44