PROGRAMACION DE VIDEOJUEGOS


1. Introducción a la programación de video-juegos

Cuando abordamos la idea de programar un video-juego, casi siempre comenzaremos con una chispa que se encenderá en la mente que nos diga; "¡Oye, esto sería un gran proyecto!". Imágenes impactantes, sonidos, música... La idea de un nuevo juego siempre es un aliciente que debe despertar en nosotros una motivación para plasmar en el ordenador nuestras habilidades en programación, en ilustraciones, en la búsqueda de nuevos trucos, rutinas y sobre todo.... aprender pasando un buen rato.

Cuando tenemos una idea para un nuevo juego, lo mejor es recurrir al viejo papel y lápiz para crearnos un esquema o bosquejo de la idea en general, que iremos puliendo poco a poco. Si empiezas en la programación, NUNCA te pongas directamente en el ordenador a programar sin tener claro un esquema u objetivo del programa. Sólo conseguirás perder el tiempo y la paciencia. Tampoco intentes comenzar a programar directamente el DOOM III  o el Rebelt Assault IV. Comienza siempre a estudiar detenidamente la sintaxis del lenguaje de programación que vayas a utilizar, escribe rutinas sencillas, haz pruebas, pruebas y más pruebas, y, cuando hayas perdido horas y horas y "algo" de paciencia...  ¡sigue haciendo más pruebas!. Ten en cuenta que en el aprendizaje de la programación de video-juegos existe un gran vacío a nivel de libros o cursos. Muchos grandes programadores han aprendido estudiando las rutinas de otros programadores. Intenta también acceder a listados de programas sencillos a través de revistas o internet para desgranar los códigos.

Así pues, utiliza dibujos, bosquejos, haz un story board de las pantallas, define el comportamiento de los objetos del juego, etc, etc. Al final, habrás generado un plan de acción que se volverá la guía de producción.

Cuando abordes la idea de un proyecto de video-juego, piensa por un momento en las siguientes preguntas:

¿Qué tipo de juego quiero hacer? (Arcade, Plataformas, Aventura, 3D...)

¿Qué elementos software necesito?
¿De qué equipo dispongo?
¿Puedo hacerlo solo? ¿Quién puede ayudarme?
¿Cómo distribuiré el proyecto final?


Es importante planificar los recursos de los que disponemos para crear el juego:

 

2. Primer programa en DIV.  Preparación del entorno

Vamos a realizar un pequeño programa que servirá para comenzar a programar en DIV. Explicaremos paso a paso como se crea un fondo, un objeto, y comenzaremos a comprender las rutinas principales de movimiento de objetos. Evitaremos explicar el funcionamiento del entorno del programa, así como el programa de dibujo y las opciones de los menús. Para ello teneis abundante documentación en el libro que acompaña al CD-ROM de DIV.

Comenzaremos nuestro primer dibujo creando con el propio programa de dibujo de DIV, un fondo y un objeto que nos servirá como fondo del primer programa a comentar. Para ello debemos crear dos mapas. Un mapa es un dibujo o una colección de dibujos que nos servirá tanto para crear un objeto individual como para crear una librería (colección) de objetos o fondos. Para ello, y suponiendo que estás en la pantalla principal de DIV donde visualizarás el menú principal, sigue estos pasos:

Ahora crearemos dos ficheros: Ejemplo1.fpg y Ejemplo1.prg. Los ficheros FPG guardan la colección de objetos y gráficos necesarios para el juego. Además, se les asigna un nombre y un código a cada uno. Los ficheros PRG guardan lo que será el listado del código del programa.


3. Comenzar a programar

Objetivos del programa

Bien, todo a punto. Tenemos los dos ficheros PRG y FPG preparados, y los dos gráficos a punto. El objetivo de la primera rutina será el de hacer que se visualizen un fondo y un gráfico (yigu) en pantalla. Necesitaremos:

