Bueno, pues aquí empiezo con los tutoriales de programación que había prometido. Como dije en su día lo iba a centrar en realizar algún tipo de juego o juegos para
GameBoy Advance, pero antes de eso me gustaría hacer un par de entradas centradas en
GameBoy. Estos tutoriales para aprender a desarrollar algo en GameBoy no serán avanzados o al menos no pretendo que sean demasiado avanzados para que la gente se pierda, pero entiendo que pueden ser útiles para tomar contacto con el lenguaje de programación C que es el que de forma mayoritaria voy a usar más adelante en los tutoriales para GameBoy Advance (además de que para usar efectos más interesantes como el
MODO 7 es el que usaré de forma predilecta pues los kit de desarrollo que permiten tener mejor control del hardware de la GBA están basados en este lenguaje), aunque es probable que haga algún pequeño tutorial usando el DragonBasic con el que es muy fácil empezar a programar juegos para GBA aunque con ciertos límites. Después de este peñazo de introducción vamos al lio.
TUTORIAL DE PROGRAMACIÓN PARA GAME BOY - PARTE #1Antes de nada, una pequeña reseña acerca de la máquina para la que vamos a desarrollar. Las características técnicas de la GameBoy son las siguientes:
CPU: 8-bit Sharp LR35902 (Similar al Z80) a 4.19 MHz
8K de RAM principal
8K de Video RAM
2.6” LCD 160×144, 4 Tonos
Sonido estéreo, 4 Canales
Puerto serie (ext)
6V, 0.7A
90 mm x 148 x 32 mm
En esta primera entrada centrada en la programación para GameBoy he preparado un programa muy sencillo que ni si quiera es un juego pero va a servir como toma de contacto inicial. Para empezar en este tutorial y en posteriores (a no ser que diga lo contrario) voy a utilizar el
GBDK (
GameBoy Development Kit) el cual podeis descargar desde la siguiente URL:
http://sourceforge.net/projects/gbdk/ (espero que los moderadores no tengan ningún inconveniente en que coloque aquí estos enlaces, si hay algún problema que por favor me lo notifiquen para modificar este post). Lo único que teneis que hacer es decargaros el instalable, instalarlo en algún directorio de vuestra unidad C: (o la unidad donde vayais a querer tener instalado el entorno) y posteriormente editar las variables de entorno de Windows para añadir el directorio "\bin" de tal forma que si habeis instalado el entorno de desarrollo en "C:\GBDK\bin" pues añadís tal cual dicha ruta en la variable PATH de windows (PANEL DE CONTROL -> SISTEMA -> OPCIONES AVANZADAS -> Variables De Entorno). Para escribir los programas no es necesario que os compliqueis la vida buscando un IDE potente como Eclipse o CodeBlocks y configurarlo para que tire del GBDK, simplemente con un editor de textos que reconozca y resalte la sintaxis C/C++ vale. Por ejemplo yo uso mucho
NotePad++ y el
Crimson Editor.
NOTA: antes de seguir leyendo os recomiendo que os leais algún tutorial básico de lenguaje C para entender al menos de forma básica algunas de las cosas que iré poniendo en este hilo aunque intentaré siempre ser lo más explícito posible, y por supuesto si teneis alguna duda me podeis preguntar en este mismo hilo que os contestaré dentro de mis posibilidades.El programa como tal es un simple contador que cuenta números desde 1 hasta 90 y los muestra en la pantalla de la GameBoy. Como veis no me he roto demasiado la cabeza, pero como os decía anteriormente no quería que la primera entrada fuese excesivamente complicada. A continuación os dejo el código fuente del programa para que le echeis un vistazo:
programa.c
#include <gb/gb.h>
#include <stdio.h>
void main(){
int howmuch;
int counter;
counter = 0;
howmuch=90;
printf("\n GAMEBOY C TUTORIAL");
printf("\n-------------------\n");
printf("\t\t\t\t(\\" "\\" "_/)\t\t\t\t\t(\\" "\\" "_/)\n");
printf("\t\t\t\t(O.o)\t\t\t\t\t(O.o)\n");
printf("\t\t\t\t(> <)\t\t\t\t\t(> <)\n");
printf("-------------------\n");
printf("PROGRAMMED BY RYOGA");
printf("\n");
printf("\nPress start to count to ninety\n");
waitpad(J_START);
do{
counter++;
printf("%d\n" ,counter);
}while(counter<howmuch);
printf("\nProgrammed by RYOGA\n");
}
Si no conoceis el lenguaje de programación de C es probable que todo lo anterior os suene un poco a chino.
Las dos primeras lineas empiezan con la palabra reservada del lenguaje "
#include" que permite incluir en nuestro programa la definición de funciones externas que no estén declaradas en nuestro fichero "programa.c". El fichero
gb.h tiene la declaración de un montón de funciones que hacen uso explícito del hardware de la gameboy (también incluye algunas funuciones auxiliares) y por otro lado
stdio.h es el fichero que tiene la declaración de las funciones necesarias para manejar la entrada/salida y que en este ejemplo usaremos para mostrar por pantalla mensajes y textos. (
stdio.h es un fichero muy utilizado fuera del desarrollo para GameBoy con la misma función que aquí, es decir, manejar la entrada/salida estándar como pueda ser la pantalla de un PC por ejemplo. El fichero
stdio.h que usaremos aquí es una versión reducida adaptada para ser incluido en el GBDK).
El lenguaje de programación C es un lenguaje de programación funcional, es decir orientado a estructurar el código en funciones. En el programa anterior podeis apreciar que hay una única función declarada por el usuario, se trata de la función
main() o función principal del programa dentro de la cual se incluyen todas las sentencias que en el caso de este programa son necesarias para generar el efecto esperado de contar desde 1 hasta 90. A continuación hay declaradas 2 variables de tipo "entero" o "int":
int howmuch;
int counter;
counter = 0;
howmuch=90;
howmuch es el límite máximo de cuenta que en este caso está inicializada a 90. Se podía haber declarado directamente como:
int howmuch = 90;
counter es el contador que vamos a utilizar para ir avanzando en el programa. Se podía haber declarado directamente como:
int counter = 0;
A continuación veis que hay varias llamadas a la función
printf() incluida en
stdio.h la cual vamos a utilizar para mostrar los siguientes textos con formato. El carácter "\n" es el retorno de carro equivalente a pulsar un INTRO, mientras que el carácter "\t" es la tabulación.
printf("\n GAMEBOY C TUTORIAL");
printf("\n-------------------\n");
printf("\t\t\t\t(\\" "\\" "_/)\t\t\t\t\t(\\" "\\" "_/)\n");
printf("\t\t\t\t(O.o)\t\t\t\t\t(O.o)\n");
printf("\t\t\t\t(> <)\t\t\t\t\t(> <)\n");
printf("-------------------\n");
printf("PROGRAMMED BY RYOGA");
printf("\n");
printf("\nPress start to count to ninety\n");
Ahora viene algo importante:
waitpad(J_START);
Esta función está incluida en
gb.h y en este caso lo que hace es "bloquear" la ejecución del programa hasta que el usuario pulse el botón START de la consola.
J_START es una constante que también está incluida en
gb.h por lo que no es necesario que la declareis vosotros. En el
gb.h están mapeados todos los botones de la GameBoy mediante códigos y los nombres de las constantes son los siguientes:
J_START
J_SELECT
J_B
J_A
J_DOWN
J_UP
J_LEFT
J_RIGHT
A continuación viene otra parte importante, un bucle.
do{
counter++;
printf("%d\n" ,counter);
}while(counter<howmuch);
printf("\nProgrammed by RYOGA\n");
El búcle Do...While ejecuta siempre una primera vez las sentencias que tiene dentro y se vuelve a ejecutar las veces necesarias mientras se cumpla la condición
"booleana" que está incluida en el
while(). En este caso el bucle se mantiene mientras counter sea menor que howmuch. Dentro del búcle cada vez que se ejecutan las sentencias se incrementa en uno el valor de counter y se muestra por pantalla su valor junto con un retorno de carro, por tanto según avanza la ejecución del programa llegará un momento en que counter sea igual a 90 y ya no se cumpla la condición del
while()... por lo que se saldrá del búcle y a continuación se ejecutará la llamada a la función
printf() del final.
Una vez que tenemos nuestro fichero programa.c completo vamos a compilarlo para generar la ROM con extensión
.gb. Para realizar esta operación yo lo que hago normalmente desde windows es crear un fichero .bat de proceso por lotes con las instrucciones que necesito, en este caso al ser el programa muy sencillo basta con añadir esto a nuestro fichero .bat (que debe estar en el mismo directorio que nuestro fichero programa.c):
lcc -o programa.gb programa.c
A continuación ejecutais la sentencia anterior ejecutando el fichero
.bat y si todo ha ido correctamente debería aparecer en el mismo directorio donde teneis los fuentes y el .bat un fichero con extensión
.gb de la ROM generada. Ahora sólo teneis que probarla en un emulador para ver que funciona correctamente. Si algo ha fallado, puede ser o bien que no tenies bien configurada la variable PATH en las variables de entorno o bien que si habeis copiado el código desde este post se haya metido algún carácter raro.
Bueno, pues esto es todo para la primera entrada de sobre esta temática. Espero que os haya quedado claro. Podeis hacer algún que otro ejercicio adicional para controlar el resto de botones de la consola, o que se muestren textos alternativos en función del botón del PAD pulsado y cosas así para ir practicando antes de la siguiente entrada.
Además os dejo todo el proceso anterior en formato video en el que se ve todo el proceso de codificación, compilación, prueba en emulador...y prueba en hardware real mediante flashcart, en este caso en una GBA SP.
GBDK: Game Boy C Programming - Counter To 90 [GAMEBOY HOMEBREW] https://www.youtube.com/watch?v=iXYEmAc2buESaludos.