miércoles, 17 de febrero de 2010

Programación de un juego 2D con XNA I

Estando en 2º de enseñanza media, allá por el año 95(UF!) programé un par de juegos en Pascal. Nada muy complejo la verdad, consideremos que la programación de videojuegos no era algo que se enseñara en el colegio, no señor, eran solo aventuras personales en las que un par de amigos tan faltos de vida social y atractivo para el sexo opuesto como yo se embarcaba.

Ahí nos conseguíamos un IBM 25(el de la foto) y nos quedábamos despues de clase en el liceo con alguna fotocopia que hubiesemos conseguido sobre como crear TPU's con pascal o cosas similares, nuestros borradores de lo que habiamos avanzado en nuestros programas(porque primero programabamos a lapiz pues no habia un pc casa por medio) y nuestros disquetes de 3 y media pulgadas ojalá sin virus.

Aprovecho para mandarle un par de chuchadas al malnacido que hizo ese virus que colocaba la frase "You are here CPW!"(Info del virus) que me hizo perder tantas horas de pega y disquetes en aquel entonces. Aunque debo admitir que tambien tenía montón de ganas de hacer un virus(El que esté libre de pecado que tire la primera piedra).

Bueno, el punto es que entre los juegos que programé, uno de los mas divertidos era un shooter de un helicoptero que tenía que exterminar a la horda de extraterrestres(los trulululus... si, ya sé que el nombre era harto penca) que invadía la tierra.

La estructura del programa era algo así

Inicio del Juego
Inicialización de variables
Repetir
Determinar posiciones
Determinar posicion de helicoptero
Determinar posicion de naves enemigas
Determinar posicion de misiles del helicoptero
Determinar posición de misiles enemigos
Determinar Colisiones
Determinar si helicoptero choca con nave enemiga
Determinar si helicoptero es alcanzado por misil
Determinar si nave enemiga es alcanzada por misil
Dibujar
Dibujar Fondo
Dibujar Helicoptero
Dibujar Naves enemigas
Dibujar misiles
Lectura de dispositivos
Determinar si el usuario presionaba:
una flecha del teclado
la tecla de disparo
la tecla de abandono de juego
Determinar nuevas posiciones
de Helicoptero
de naves enemigas
de misiles
del fondo
Hasta que Helicoptero es destruido o usuario presiona tecla de salida


Bueno, lo anterior bien a grandes rasgos. Todo esto muy procedural, con Turbo pascal 5 y nada de orientación a objetos que no la enseñaban(menos mal, despues de todo es una materia un tanto abstracta para chicos de 15 años antes de internet).

Recuerdo que llegar a esa estructura me habrá tomado al menos unas 2 semanas de cabeceo.

Afortunadamente la cosa ahora va algo mas simple. Si abres ahora tu XNA studio y creas un nuevo proyecto del tipo Windows Game verás que este tiene una algunas estructuras en común con la que acabo de describir. A saber, cuando creas un proyecto de este tipo XNA crea automáticamente parte del código y en este la siguiente estructura:

Tenemos una clase principal que es Game1(), nuestro juego con todo lo que contiene y en este algunos métodos que se irán ejecutando en el transcurso del juego.

Tenemos, por ejemplo el Initialize() que es donde debiécemos establecer nuestros parámetros iniciales, el Update() que es donde debiesemos actualizar los valores de nuestras variables y status, asçi com tambien tenemos el método Draw() que es donde debiésemos "dibujar" lo que el usuario verá en este momento.

A propósito de dibujar. En aquel entonces los computadores a los que tenía acceso no tenían ni la velocidad de procesador que tenemos hoy,(recuerdo que el año 96 en una softel vi el primer computador de 100 MHZ y era caro como una casa... casi me oriné cuando corrieron un DIR de DOS y se demoró menos de un segundo en desplegar la información) ni tarjetas de video especializadas para videojuegos ni nada por el estilo por lo que el proceso de dibujar podía hacerse realmente lento. En mis primeros intentos usé la graph.tpu(una librería de pascal con herramientas para dibujar contenido en pantalla) y resultó asquerosamente lento por lo que finalmente opté por usar ascii art. Así teniamos un helicoptero mas o menos así:

----+---
+----/ \
=====

Sí, ríanse nomas. Era mejor dibujado, pero ya no me acuerdo de todos los caracteres ascii que usaba(había que aprenderse la tabla ascii de memoria o usar programas que ayudasen, como sidekick... que gran programa aquel). Aún así, esto iba mas allá, en cada ciclo de juego el helicoptero cambiaba con lo que daba la idea de algún grado de animación.

Ejemplo:
----+----
+----/ \
=====

--+--
x----/ \
=====

---+---
+----/ \
=====

Ja, ahora sí que han de estar riéndose a mandíbula batiente.

Créase o no, resultaba bastante efectivo.

Afortunadamente, en XNA no haremos esa bestialidad sino que usaremos otras características que nos permitirán mostrar figuras complejas con una gran facilidad y excelente desempeño.

Pero eso ya lo veremos en la próxima entrega.

Como siempre, saludos.

Manuel Gatica Holtmann

5 comentarios:

  1. Acabo de ver que al publicar se deformó aùn mas el bendito helicoptero. Espero sepan disculpar.

    Saludos

    ResponderEliminar
  2. saludos , excelente blog , espero la proxima entrada

    ResponderEliminar
  3. Gracias colega.

    Por los últimos acontecimientos no he publicado en estos dias pero espero luego continuar.

    Saludos

    ResponderEliminar
  4. Manuel que me dices de esto:
    http://www.youtube.com/watch?v=Jd5ajcdmlHk&feature=related

    ¿Crees que fue hecho en Pascal?, talvez por lo menos Object Pascal.

    ResponderEliminar
  5. muy bueno choko...asi da ganas de seguir investigando sobre programacion de videojuegos

    ResponderEliminar

-__-