Level 03: Detección de Colisiones II

Tercer tutorial sobre Programación con XNA Framework 4.0. Esta vez escribí sobre algunos problemas que pueden presentarse en la detección de colisiones 2D y también sobre cuáles serían las posibles soluciones, como la detección a nivel pixel (Pixel Perfect).

Frogger Kombat

Este juego fue realizado en conjunto con algunos amigos durante una Game Jam, a finales del 2011. Se trata de una pelea de sapos, que son manejados por 2 jugadores simultáneamente. El objetivo del juego es saltar y aplastar al contrincante hasta quitarle todos sus puntos de vida.

Votación CODEAR 2012: DEMO

CODEAR es un concurso en donde compiten desarrolladores de videojuegos. Consiste en producir un juego según una temática. En este caso, la temática fue "Demo". La votación termina el 11 de Septiembre. Puedes ver y jugar a todos los juegos que compiten, haciendo click en la imagen.

Nuevo mini COREAR: Cinemática

Estoy participando en un mini COREAR, que es un concurso en el cual compiten músicos y sonidistas. Cada competencia tiene una temática, a partir de la cual se crean pistas de música para poder participar. Esta vez la temática es "Cinemática". La idea es tomar cualquier cinemática de cualquier juego y componer una pista de música que pueda reemplazar a la original. Si quieres escuchar lo que hice, haz click en la imagen. Para más información sobre este COREAR, haz click en el título.

Sumate a la comunidad de DUVAL!

DUVAL (Desarrolladores Unidos de Videojuegos de América Latina) es una comunidad cuyo objetivo es mantener un lugar donde pueda existir una comunicación libre e independiente entre los desarrolladores de videojuegos de la region, para compartir trabajos, conocimientos, armar grupos, etc.

sábado, 8 de septiembre de 2012

Proyecto 01: Top Down Shooter 2D

"Cada vez que cometo un error me parece descubrir una verdad que no conocía."
Maurice Maeterlinck (1862 - 1849) - Escritor belga.
Antes que nada...
Aviso: El post aún no está terminado, por eso hay cosas que pueden no quedar muy claras. 

¡Saludos!

Ha pasado un largo tiempo desde la última entrada. Por distintas cosas de la vida, no pude dedicar mucho tiempo a este humilde blog. Pero espero poder avanzar, al menos lentamente. Así que mejor tener paciencia por ahora.

Esta vez quiero consolidar las ideas básicas que se vieron anteriormente. ¡Y no hay mejor manera que poner en práctica lo aprendido haciendo un juego! No sé si será algo sencillo (eso espero...) o complicado; no sé cuánto tiempo me llevará terminarlo... pero es hora de hacerlo, por fin.

Desde la última vez, estuve pensando qué hacer. Al final decidí empezar haciendo un Top Down Shooter (en 2D, obviamente). Desde entonces he estado intentando hacerlo, pero muy de vez en cuando.

La idea de esta Entrada, es hacer una especie de "historial" del desarrollo de este juego. A medida que vaya avanzando con el desarrollo, estaré actualizando esta Entrada hasta el día en que, medianamente, lo termine. En cada actualización escribiré sobre los distintos errores, correcciones, problemas, soluciones... y toda modificación en general que vaya surgiendo en el transcurso del tiempo. También estuve pensando un poco las cosas y decidí no colocar el código del programa durante ese tiempo, ya que preveo que será tedioso modificar a cada rato este posteo y podría generar confusiones.

Así que espero que salga todo bien al final. ¡Manos a la obra!


Screenshot de la última actualización: 08/09/2012



Sobre el Juego.
Siempre me gustaron los shooters, de todo tipo. Recuerdo haber jugado un Top Down Shooter para PC llamado Phobia II (1998). No estoy seguro, pero juraría que fue el primer juego que conocí de ese tipo. Y cómo esto me dió mucha nostalgia, decidí hacer algo de ese estilo pero modificando algunas cosas con toque propio.

Básicamente, el juego se va a tratar de un tanque que debe sobrevivir a una oleada de enemigos que irán apareciendo en el mapa, tal como en Phobia II. El jugador manejará los movimientos del tanque con el teclado (flechas o teclas WASD) y podrá apuntar y disparar con el Ratón.

Para comenzar, creí que lo primero que debía hacer era diseñar la mecánica del jugador. Luego me concentraría en diseñar los enemigos y power ups, para que finalmente pueda volcar todo aquello en el diseño de niveles. 