Todo aquel que ha empezado a programar, habrá creado algún diagrama de flujo o pseudocódigo del comportamiento de un programa. Estos diagramas sirven para esquematizar las ideas previas al código del programa, o bien pueden ser un guión definitivo del comportamiento del propio programa. El pseudocódigo, es un lenguaje imaginario que simula el comportamiento de una rutina en lenguaje "de estar por casa". Observa la estructura del siguiente pseudocódigo (izquierda) y compárala con el primer programa (derecha):
 

Se inicia el programa 

Proceso principal

Carga el fichero de gráficos

Coloca el gráfico 2 como fondo

Se crea el proceso del objeto principal

Proceso del comportamiento del objeto

Seleccionar el objeto y una coordenada de la pantalla para colocarlo.

Hacer que se visualize el objeto

PROGRAM Ejemplo1;

BEGIN
   load_fpg("ejemplo1.fpg"); 
   put_screen (0,2); 
   yigu() 
END

PROCESS yigu()
    graph=1;x=40;y=150
        LOOP
           FRAME
        END

Observa las tres partes bien diferenciadas del código. Las órdenes que acabamos de ver son las siguientes:
   

PROGRAM Ejemplo1;

Orden de cabecera del programa. Todos los programas deben comenzar con esta orden, seguida del nombre del programa y un punto y coma.

BEGIN         

load_fpg("ejemplo1.fpg"); put_screen (0,2); 
yigu()

END

BEGIN Código principal del programa. Controla los gráficos y sonidos que se cargan, los bucles de opciones, etc. En nuestro ejemplo se realizan tres acciones;

load_fpg("Ejemplo1.fpg"); orden para cargar un fichero que contiene los gráficos necesarios para presentar en pantalla. El nombre del fichero se coloca entre paréntesis y la orden finaliza con punto y coma.

put_screen(0,2); orden para colocar el gráfico de fondo. El cero es el número de fichero FPG y el 2 el número que hemos asignado al gráfico de fondo.

yigu(); esta línea crea un proceso llamado yigu. Un proceso es un objeto con un comportamiento determinado, como un objeto, un disparo, etc

END orden de final del proceso principal 

PROCESS yigu()

Aquí se define el comportamiento del objeto yigu. En nuestro caso, colocamos la orden PROCESS y seguidamente el nombre del proceso. A continuación viene la madre del cordero.

En nuestro caso, pretendemos colocar un gráfico en una coordenada determinada de la pantalla. Recuerda que hemos definido el tamaño de pantalla en 320 x 200 puntos. La orden graph=1 define el número de gráfico que vamos a utilizar, que en nuestro caso es el número 1. A continuación hay que decirle al programa dónde colocar el gráfico, es decir, la coordenada en la pantalla. Esto lo hacemos utilizando las variables x e y que se utilizarán para nombrar las coordenadas horizontal y vertical respectivamente. Las coordenadas de nuestra pantalla de 320 x 200 puntos se miden de arriba a abajo y de izquierda a derecha. Por ejemplo, la esquina superior izquierda corresponde con la coordenada 0,0 (x=0, y=0), la esquina inferior izquierda sería la coordenada 0,320, etc.

Hemos calculado la posición de nuestro yigu más o menos sobre la plataforma azul, que será la coordenada x=40, y=157. De todas formas, cuando ejecutemos el programa, podemos ir variando y ajustando la posición.

La orden para seleccionar el gráfico y colocarlo sobre esa coordenada de la pantalla será:

 

graph=1
x=40
y=157

o dicho de forma abreviada: graph=1;x=40;y=157;

2. Tipos de bucles

