Allgemeines

Bearbeiten

Mein Versprechen aus dem vorigen Kapitel, die Struktur SDL_Rect zu erläutern, werde ich jetzt einlösen: sie speichert ein Rechteck mit seiner Position und seiner Größe. Dabei enthält sie die 4 Variablen x, y, w, h. Wobei x und y die Position des linken oberen Punktes des Rechtecks beinhalten und w Breite sowie h Höhe des Rechteckes als Wert haben. Hier als kleines Beispiel das Bild eines Rechtecks und dessen Programmierung in der SDL:

 

 SDL_Rect rect;
 rect.x = 100;
 rect.y = 100;
 rect.h = 80;
 rect.w = 160;

Sinn und Zweck

Bearbeiten

Bloß warum nun ein Rechteck fürs Blitten? Nun, zuerst einmal lässt sich damit die Position und Größe des Bereiches des Bildes, der auf das andere Surface (meist Videosurface) geblittet wird, bestimmen, was vor allem nützlich ist, wenn man eine Reihe von Bildern in einem gespeichert hat (z. B. bei einer Animation). Die aber noch viel wichtigere Möglichkeit ist, dass man die Position des ausgeschnittenen Bereiches auf die geblittet wird bestimmen kann. Wie das explizit geht, beschreibt dieser kurze Code Ausschnitt:

Beispiel der Nutzung einer SDL_Rect Struktur zum Blitten

Bearbeiten

Quellcode

Bearbeiten
 ...
 SDL_Rect src, dst;
 src.x = 0;
 src.y = 0;
 src.w = image->w;
 src.h = image->h;
 dst.x = 100;
 dst.y = 200;
 dst.w = image->w;
 dst.h = image->h;
 SDL_BlitSurface(image, &src, screen, &dst);
 ...

Erläuterungen

Bearbeiten

Das Rechteck "src" ist hier der Bereich, der aus dem Quellbild "image" herauskopiert wird und in dem Rechteck "dst" auf dem Bildschirm eingefügt wird. Es ist aber zu beachten, dass ich hier das komplette Surface "image" herauskopiere, da ich x und y auf 0 und w sowie h auf image->w sowie image->h gesetzt habe. Theoretisch könnte man dasselbe Ergebnis durch weglassen des Rechtecks "src" und durch setzen des zweiten Parameters der Blitting Funktion als "NULL". Wichtig ist aber, dass die SDL noch keine Bilder stretchen kann. Deshalb muss man, falls man zwei verschiedene Rechtecke in der Blitting Funktion benutzt, deren Größe abgleichen.

Falls man eine Oberfläche mit einem Rechteck, welches größer oder kleiner als diese Oberfläche ist, auf eine andere blitten will, so wird dies nicht funktionieren. Die Größe des Rechtecks für das Ziel beim blitten muss dieselbe Größe haben, wie das, welches den Ausschnitt beschreibt, aus welchem herauskopiert wird. Dies liegt daran, dass die SDL von sich aus nicht vergrößern und quetschen kann.