Como recién estoy empezando, seguro que hay cosas que no puedo prever en estos momentos y que en el futuro irán saliendo a la luz. Por eso quiero hacer un seguimiento de todos mis avances en esta Entrada. Entonces, ahí van:

Este es un pequeño video que resume todo lo que hice hasta el día 09/06/2012, con las primeras 3 actualizaciones:



HISTORIAL


Día 1: 06/06/2012 - Comenzando el Proyecto
Voy a empezar con la mecánica del jugador. El tanque que maneja el jugador se formará de 2 partes: una Base y un Cañón. La Base es la que controla solamente el movimiento del tanque, mientras que el Cañón tiene la función de apuntar y disparar. La base se controla con el teclado y el cañón con el ratón.

Antes que nada, hice un modelo provisorio y simple de lo que sería la textura de la Base del Tanque:


Textura provisoria de la Base del Tanque.

Luego creé una clase llamada "Base.cs", que contiene la mayoría de las características de la clase "Figura.cs" vista en la Entrada anterior. De hecho, tomé esa clase y le hice algunas pequeñas modificaciones y la renombré como "Objeto.cs". La idea es que las demás clases, como la Base y el Cañón del tanque, hereden sus atributos (ya que ambas tienen propiedades similares como una posición (x,y), una textura, etc.). Por lo tanto la clase "Base.cs" es una derivada de la clase "Objeto.cs".

Una vez acordado todo esto, procedí con el código del programa hasta que pude visualizar la Base del Tanque en la pantalla y lograr moverla con el teclado:


Primer logro: Mover la Base del Tanque con el teclado.



08/06/2012: Diseñando el Cañón
Una vez lista la Base del Tanque, lo siguiente era empezar con el Cañón. Diseñé entonces la clase "Cañon.cs", también derivada de la clase "Objeto.cs". También, hice otro modelo simple de la textura que tendrá el Cañón:


Textura provisoria del Cañón del Tanque


Luego continué con el código. La particularidad del cañón del jugador, es que siempre apunta a la posición en la pantalla donde se encuentra el puntero del ratón. Luego de varias pruebas, terminé esa parte del código y logré terminar con el movimiento del cañón. Tuve en cuenta el origen de la textura, ya que esta debía girar en torno al centro del círculo. Lo que resultó de todo esto fue lo siguiente:


Segundo logro: El Cañón apunta hacia la posición del cursor del Mouse.



09/06/2012: Armando el Tanque y añadiendo Disparos
Al principio, lo único que hice esta vez fue 'armar' el tanque uniendo los 2 objetos anteriores, de modo que cada objeto siempre se mueva al mismo tiempo y a la misma posición del otro. Un screenshot de lo logrado:


Tercer logro: Tanque formado con la 'unión' de una Base y un Cañón.

Luego diseñé una clase "Bala.cs", derivada también de la clase "Objeto.cs" para que representen los disparos que realizará el Cañón del Tanque. Hice 2 modelos de texturas para dicha clase:



Diseño Bala 01
Diseño Bala 02

Cada vez que se presione el botón del ratón, el Cañón debería lanzar una Bala hacia la dirección donde se encontraba el puntero del ratón. Con esta idea, completé el código del programa hasta que salió bien. Me llevó algo de tiempo aplicarlo, ya que me confundían un poco los cálculos de trigonometría, pero salío bien después de todo.

Tuve en cuenta también que las balas no deberían "viajar" para siempre. Es decir, en cada disparo, las balas deben tener en su trayectoria una distancia máxima. También estoy pensando en agregar al Cañón del Tanque la capacidad de "Recargar" municiones al quedarse sin balas. Esto debería darle un pequeño tiempo de retraso al cañón antes de volver a disparar.

Finalmente agregué unos textos a la pantalla para poder visualizar algunos datos importantes. Y esa fue la última actualización del mes. Un screenshot:


Cuarto Logro: Tanque ensamblado y disparando.



02/09/2012: Agregando un Enemigo
Pasó un largo tiempo desde la última vez. En esta ocasión quise agregar un enemigo al juego. Por ahora sólamente hice que un segundo tanque apunte al jugador y dispare. Si las balas enemigas impactan en el jugador, este debería perder vida. Para ello, agregué una propiedad a la clase "Base.cs" para guardar los puntos de vida del jugador

Un screenshot de esta actualización:


Quinto logro: Un cañón enemigo que dispara a la posición del jugador.


Conclusión
Esto es todo lo que hice hasta el momento. Todavía queda mucho por delante. Así que pronto iré actualizando esta Entrada con las nuevas actualizaciones.

¡Hasta entonces!


¡Sigue adelante, siempre!