Por último, una vez seleccionado y colocado en pantalla el gráfico, debemos indicarle que nos lo enseñe. Esto lo conseguimos con la orden FRAME. Esta orden nos muestra el gráfico del proceso en el que está el programa. El problema es que si escribimos la orden FRAME sola, nos mostrará el gráfico sólo una vez, y el programa terminará tan pancho. De forma que debemos decirle que nos muestre una y otra vez el gráfico. Esto se consigue con un bucle. Un bucle no es más que una orden especial que hace que se repitan una serie de órdenes unas veces determinadas, o ifinitamente. Imagina que tenemos que decirle al programa que nos muestre infinitas veces el dibujo. ¿Te imaginas escribir la palabre FRAME chorrocientas mil veces? Un bucle nos sacará del apuro.
 

LOOP

    FRAME

END

Comienza el bucle

Se muestra la imagen

Fin del bucle y vuelta a comenzar

Seguimos con el estudio de los bucles para crear movimiento. Ahora vamos a hacer que el muñeco yigu se mueva horizontalmente. Lo que haremos será mover la coordeanda x del muñeco horizontalmente hacia la derecha, hasta la coordenada x=185. Esto lo conseguimos con un bucle controlado. Existen varios tipos de bucles que iremos viendo a lo largo de las lecciones, pero en este caso utilizaremos un bucle del tipo WHILE - END. En nuestro ejemplo, hay que sustituir el bucle LOOP - END por las siguientes líneas:

PROCESS yigu()

    graph=1;x=40;y=150

        WHILE (x<185) 
           FRAME;  

                x=x+1;

        END

WHILE orden que crea un bucle cuyas órdenes desde WHILE hasta END se van repitiendo hasta que se cumpla la condición que sigue a la palabra WHILE, es decir, hasta que la coordenada x llegue al punto 185.

x=x+1 en cada vuelta del bucle, la coordenada x se incrementa en uno. En la primera vuelta, x vale 41, en la segunda, 42, y así sucesivamente hasta 185.

Finalmente, el bucle termina. Si quieres que yigu vaya más rápido, sólo tienes que cambiar el incremento de puntos. Por ejemplo:   x=x+5

¿Serías capaz de adivinar el comportamiento de los siguientes bucles?
 
PROCESS yigu()
    graph=1;x=40;y=150
        WHILE (x<185)
            FRAME;
                x=x+1;
            END
        WHILE (X>40)
                x=x-5;
            FRAME;
        END
END

Estos ejemplos que estamos comentando puedes probarlos directamente en DIV (si quieres practicar) o bien bajártelos desde la sección Descarga al final de la página.Desde esta sección podrás bajarte los ficheros de ejemplo del curso así como otros ejemplos interesantes. Vamos a ver ahora el comportamiento y movimiento de un objeto utilizando el teclado. Para ello utilizaremos dos funciones. IF y KEY. La función SI comprueba si se cumple una condición. En caso afirmativo, se ejecutan una serie de órdenes. En caso negativo, no se ejecutan, o se ejecutan otras diferentes. Por ejemplo, si queremos que el muñeco se pare antes de salir de la pantalla, (coordenada 310 aprox), podríamos hacer un bucle WHILE - END como el anterior: WHILE (x<310) o hacerlo de la siguiente forma: IF (x=310).... Observa la sintaxis de la función IF y el pseudocódigo explicativo:
 

IF (<condicion>) 

        sentencias y órdenes 

END 

Si se cumple tal condición 

       ejecuta las sentencias que sean 

Fin de la orden

Un ejemplo: si quisiéramos saber si una variable llamada k vale 0 y que pasara algo, podríamos decir:
  

IF (k=0)

        k=k+1 

END 

 

Si k vale 0

       suma uno al valor de k

Fin de la orden

Observa el siguiente código que varía nuestro programa:
 

PROCESS yigu()
BEGIN 
graph=1;x=40;y=150
        LOOP  
                x=x+1
                 IF (x>185)
                     x=185;
                 END
            FRAME 
       END
END

El contador de la coordenada x avanzará igual que antes, pero cuando x sea mayor que 185, (condición del IF), x seguirá valiendo 185 y el gráfico no avanzará más. 

 

