Hallo.
Ich bin neu hier und eigentlich auch kein richtiger Spieler. Allerdings ist eines der wenigen Spiele die ich alle paar Wochen/Monate mal spiele PG3D. Wesentlich mehr Zeit als PG3D zu spielen verbringe ich damit über die Probleme und Lösungen zum fix der Grafikproblemen zu lesen :).
Bis vor kurzem habe ich für mich noch keine zufriedenstellende Lösung gefunden. Dann stieß ich im Web auf ein Projekt (ich glaube es heißt ddhack) das eine Lösung für Wing Commander und andere Spiele zu seien scheint. Leider nicht für PG3D. Aber da ich Softwareentwickler bin und mir gerne mal solche Quellcodes anschaue habe ich mal versucht das Ganze für PG3D anzupassen.
Leider habe ich keine Ahnung von OpenGl (oder generell von Grafikprogrammierungdas :)), dass in diesem Projekt verwendet wird und die Umsetzung gefiel mir auch nicht so sehr. Ich war also gezwungen :), weil mir die eigentliche Idee die DirectDraw DLL neu zu implementieren nicht aus dem Kopf ging, so etwas komplett selbst zu programmieren. Mein erster Versuch in OpenGl hat ganz gut funktioniert aber irgendwie fehlt mir bis heute das richtige Verständnis für OpenGl und als ich bei einem Besuch bei meinem Vater (der fast jeden Tag PG3 spielt und ständig Probleme mit Grafik und Abstürzen hat) feststellen musste das auf seinem verbugten PC OpenGl gar nicht funktioniert :), habe ich mich lieber Direct3D zugewannt und den Grafikteil nochmal geschrieben. Nach ein paar Tagen einlesen habe ich das besser verstanden als OpenGl.
So nun habe ich euch mit meinem Geschwafel vermutlich genug genervt :). Ich komme dann mal zum eigentlichen Punkt.
Wie bereits gesagt habe ich eine DLL geschrieben, die die Grafikfunktionen, die PG3D verwendet, in Direct3D umsetzt. Damit sind zumindest bei mir die meisten Grafikprobleme schon mal behoben. Eine Ausnahme bildet der Mauszeiger, der entweder weil ich was falsch gemacht habe oder weil das Spiel nicht immer den alten Mauszeiger übermahlt, manchmal so etwas wie "Geisterbilder" hinterlassen hat. Das Problem habe ich noch nicht ganz gelöst aber den größten Teil konnte ich, indem ich den alten Mauszeiger selbst übermale wenn das Spiel den Zeiger neu zeichnet, beheben. Was mir nicht gefallen hat, ist das in DirectDraw das Seitenverhältnis nicht eingehalten wird. In meiner Implementierung wird das Seitenverhältnis des Bildschirms berücksichtigt und das Spiel, hoffentlich zuverlässig, im Original Seitenverhältnis angezeigt (bei PG3D ist das 4:3). Was ich im Original zumindest nicht so einfach hinbekommen habe, ist einen Screenshot vom Spiel zu machen und weil ich schon immer mal verstehen wollte wie ein Bitmap aufgebaut ist, fängt die DLL den Druck der "Drucken"-Taste jetzt ab und erstellt ein Bitmap im Spielverzeichnis. Der Screenshot ist nach Datum und Uhrzeit benannt um doppelte Namen möglichst zu vermeiden. Die letzte Sache die ich hinzugefügt habe ist ein Fenstermodus. Wenn man im Spiel die F1-Taste drückt erscheint ein Dialog zur Auswahl des Modus. Die Auflösungen sind erst mal fix einprogrammiert und sollten für jede Monitorgröße ausreichen.
Im Anhang findet ihr einen meiner Screenshots, den ich allerdings zu einem PNG gewandelt habe, weil das nur halb so groß ist.
Ups ich habe schon wieder so viel geschrieben.
Also bis jetzt habe ich die aktuelle DLL nur auf meinen beiden Rechnern, beide Windows 7 64Bit, einmal mit älterer und einmal mit neuerer NVIDIA Grafik, mit PG3D 1.0 und 1.02, PG2 (UK) 1.02, mit und ohne PG2UK220.EXE, getestet. Ich sehe zumindest momentan keinen Grund warum das Ganze nicht auch unter Windows XP und Windows Vista, 32 Bit oder 64 Bit, laufen sollte. Voraussetzung ist mindestens DirectX 9 (oder zumindest die DirectX 9 DLLS D3D9.DLL, D3DX9_42.DLL und vermutlich D3D8THK.DLL).
Wenn ihr Lust habt, würde es mich freuen wenn ihr meine DLL mal ausprobieren könntet und mir ein Feedback gebt. Solltet ihr keine Lust haben und genervt von meinem langen Text sein ignoriert mich bitte oder schimpft mich aus wenn euch das lieber ist :).
PS.: Die DLL liegt auch im Anhang und muss einfach nur in das Spielverzeichnis kopiert werden. Wenn das Spiel damit nicht läuft oder andere Probleme macht einfach die DLL wieder entfernen und das Spiel sollte so laufen wie immer.
Mit freundlichen Grüßen euer
Herbie