Grafiken anzeigen
Die Bibliothek SDL_image
SDL_image
ist eine Erweiterung für SDL, mit der auch .png
-Dateien eingelesen werden können (sonst gehen auf Windows nur .bmp
-Bilder).
SDL_image
benötigt ein eigenes include
:
#include <SDL_image.h>
Ein Bild laden
Ein Bild namens fruechte.png
kannst Du folgendermaßen laden:
IMG_Init( IMG_INIT_PNG );
SDL_Surface *fruechte = IMG_Load("fruechte.png");
Die Fensteroberfläche
Gezeichnet wird auf der Oberfläche des Fensters. Diese hat den Typ SDL_Surface*
und muss einmalig zu Beginn erstellt werden:
SDL_Surface *surf = SDL_GetWindowSurface(win);
Das Fenster aktualisieren
Jedes Mal, nachdem wir in ein Fenster gezeichnet haben, müssen wir das Fenster aktualisieren. Sonst sehen wir nichts:
SDL_UpdateWindowSurface(win);
Ein ganzes Bild darstellen
Um das Bild aus dem vorigen Beispiel dann auch darzustellen, reicht eine Zeile:
SDL_BlitSurface(fruechte, NULL, surf, NULL);
gefolgt vom Aufruf von SDL_UpdateWindowSurface
.
Rechtecke definieren
Um Grafiken an bestimmten Stellen auf dem Bildschirm zu plazieren, müssen wir Rechtecke definieren. Dazu benötigen wir den Datentyp SDL_Rect
.
SDL_Rect zielposition;
Diese Rechtecke funktionieren wie ein struct
. Sie enthalten vier Werte:
x
- die Position auf der x-Achse.y
- die Position auf der y-Achse.w
- die Breite.h
- die Höhe.
Alle diese Angaben sind in Pixeln. Wir können ein Rechteck mit Werten befüllen:
zielposition = {x: 0, y: 64, w:32, h:32};
Einen rechteckigen Bildausschnitt zeichnen
Wir könne diese Rechtecke nun verwenden, um einen Ausschnitt des Bildes an eine bestimmte Stelle des Fensters zu zeichnen. Dazu brauchen wir zwei Rechtecke: Eines definiert den zu kopierenden Bereich, eines den Bereich im Fenster. Zunächst deklarieren wir zwei Variablen, die wir dafür verwenden möchten.
Die Rechtecke ersetzen die zwei NULL
-Parameter im Aufruf von SDL_BlitSurface()
, z.B. so:
SDL_Rect bildausschnitt;
SDL_Rect zielposition;
bildausschnitt = {x: 0, y: 0, w:400, h:100};
zielposition = {x: 64, y: 64, w:32, h:32};
SDL_BlitSurface(fruechte, &bildausschnitt, surf, &zielposition);
Wichtig: Das &
vor den beiden SDL_Rect
-Variablen nicht vergessen!