TUTORIAL: MULTICOLOR TILE

SCRIVIAMO IL PROGRAMMA!

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.

Ritorna ai tutorial