Seitenleiste

Community

Spieleprogrammierung

Allgemein

Tutorials

Framebuffer

Um irgendetwas auf dem Bildschirm des Gameboy Advance ausgeben zu können, müssen wir den Framebuffer befüllen. Die Register beim Gameboy Advance sind Memory-Mapped, dh. wir können aus C heraus einfach per Zeiger (also Adresse) auf die Register (und damit auch auf den Framebuffer) zugreifen. Der Framebuffer ist an der Stelle 0x6000000. Die Pixel sind durch 16 Bit codiert (short), dh. wir haben 16 Bit Farben zur Auswahl.

Das allererste Bit ist ungenutzt. Die nächsten 5 Bits kodieren den Blau-Anteil, die mittleren 5 den Grün- und die letzten 5 Bit codieren den Rot-Anteil. Dh. wir können uns ein Makro definieren, was uns aus je einer Zahl pro Anteil eine einzige short-Zahl macht. Um, sollten wir einmal mit den short-Zahlen rechnen wollen, kein seltsames Verhalten zu haben (zwecks Vorzeichen) wählen wir für den Zeiger auf den Framebuffer den unsigned short-Datentyp.

#define RGB(r,g,b)  ((r)+(g<<5)+(b<<10)) 
 
unsigned short* framebuffer=(unsigned short*)0x6000000;

Nun können wir den Framebuffer wie ein Array benutzen. Wenn wir also einzelne Pixel setzen wollen, dann kann das über eine x und y-Koordinate geschehen. Da wir uns hier auf einem (recht alten) mobilen Gerät befinden, sollten wir darauf achten, nicht zu viel Aufwand zu betreiben und etwas auf die Resourcen achten. x und y-Koordinate sollten hier also char-Werte sein.

Zu Beachten ist, dass der Bildschirm des Gameboy Advance 240×160 Pixel groß ist. Um also die Stelle eines Pixels im Framebuffer auszurechnen, benötigen wir die Breite des Bildschirms:

framebuffer[x+y*240]=RGB(0,0,0);

Zu Beginn des Spiels sollten wir auf jedenfall den Framebuffer mit einer von uns definierten Farbe füllen (zum Beispiel schwarz). Dazu können wir eine Funktion schreiben:

void clrScr()
{
    char x=0, y=0;
    for (; x<240; x++)
    {
        for (; y<160; y++)
        {
            framebuffer[x+y*240]=RGB(0,0,0);
        }
    }
}