Modalità bitmap
Bentrovati, oggi vi parlo delle modalità bitmap.
NOTA:
Una bitmap altro non è che una griglia L x H di colori (o indici di colore) dove L è la larghezza (o numero di colonne) e H è l'altezza (o numero di righe). Possiamo puntare un pixel in particolare attraverso le cordinate (x,y) dove l'asse y è orientato verso il basso.
Ad esempio:
I numeri sui pixel indicano la posizione di uno specifico colore nella bitmap.
Il GBA ha 3 modalità bitmap, chiamate Mode 3, Mode 4 e Mode 5 (sono nomi molto originali lo so ). Vediamo le differenze:
Mode 3
dimensioni dello schermo: 240 x 160 pixel
profondità in pixel: 16 bpp (bit per pixel)
page flipping: No
Mode 4
dimensioni dello schermo: 240 x 160 pixel
profondità in pixel: 8 bpp
page flipping: Sì
Mode 5
dimensioni dello schermo: 160 x 128 pixel
profondità in pixel: 16 bpp
page flipping: Sì
Il page flipping è una tecnica che ci permette di ridurre gli artefatti nelle animazioni. Non vi faccio vedere un esempio perché comunque non lo useremo praticamente mai nelle modalità bitmap, però se volete saperne di più potete leggere qui al paragrafo 5.3.
Bisogna notare che mentre in modalità 3 e 5 possiamo usare l'intera gamma di colori disponibili sul GBA, in modalità 4 possiamo usarne solo 256 che sono scelti da noi e che vengono memorizzati nella background palette all'indirizzo 0500:0000.
Visto che un esempio di modalità 3 ve l'ho fatto vedere nel primo capitolo dove abbiamo disegnato un rettangolino sullo schermo, questa volta vi faccio vedere un'esempio di modalità 4 in cui disegniamo un pixel.
Poiché nella video RAM del GBA non è possibile scrivere 8 bit alla volta ma solo 16 o 32, andremo sempre a colorare due pixel alla volta. Per colorare un singolo pixel la procedura è più lenta rispetto alle modalità 3 e 5 perché dobbiamo cancellare il secondo pixel.
Qui definisco le variabili e gli indirizzi dell'altra volta, con l'aggiunta della Background palette (0x05000000), il puntatore alla palette di colori (COLOR_PAL) e una funzione per definire un colore in RGB.
Qui invece abbiamo il programma vero e proprio:
#include <stdlib.h>
#include "mode4.h"
int main(void)
{
//Prendo una posizione casuale compresa tra 0 e la larghezza / altezza dello schermo.
u32 x = rand()%(SCREEN_W + 1);
u32 y = rand()%(SCREEN_H + 1);
//Prendo un colore casuale.
u16 color = RGB15(rand()%31, rand()%31, rand()%31);
//Inizializzo la background palette con colori scelti casualmente, ...
//... ad esclusione del primo elemento che imposto come nero.
COLOR_PAL[0] = RGB15(0, 0, 0);
for(int i = 1; i < 256; i++)
{
COLOR_PAL[i] = RGB15(rand()%31, rand()%31, rand()%31);
}
//Imposto la modalità 4.
REG_DISPCNT = DCNT_MODE4 | DCNT_BG2;
//Seleziono il buffer attuale.
u16 *vidpage = VIDEO_MEM;
u16 *posizione = &vidpage[(x * SCREEN_W + y) / 2]; //Divisione per 2 a causa del divario tra u8 e u16.
//Coloro un pixel casuale (quello preso all'inizio).
if(x & 1)
{
*posizione = (*posizione & color) | (color<<8); //Pixel dispari.
}
else
{
*posizione = (*posizione &~ color) | color; //Pixel pari.
}
while(1);
return 0;
}
Il risultato sarà questo pixel colorato di giallo:
La modalità 5 funziona in modo identico alla modalità 3 che abbiamo visto nel primo capitolo, dovete solo tenere a mente che non abbiamo a disposizione l'intero schermo per poter disegnare, ma solo una piccola parte.
Per il momento è tutto, nel prossimo capitolo iniziamo una parte interessante perché vedremo come far riconoscere i tasti al GBA.
Come sempre se avete qualche domanda, fatela pure.
fonte: https://gbadev.net/tonc/bitmaps.html
tag: @evilespeon @ZedeFire @VincyDarkHeart @Macca