CLICK HERE FOR ENGLISH VERSION
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 de texto 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 Sí a «añadir el archivo al proyecto»), lo salvamos como main.c
Copiamos/Pegamos el código anterior. Pulsamos Control+F9 para compilar:
Vamos a probarlo en un emulador de MD. Recomendado GensKmod. Abrimos el emulador y cargamos el archivo rom.bin de la carpeta out.
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:
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
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.
English Version
Lesson 1 – HELLO WORLD
A BIT OF THEORY BEFORE CODING
As every program in classic C, main is called at first when executing:
#include <genesis.h>
int main()
{
return(0);
}
But even before calling main SGDK would do this for you:
- Default values are set for VDP.
- Clear VRAM.
- Load 4 default palettes: grey, red, green and blue
- Load a text font in memory.
- Reset and detect megadrive control pads.
- Reset sound and load a basic driver ( 2 PCM channels).
Just write down this line and all the magic is in:
#include <genesis.h>
Let’s start with classic «Hello World»:
#include <genesis.h>
int main()
{
VDP_drawText("Hello World!", 10, 13);
return(0);
}
Show a text is easy:
VDP_drawText(my_tex,x,y)
Take note X and Y are in tiles, not in pixels. 1 tile = 8×8 pixels.
Every text character is one tile 8×8 pixels. From Megadrive side, a character is a tile with drawing inside (text drawing). We will clarify this later.
However, this is program is not valid. From Megadrive side, finish main program is a non-sense, means game is finished and nothing more to do. So let’s repair this…
#include <genesis.h>
int main()
{
VDP_drawText("Hello World!", 10, 13);
while(1)
{
//read controls
//move sprites
//update IU
//etc
}
return (0);
}
Perfect. Infinite loop. Every loop we do some things: read controls, move some elements, etc. Old TVs update screen every 50 (PAL) or 60 (NTCS) frame per second (fps).
SGDK provides function VDP_waitVSync()
. This function syncs MD to update screen in the right moment. So a 100% MD program is like this:
#include <genesis.h>
int main()
{
VDP_drawText("Hello World!", 10, 13);
while(1)
{
//read controls
//move sprites
//update IU
//etc
//wait screen refresh
VDP_waitVSync();
}
return (0);
}
Let’s do it. Open CodeBlocks using project made last lesson.
File/New/Empty File (answer Yes «add file to Project»), save file as «main.c».
Copy+Paste code. Push Control+F9 to compile:
Test it in an emulator. At this point, use GensKmod. File / Load file rom.bin, this file is inside out folder in your project folder.
GITHUB
All lesson’s code will be available in my github:
https://github.com/danibusvlc/aventuras-en-megadrive
You can download ALL lessons from Github, just click in Download:
But better to download only lesson you want to play with. Github doesn’t allow this, we have to use another web-service:
https://minhaskamal.github.io/DownGit/#/home
Just enter in my Github and choose folder you want to download, copy browser link and click in Download:
Last step is open project in Code::Blocks and change makefile path, you have to put your SGDK path (and not use mine). Feel free to play!