Inicio > Games, Tips, XNA > [Tips – XNA] Detección de Colisones

[Tips – XNA] Detección de Colisones

Aquí vamos hacer uso de un par te rectángulos, que junto con la propiedad de intersección se encargara de la intersección, es decir; el rectángulo de un automóvil con el de otro, que en mi caso se trata del camaro y de los otros coches, bien, aquí necesitaremos de cargar otro Sprite, de realizar un método llamado MueveOtros Atuos(), de la colisión y por ultimo de dibujar dichos otros autos. Entonces primero declaramos las variables a utilizar que son las siguientes:

//varibales de los autos
        Texture2D[] Coches = new Texture2D[2];
        Vector2[] posCoches = new Vector2[2];

        //donde apareceran los autos en el eje X y en Y
        int[] posX = { 270, 428 };
        int posAleatoria;

        //varibale para determinar la posicion aleatoria
        Random ran = new Random();
        //recatngulo de los otros coches
        Rectangle[] recCoches = new Rectangle[2];
        
        //variable bool de detección de colision
        bool deteccionActiva = true;

        //velocidad de los coches
        int velCoches = 3;

Como se observa, aquí son mas variables, pero de igual manera se indica para que nos sirven cada una de ellas, ahora el paso siguiente es la carga del Sprite de los otros autos, como se observa en la declaración de la textura y del vector se trata de un arreglo y en este caso es para 2 valores, bien entonces el Sprite que se llama “carros” que está en la carpeta Content lo cargamos en el método protected override void LoadContent() dentro de un for, y queda así:

//carga del sprite de los otros autos
            for (int i = 0; i < 2; i++)
            {
                //carga de los sprites
                Coches[i] = Content.Load<Texture2D>("carros");
                //posicion aleatoria en Y
                posAleatoria = ran.Next(-1000, 0);
                posCoches[i].Y = posAleatoria;
                //posicion en X, solo 2 valores
                //del lado der o izq del camino
                posAleatoria = ran.Next(0, 2);
                posCoches[i].X = posX[posAleatoria];
                

            }

Como con los otros ejemplos, ahora sigue trabajar con el método Update(), que es aquí en donde llamamos al método MoverOtrosAutos(), que como su nombre lo dice se utiliza la lógica para que los otros coches se mueven solos y de manera aleatoria. La definición y cuerpo del método va con este código:

//método para mover los coches
        private void MueveOtrosAutos()
        {
            int maxHeight = graphics.PreferredBackBufferHeight;
            for (int i = 0; i < 2; i++)
            {
                
                posCoches[i].Y += velCoches;
                if (posCoches[i].Y > maxHeight)
                {
                    posAleatoria = ran.Next(-1000, 0);
                    posCoches[i].Y = posAleatoria;
                    posAleatoria = ran.Next(0, 2);
                    posCoches[i].X = posX[posAleatoria];
                }               
            }
        }

Se observa en el método que la definición de vector de los coches en la posición X y Y es similar a la de la carga de los Sprites, por lo de mas solo se limita al alto de la pantalla para que estos aparezcan al inicio de la misma y se muevan hacia abajo. Para observar cómo es que aparecen los coches aleatoriamente, solo resta la parte de dibujarlos en pantalla, todo esto dentro del método protected override void Draw(GameTime gameTime) y esto después de dibujar el camino y el camaro, el código es este:

//dibujamos los autos
           //en este caso solo son 2
           for (int i = 0; i < 2; i++)
           {
               spriteBatch.Draw(Coches[i], posCoches[i], Color.White);
           }

Y si toda va bien, compilamos y ejecutamos nuestro proyecto y podemos ver como aparecen nuestros autos a evadir, pero sin embargo si topamos con uno de ellos no pasa nado, esto se observa como en las siguientes imágenes.

image image

Para solucionar este problema de que se encimen las texturas, es aquí en donde declaramos nuestros rectángulos para la detección de la colisión, entonces inicializamos dichos rectángulos dentro del método protected override void Update(GameTime gameTime) y la definición e inicialización de dichos rectángulos es así:

//inicialización de los rectangulos
           //para detectar la colision

//recangulo del camaro
Rectangle recCamaro = new Rectangle((int)posCamaro.X, (int)posCamaro.Y, 
    Camaro.Width, Camaro.Height);
//rectangulo de los otros coches
for (int i = 0; i < 2; i++)
{
 recCoches[i] = new Rectangle((int)posCoches[i].X, (int)posCoches[i].Y, 
          Coches[i].Width, Coches[i].Height);
}

Ya que tenemos esto, ahora hacemos uso de la variable booleana deteccionActiva dentro del mismo método Update() la cual colocamos después de llamar al método MoverOtros Autos() y con una condición que va de esta manera:

//colisión de los rectangulos
                for (int j = 0; j < 2; j++)
                {
                    if (recCamaro.Intersects(recCoches[j]))
                        deteccionActiva = false;
                }

Para poder identificar esto, trabajamos dentro del método Draw() y colocamos una condición para dibujar al camaro, que funciona o se dibuja solo si la variable deteccionActiva esta activa, si esta en false que indica que existe dicha colisión, el camaro no será dibujado, y entonces queda así:

//dibujar el camaro
            if (deteccionActiva == true) 
                spriteBatch.Draw(Camaro, posCamaro, Color.White);

De esta manera cuando choquen los autos el camaro desaparece. Para terminar con este pequeño tutorial, cuando choque se sale del juego. Con esta pequeña condición para que pinte una explosión cuando esto suceda.

 

else if (deteccionActiva == false)
           {
               spriteBatch.Draw(choque, posCamaro, Color.White);
               deteccionActiva = true;
               base.ResetElapsedTime();
               base.Exit();
           }

Categorías:Games, Tips, XNA
  1. wilfredo martinez
    julio 23, 2012 a las 4:49 am

    esta interezante pero como hago el scripte que en verdad lo necesito para hacerlo yo tambien este jeugo

  1. No trackbacks yet.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: