Arriviamo ora al codice, da inserire nel file tutorial_ctile.c
:
#include "midres.h"
Il primo file da includere è proprio midres.h
, che contiene tutte le definizioni necessarie per usare i metodi e le strutture dati della libreria, e dei vari ambienti target. Ad esempio, contiene le definizioni dei colori utilizzate da img2tile
che sono differenziate in base al computer di riferimento.
#include "tutorial_mctile.h"
Il secondo file da includere è tutorial_mctile.h
, il cui contenuto è stato generato da img2tile
e che abbiamo già descritto in questa pagina.
#define TILE_GHOST_MOVING TILE_START + TILE_COUNT + 1
Per poter gestire il movimento fluido di un tile multicolore è necessario generare tutti i “fotogrammi” intermedi di tale movimento. Questo richiede, tuttavia, di poter disporre di uno spazio libero. Il primo spazio libero si trova proprio dopo l'ultimo tile definito, ovvero TILE_START+TILE_COUNT + 1
void main() {
Da qui inizia il programma vero e proprio.
mr_tile_position x = 0;
Posizioniamo il fantasmino alla prima posizione dello schermo. Usiamo il tipo mr_tile_position
perché è in grado di rappresentare una posizione che va da -32768 a +32768 e quindi è in grado di gestire le risoluzioni a larghezza più diffuse, come 320 pixel.
mr_init_multicolor();
Ora inizializziamo il sottosistema grafico, indicando la preferenza per un sistema multicolore. Attenzione, però: se in fase di compilazione scegliete un target che non supporta questo tipo di grafica, il sistema passerà automaticamente alla modalità monocolore.
mr_clear_bitmap(MR_SCREEN_DEFAULT);
Cancelliamo lo schermo di default.
mr_tile_setcolor(MR_TILE_BACKGROUND, TILE_COLOR0); mr_tile_setcolor(MR_TILE_COLOR0, TILE_COLOR1); mr_tile_setcolor(MR_TILE_COLOR1, TILE_COLOR2); mr_tile_setcolor(MR_TILE_COLOR2, TILE_COLOR3);
Ora possiamo impostare i colori che ci sono stati comunicati da img2tile
. Questo passo è necessario in quanto per ogni tile multicolor alcuni colori sono condivisi e altri sono in comune.
mr_tileset_load("mctile.bin", MR_TILESET_0, TILE_START, TILE_COUNT);
Carichiamo ora i tile generati da img2tile
. Notare che il nome del file è stato abbreviato: questo si è reso necessario da limite che hanno molti filesystem di computer a 8 bit.
mr_tile_prepare_horizontal_extended(MR_TILESET_0, TILE_GHOST, TILE_GHOST_WIDTH, TILE_GHOST_HEIGHT, TILE_GHOST_MOVING);
Questa funzione prepara (ovvero: precalcola) tutti i fotogrammi intermedi per il fantasmino. Per poterla richiamare è necessario indicare su quale tileset si sta operando, il numero del macrotile, le dimensioni (in tile) e, infine, la posizione da cui iniziare per salvare i tile così ricalcolati. Da questo momento in poi sarà possibile usare TILE_GHOST_MOVING
al posto del macrotile originale, al fine di ottenere un movimento fluido.
mr_tileset_visible(MR_TILESET_0);
Rendiamo attivi i tile ridisegnati.
while (1) { mr_start_frame();
Eseguiamo ora un loop infinito e, all'ingresso del loop, segnaliamo che stiamo iniziando a disegnare un frame.
++x; mr_tile_moveto_horizontal_extended(MR_SCREEN_DEFAULT, x, MR_SCREEN_HEIGHT >> 1, TILE_GHOST_MOVING, TILE_GHOST_WIDTH, TILE_GHOST_HEIGHT, MR_COLOR_LIGHT_BLUE);
Ad ogni giro spostiamo il fantasmino a destra di un pixel. Richiamando la funzione mr_tile_moveto_horizontal_extended
stiamo, in realtà, ridisegnando TILE_GHOST_MOVING
orizzontalmente ogni volta. Il simbolo MR_SCREEN_HEIGHT
viene valorizzato al numero di tile per colonna. Ne consegue che disegniamo il fantasmino a partire dalla posizione x
appena ricalcolata, e a metà altezza dello schermo. L'ultimo parametro è il colore ma, come abbiamo spiegato poco sopra, non è detto che sia il colore utilizzato per disegnare il tile. Diciamo che è un suggerimento laddove l'impostazione dei colori fosse insufficiente.
if ((x >> MR_TILE_WIDTH_FACTOR) > MR_SCREEN_WIDTH) { x = -TILE_GHOST_WIDTH*MR_TILE_WIDTH_IN_PIXEL; }
Questo controllo serve a far sì che il fantasmino, una volta uscito dalla parte destra dello schermo, rientri dalla parte sinistra. Calcoliamo il limite usando il parametro MR_TILE_WIDTH_FACTOR
, che dipende dalla risoluzione. L'ascissa viene messa pari alla larghezza del macrotile, di modo da avere come effetto un'entrata “a comparsa” da sinistra.
mr_end_frame(4);
Al termine segnaliamo che il fotogramma si è concluso. Il numero 4
sta ad indicare che, se sono passati meno di 4/60-esimi di secondo, il sistema dovrà aspettare quel tempo prima di ricominciare a disegnare. In questo modo, la velocità di disegno sarà identica a prescindere dalla piattaforma utilizzata.