Bereich: Kommentare Uhrzeit: 11:03 38.107.191.92
Betreff: 3D-Mau-Mau
Geschrieben von J!0X, 13.04.2007 - 13:30

Editierung: Ich habe Wordpress auf diesem Server eingerichtet, um eine Art Development-Weblog zu beginnen: 3d2m-weblog

Ich habe mir vor einiger Zeit überlegt, mein 2D-Mau-Mau-Spiel einfach dreidimensional mit Tisch, Stuhl und Kartenstapel etc. zu programmieren. Als Grundlage verwende ich OpenGL. Als nächstes habe ich mir überlegt, wie ich die Daten verwalte und verschiedene Objekte zeichne(rendere). Dann bin ich auf das erste Problem gestoßen: Text. Mit OpenGL ist es nicht möglich, einen einfachen Text anzeigen zu lassen.
Zum Glück gibt es für SDL eine Library namens SDL_ttf, die Schriftarten laden und auf verschiedene Weisen rendern kann. Die einfachste Möglichkeit ist, in jeder Frame den Text neu zu rendern, eine Textur zu generieren und diese auf ein Quad(Rechteck) zu bringen. Leider dauert es aber relativ lange, bis ein Text vollständig gerendert ist.
Hier ein Bild: Bild
Die Lösung ist, während des Ladevorgangs alle Buchstaben zu rendern und diese als Texturen zu speichern. Wenn ein Text angezeigt werden soll, zeichnet man für jeden Buchstaben ein Rechteck, das mit der jeweiligen Textur überzogen ist. Die Rechtecke müssen dann n * Breite + i verschoben werden, wobei n der Index des Buchstabens ist (z.B. der 3. Buchstabe), Breite die Breite eines Buchstabens und i der Abstand zwischen den Buchstaben. Natürlich muss man auch Neuzeilen (n) berücksichtigen.

Das nächste Problem ist die Bewegung von z.B. Karten oder der (imaginären) Kamera. Wenn man in jeder Frame ein Objekt um den Wert k verschiebt, bekommt man auf jedem Computer ein unterschiedliches Ergebnis. Das liegt daran, dass jeder Computer unterschiedlich schnelle Hardware hat. Wenn ich auf meinem Computer (AMD 3500+, X850XT)z.B. 30 Frames pro Sekunde bekomme und k = 2 Units ist, ist die Karte nach einer Sekunde (30 Frames) um
k * fps = 60 Units
verschoben. Bei einem anderen Computer, der z.B. nur 10 fps hat, wäre das Objekt um 20 Units verschoben. Es entsteht eine Abweichung von 40 Units.
Man muss sich also mit der Framerate und der Geschwindigkeit eine kleine Gleichung bauen:
frametime = Milisekunden, die für die letzte Frame benötigt wurden
s = Geschwindigkeit
Objekt.x = Objekt.x + s * (frametime / 1000)
s ist also die Anzahl der Units, die das Objekt in einer Sekunde (1000 Milisekunden) zurücklegt.

Diese beiden sind natürlich nicht die einzigen Probleme :D.


Neuen Kommentar schreiben




Sicherheitscode: Die Eingabe ist erforderlich, um Spam und Betrug zu verhindern.
Sicherheitscode konnte nicht geladen werden. Bitte den Admin kontaktieren.

Es sind 0 Kommentare vorhanden.

Apache Server at web.davlozone.de Port 80