2D mit DirectX9
-
Kann mann nicht einfach ein Pixel in den Speicher schreiben und ihn so auf dem
Bildschirm darstellen?So eine putpixel(x,y,color) funktion das wäre vorerst mal das einfachste fuer mich.
-
struct CUSTOMVERTEX { FLOAT x, y, z, rhw; // The transformed position for the vertex. DWORD color; // The vertex color. }; CUSTOMVERTEX vertices[] = { { 150.0f, 50.0f, 0.5f, 1.0f, 0xffff0000, }, // x, y, z, rhw, color { 250.0f, 250.0f, 0.5f, 1.0f, 0xff00ff00, }, { 50.0f, 250.0f, 0.5f, 1.0f, 0xff00ffff, }, };
Das müsste sowas sein oder?
Einfach "z" immer auf dem gleichen wert lassen, dann habe ich 2d?
-
Auch wenn es kein Paradebeispiel für Objektorientiertes Codedesign ist:
http://www.fh-landshut.de/~jamann/SpaceFighter beta 0.7.zip
vielleicht hiflt dir das
-
Ovaron123 schrieb:
Einfach "z" immer auf dem gleichen wert lassen, dann habe ich 2d?
Wenn du den Depth Buffer angeschaltet hast, wird der Z Wert dazu verwendet, zu bestimmen welches Objekt vor einem anderen liegt. Also solltest du z.B. für eine Hauswand den Z-Wert 2 nehmen und für die Person, die davor steht den Wert 1. iirc...
-
Kann mann nicht einfach ein Pixel in den Speicher schreiben und ihn so auf dem
Bildschirm darstellen?So eine putpixel(x,y,color) funktion das wäre vorerst mal das einfachste fuer mich.
und das langsamste *g*
-
und das langsamste *g*
Naja ich dachte eigentlich 3D-Operationen wären rechenintensiver.
-
Bist du dir sicher, dass ne Putpixel Funktion so viel einfacher wäre? Du kannst doch mit D3D einfach nen (quadratischen) VBuffer erstellen, der zum Beispiel deine Spielfigur darstellt (Mit Alpha-Testing Textur drauf). Diesen VBuffer kannst du jetzt per Matrix ganz einfach in der Gegend rumschieben und rotieren. Es ist wahrscheinlich auch viel einfacher Animationen zu machen, indem man einfach animierte Texturen verwendet. Mit ne PutPixel Funktion müsstest du das alles selbst proggen. Imho ne ganze Menge Arbeit. Kleine, einfache 2D-Projekte sind mit DirectDraw imho schneller und einfacher zu lösen. Für grössere, kompliziertere ist D3D sicher der bessere Weg.
Ausserdem müssen ja nicht wirklich 3D Rechenoperationen durchgeführt werden, weil du vortansformierte (RHW) Vertices benutzt.
-
godlikebot schrieb:
Generell sollte DirectDraw für 2D Spiele ausreichen. Direct3D für 2D Spiele zu verwenden ist zwar schneller, doch der Aufwand ist grösser und ausserdem sind 2D Spiele i.d.R. längst nicht so hardwarehungrig, dass man diesen Performance-Boost durch D3D benötigen sollte.
Ne, das ist ziemlich falsch. Davon abgesehen, dass ich hardwarebeschleunigtes Alphablending, Zoomen und Rotieren habe, was für ein 2D-Spiel durchaus nicht unwichtig ist, ist DirectDraw einfach von der Darstellungsqualität und Performance her schon keine Alternative.
Heute braucht man kein Spiel mehr mit DDraw anfangen und Microsoft empfiehlt auch ausdrücklich, das nicht zu tun. DPlay ist schon deprecated, wird mit DDraw sicherlich auch bald passieren.
-
Optimizer schrieb:
Ne, das ist ziemlich falsch. Davon abgesehen, dass ich hardwarebeschleunigtes Alphablending, Zoomen und Rotieren habe, was für ein 2D-Spiel durchaus nicht unwichtig ist, ist DirectDraw einfach von der Darstellungsqualität und Performance her schon keine Alternative.
Heute braucht man kein Spiel mehr mit DDraw anfangen und Microsoft empfiehlt auch ausdrücklich, das nicht zu tun. DPlay ist schon deprecated, wird mit DDraw sicherlich auch bald passieren.Hmm, das wusste ich nicht. Hatte mir DDraw auch nur flüchtig angeschaut. Aber die vielen Dinge, die bei D3D von der Graka erledigt werden Sprechen wohl wirklich eher dafür als für DDraw.
-
Ich habe jetzt das passende für mich gefunden:
Ich locke den BackBufferSurface,
krieg so die Speicher Addresse,
Schreibe meine Daten rein,
Unlocke wieder,
und mache "UpdateSurface" um die Daten ins VideoRam zu kopieren.Die passende PutPixel und GetPixel Funktion ist dann leicht geschrieben.
Bloß wie verwirkliche ich das mit den Surfaces in D3D9?
Muß Ich erst ein Surface "createn" und das Surface so groß machen wie meine Anwendung.
Oder hat die Anwendung schon ein sowas wie ein "Surface" das ich locken kann, um dann die VRam Adresse der gesamten Anwendung zu bekommen?