Letzte Einträge »

Kugeln

Hier sollte ein Bild sein

Eine kleine Szene mit Diffuser Beleuchtung und Spiegelung

Ihr dürft euch nun zu Recht fragen, was das hier ist? Nun auf diesem Bild ist eine Szene aus meinem kleinen mini-Raytracer zu sehen, den ich in den letzten Tagen, ein bisschen aus Langeweile, aber auch, da ein wenig Abwechslung sicher nie schadet, geschrieben habe. Er kann bisher nur Diffuse Beleuchtung, und Reflexionen, doch ich werde ihn jetzt immer wenn mir Langweilig ist ein wenig weiter vorantreiben. Das ganze ist in C++ realisiert worden.

Ja, ansich nichts besonderes, doch ihr wollt hier ja auch wieder ein bisschen neues sehen, nicht

Tipp: Wer einen guten und schnellen einstieg sucht, dem kann ich diese Tutorials Empfehlen.

E333

Wie einige mittlerweile wohl gemerkt haben, ist hier etwas weniger als sonst los. Nun, das hat mehrere Gründe:

Wir haben es jetzt Winter bzw. Weihnachtszeit, d.h. ich verbringe allgemein nicht soviel Zeit vor dem Computer.

Zudem, (Augen scharfstellen, der interessante Teil beginnt erst^^), war ich in letzer Zeit auch mit einem Schulischen Projekt beschäftigt, und bin es immernoch. Es geht darum, den USB-Anschluss für die Kommunikation zwischen Software und Hardware (ja, zu was auch sonst) zu benutzen. Dieses Tutorial half mir dabei sehr. Wie man daraus herauslesen kann, ist das ganze mithilfe der libFTDI und einem Board von Sparklefun gemacht. Nach anfänglichen Startschwierigkeiten (und ein bisschen Nachgefrage)  konnte ich mich weitgehend an dem Tutorial orientieren, wobei ich das ganze unter Windows umsetzte. So war es kaum verwunderlich, das ich die USB-Ampel schnell nachgebaut hatte. Nun beschäftige ich mich gerade mit Input.

Euer E333

Bloglogo

Endlich existiert eines, zu sehen ist es im Header – auch wenn dort ein wenig Platzmangel herrscht. Erstellt habe ich es mit Gimp, und ich hoffe sehr, es gefällt euch!

Bald gibt es hier auch ordentlich was  zu sehen, und freut euch: Auch live auszuprobieren :)

Euer E333

Es gibt einmal wieder einen neuen Download :) Falling World ist ein kleines Minispiel, das innherhalb von 2 Tagen entstanden ist, aber ich will euch nicht länger davon abhalten:

HIER geht es zur Projektseite mit dem Download

Zentrierte Rotation mit der SDL

[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

SDL_Gfx Dokumentation

SDL Multimedia Library

Dank gehört zusätzlich ICH1994 für einige wichtige Hinweise. (s. Kommentar #1)

Follow

Get every new post delivered to your Inbox.