Volver al Inicio Microsoft Student Tech Club: Universidad Libre

Tutorial de XNA: Haciendo que el cohete acierte en el enemigo
 

Hasta ahora si disparamos los cohetes, estos siguen, pueden pasar por encima del enemigo y no sucede nada. El juego no tiene emoción. Debemos añadirle que cuando un cohete acierte al enemigo, ambos desaparezcan. Eso se le conoce en el medio con el nombre de "colisión". Pero ¿Cómo se hace la colisión?. Un primer acercamiento es comparar las coordenadas del cohete, con las coordenadas del enemigo, si coinciden, hay una colisión. Sin embargo, lograr tal coincidencia es muy difícil durante el juego. La comparación es entonces por áreas rectangulares, se compara si el área rectangular del cohete toca el área rectangular del enemigo. Eso es mucho mas posible. XNA nos ofrece la función para comparar si dos rectángulos se intersectan.

El método que actualiza los cohetes en Game1.cs tiene ahora este código (no se modifica ningún otro código):

        //Método llamado desde Update
        public void ActualizaCohetes()
        {
            //Va de cohete en bala
            foreach (ObjetosJuego cohete in cohetes)
                if (cohete.esta_activo == true)
                {
                    //Solo es actualizar la velocidad porque el vector se actualiza gracias a esa magnitud
                    cohete.posicion += cohete.velocidad;
                    //Chequea la colisión
                    //Deduce el rectángulo del cohete y debe tener en cuenta el tamaño con que se esté dibujando en pantalla en Draw()
                    Rectangle rectCohete = new Rectangle((int)cohete.posicion.X, (int)cohete.posicion.Y, (int) (cohete.sprite.Width*0.2), (int) (cohete.sprite.Height*0.2));
                    //Chequea de enemigo en enemigo si el cohete lo colisiona
                    foreach (ObjetosJuego enemigo in enemigos)
                    {
                        //Deduce el rectángulo del enemigo y debe tener en cuenta el tamaño con que se esté dibujando en pantalla en Draw()
                        Rectangle rectEnemigo = new Rectangle((int)enemigo.posicion.X, (int)enemigo.posicion.Y, (int) (enemigo.sprite.Width*0.2), (int) (enemigo.sprite.Height*0.2));
                        //Si ambos rectángulos se intersectan
                        if (rectCohete.Intersects(rectEnemigo) == true)
                        {
                            enemigo.esta_activo = false; //inactiva el enemigo
                            cohete.esta_activo = false; //inactiva el cohete
                            break;
                        }
                    }
                    //Si el cohete se sale de la pantalla entonces se desactiva
                    if (rectFondo.Contains(new Point((int)cohete.posicion.X, (int)cohete.posicion.Y)) == false)
                        cohete.esta_activo = false;
                }
        }

Este es el resultado:

 

 

Volver al Inicio Célula Microsoft. Universidad Libre