Lección 01 – Hola Mundo

Aventuras en Megadrive: “Hola Mundo”

 

ANTES DE PROGRAMAR, UN POCO DE TEORÍA

Como cualquier programa en C, la función main es llamada nada más comenzar:

#include <genesis.h>

int main()
{
	return(0); 
}

 

Pero incluso antes de llamar a main, el SGDK puede hacer todo esto por ti:

  • Pone los valores del VDP a los valores por defecto.
  • Limpia la VRAM.
  • Carga 4 paletas de colores: gris, roja, verde y azul.
  • Carga una fuente por si quieres mostrar texto.
  • Inicializa la entrada de los controles.
  • Resetea el sonido y carga un controlador de 2 canales PCM.

Para hacer esto, no te olvides de incluir esta cabecera nada más comenzar el archivo:

#include <genesis.h>

 

Empecemos con el clásico “Hola mundo”. Vamos a escribir un texto en pantalla:

#include <genesis.h>

int main()
{
	VDP_drawText("¡Hola Mundo!", 10, 13);
	return(0);
}

Escribir un texto es tan fácil como usar la función

VDP_drawText(mi_texto,x,y)

Atención: X e Y se expresan en tiles y no en píxels.   1 tile = 8×8 píxels.
Cada carácter es un tile de 8×8 píxels. Para la Megadrive, un carácter no es más que un tile (con el dibujo de la letra). Más adelante aclararemos estos conceptos.

Sin embargo este programa es incorrecto. Aunque en C toda función debe devolver un valor (de ahí el return), para una consola no tiene sentido, significaría que se ha terminado el juego. Veamos…

#include <genesis.h>

int main()
{
	VDP_drawText("¡Hola Mundo!", 10, 13);

	while(1)
	{
		//leer controles
		//mover sprites
		//actualizar marcadores
                //etc

	}
	return (0);
}

Perfecto.  Tenemos un bucle infinito donde en cada frame leemos los controles, movemos los sprites… y finalmente actualizamos la pantalla. Las antiguas TVs de tubo se actualizaban 50 (PAL) o 60 (NTCS) veces por segundo, tenemos que tener esto en cuenta.

Para ello el SGDK nos proporciona la función VDP_waitVSync(). Esta función hace esperar a la MD el momento correcto. Así que el programa 100% MD sera

#include <genesis.h>

int main()
{
	VDP_drawText("¡Hola Mundo!", 10, 13);

	while(1){
		//leer controles
		//mover sprites
		//actualizar marcadores
		//etc
                
                //espera el refresco de pantalla
                VDP_waitVSync();
	}
	return (0);
}

Vamos a probarlo. Abrimos en CB el proyecto que iniciamos en el post anterior.

File / New / Empty File (contestamos que a “añadir el archivo al proyecto”), lo salvamos como main.c

Copiamos/Pegamos el código anterior. Pulsamos Control+F9 para compilar:

tutorial-10

Vamos a probarlo en un emulador de MD. Recomendado GensKmod. Abrimos el emulador y cargamos el archivo rom.bin de la carpeta out.

tutorial-11

 

GITHUB

El código de esta lección, y de todas las demás, lo podrás encontrar en mi github:

https://github.com/danibusvlc/aventuras-en-megadrive

En dicho repositorio podréis encontrar todas las lecciones ordenadas tal y como aparecen en el blog (o casi).

Podéis descargar todas las lecciones en un zip directamente desde Github pulsando en Download:

captura19

Pero también podéis descargar cada lección por separado. Github no da esta facilidad, no obstante podemos usar esta otra web que sirve precisamente para esto:

https://minhaskamal.github.io/DownGit/#/home

Accedemos a Github a la carpeta que queramos, copiamos el enlace, lo ponemos en la web y Download

captura20

Os recomiendo, una vez leída la lección, acceder a github y descargar en zip dicha lección. Descomprimir y abrir en Code::Blocks. A continuación cambiar la ruta del makefile (a la vuestra, en local) y ya podéis compilar para generar la rom.

El único inconveniente es que los espacios salen como “%20”, pero es un mal menor.