Bien, ahora vamos a ver cómo se controla el muñeco. Para ello utilizaremos la orden KEY(<código de tecla>). Esta orden comprueba si una tecla está pulsada o no. En caso afirmativo, ejecuta alguna orden concreta. Cada tecla del teclado posee un nombre que la identifica. En la ayuda de DIV tienes todos los códigos y nombres asignados a cada tecla. De momento sólo utilizaremos las teclas de dirección izquierda (_left) y derecha (_right). Para comprobar en un programa si se ha pulsado una tecla, se utiliza la siguiente línea:
IF (key(_tecla)

    órdenes

END

Los siguientes ejemplos son variaciones sobre el mismo programa. Estudia las rutinas y sus comentarios. Estos ejemplos los puedes encontrar en la sección de descarga.

PROGRAM Ejemplo4
    BEGIN  
        load_fpg("ejemplo1.fpg");  
        put_screen (0,2);  
        yigu() 
END 

PROCESS yigu()

    graph=1;x=40;y=150 

BEGIN 
    LOOP 
        IF (key(_right)) 
            x=x+2; 
        END 

        IF (key(_left)) 
            x=x-2; 
        END 

        IF (x>310) 
            x=300; 
        END 

        IF (x<20) 
            x=20; 
        END 
        FRAME; 
    END 
END 
 


 
 
 
 
 
 

Se crea un bucle infinito en espera de la pulsación de teclas. 
Si  se pulsa la tecla derecha, avanza dos unidades. 
 
 

Si se pulsa la tecla izquierda, retrocede dos unidades. 
 
 

Si se llega a la coordenada 310 (parte derecha de la pantalla), el muñeco se para porque el valor de x no valdrá más de 300 (hasta que se pulse de nuevo la tecla de desplazamiento a la izquierda). 

Si se llega a la coordenada 20 (parte izquierda de la pantalla), el muñeco se para porque el valor de x no valdrá menos de 20 (hasta que se pulse de nuevo la tecla de desplazamiento a la derecha).

PROGRAM Ejemplo5
    BEGIN  
        load_fpg("ejemplo1.fpg");  
        put_screen (0,2);  
        yigu() 
END 

PROCESS yigu()

    graph=1;x=40;y=150 

PRIVATE 
aceleracion=0 

BEGIN 
    LOOP 
        IF (key(_right)) AND aceleración<6) 
aceleracion=aceleracion+2; 
            ELSE 
                IF (aceleracion>0) aceleracion=aceleracion-1;END 
        END 
  
        IF (key(_left)) AND aceleración>-6) 
aceleracion=aceleracion-2; 
        ELSE 
            IF (aceleracion<0) aceleracion=aceleracion+1;END 
        END 

        x=x+aceleracion; 

        IF (x>310) 
             x=300; 
             aceleracion=0; 
        END 

        IF (x<20) 
             x=20; 
             aceleracion=0; 
        END 
  
        FRAME; 
    END 
END

En esta rutina creamos una variable privada llamada aceleracion con un valor inicial de cero. Esta variable se crea con la orden PRIVATE, el nombre de la variable y el valor inicial. 

Es una variable privada porque sólo afectará a este proceso. 

En cada vuelta del bucle infinito, se incrementa en uno el valor de la variable hasta valer 6 como máximo. 

Si se pulsa la tecla de desplazamiento a la derecha, la coordenada y en nuestro caso el muñeco, avanzan tomando el valor en todo momento de la variable el cual se va incrementando y decrementando si pulsamos una u otra tecla de desplazamiento. 

Prueba esta rutina para observar un movimiento fuido del objeto, y a la vez una suave frenada cuando pulsamos una u otra tecla de dirección. 

Prueba también a cambiar los valores de la variable aceleración de las líneas de los IF y del incremento de x

No tengas miedo en cambiar valores y comprobar el resultado. 

                                                                                                          © Luis Antonio Esparza y Javier de Lucas