[Note that there is also an English Version of this Tutorial aviable]
Viele Menschen (auch ich vor 1 oder 2 Jahren) benutzen bei ihrem ersten grafischen 2D-Spiel die SDL. (Auch wenn ich das nicht mehr empfehlen würden
). Dabei taucht oft das Problem mit der Rotation auf, die bei der SDL nur unzureichend mitgeliefert wird. Der Ausweg aus dieser Kriese lautet SDL_Gfx, das mit der Rotozoom-Bibliothek eine kleine aber feine Funktionssammlung bietet. Der Wermutstropfen bei der Sache: Die Rotation findet nur um den Linken oberen Eckpunkt statt, was für viele Anwendungen sehr ungeschickt ist. Deshalb habe ich diesen kleinen – aber Feinen – Artikel geschrieben, um euch näherzubringen, dass es eigentlich ganz einfach ist, ein SDL_Surface mit SDL_Gfx zentriert rotieren zu lassen.
Die Theorie
Ein Bild sagt mehr als Tausend Worte:

Danke an saru-online.com für die Grafik
In der Praxis
Das ganze wird in der Praxis wie folgt implementiert. Wie immer hier kommt zuerst der Code, und anschliessend die Erklärung dazu. Der Folgende Source befindet sich in dem Teil eures Quellcodes, in dem ihr euer Objekt rendert, und wird in jedem Frame aufgerufen.
(Hinweis: Ich gehe hier davon aus, dass schon Grundkenntnisse im Umgang mit der SDL vorhanden sind.
// Vorher Deklarierte Variablen: // pTestImg (SDL_Surface*) Das Surface für das Ausgangsbild // TestRect (SDL_Rect) Das Rect, mit der Eigentlichen Position unseres Objekts // Temporäres Surface, auf dem das Rotierte ausgangsbild abgebildet ist SDL_Surface* tmp = rotozoomSurface (pTestImg, RotationAngle , 1, 0); // Die Positionsverschiebung bei der Rotation ausgleichen // Erst an dieser Stelle wird bewirkt, dass die Rotation zentriert aussieht SDL_Rect tmprect = TestRect; tmprect.x -= tmp->w/2 - pTestImg->w/2; tmprect.y -= tmp->h/2 - pTestImg->h/2; // Das Surface schlussendlich auf den Screen blitten SDL_BlitSurface (tmp, NULL, pScreen, &tmprect); SDL_FreeSurface (tmp);
Hinweis: Wenn das Surface Colorkeying verwendet, muss der Colorkey auf ‘tmp’ nochmal angwendet werden !
Doch was geschieht hier eigentlich? Der Funktion rotozoomSurface (aus SDL_Gfx) übergeben wir unser Ausgangssurface, und sie gibt uns eine um Rotation Angle gedrehte Version im Rückgabewert zurück.
In den darauffolgenden Zeilen nehmen wir die nötige Verschiebung der Koordinaten des Objektes vor, wie im Abschnitt 'Theorie' Besprochen.
Danach können wir das temporäre Rotierte Surface einfach auf den Bildschirm blitten (dabei natürlich die temporäre Position angeben), und tata, wenn ihr alles richtig in euer Projekt eingegliedert habt, dann seht ihr jetzt ein Zentriert Rotierendes Surface. Wenn nicht, und ihr glaubt, es liegt an dem Hier stehenden Code, oder etwas ist unzureichend erklärt, scheut euch nicht, euch in den Kommentaren auszulassen.
Kleiner Tipp noch: Wenn sich euer Bild nicht in jedem Frame neu rotiert, kann es Performancetechnisch schneller sein, einfach das Bild zwischenzuspeichern
Euer E333
Quellen
Dank gehört zusätzlich ICH1994 für einige wichtige Hinweise. (s. Kommentar #1)
