2D mit DirectX9
-
Hi
Ich weiß das man frueher mit DDraw 2D Spiele machen konnte.
Aber wie mach ich das heute? DDraw ist zwar noch dabei in der DirectX 9 SDK, aber
Dokumentiert wird es nicht mehr.
(Jedenfalls fand ich nichts dabei)DDraw wurde glaub ich seit DX7 nicht weiterentwickelt. Hat es überhaupt noch Zukunft sich da einzuarbeiten. Wird DirectDraw gar ganz aus dem DirectX Packet einamal verbannt werden?
Ich habe versucht mit Direct3d, 2D zu machen aber das erscheint mir zu schwer.
Gibt es noch irgendwo Dokus für DDraw?
-
mit D3D ist es imho wesentlich einfacher...
benutz einfach D3DXSPRITE.
-
Ovaron123 schrieb:
DDraw wurde glaub ich seit DX7 nicht weiterentwickelt. Hat es überhaupt noch Zukunft sich da einzuarbeiten.
Nein, Zukunft sicherlich nicht... Wobei 2D Grafik generell nicht wirklich viel Zukunft hat (zum. auf dem Gebiet Spiele).
Ovaron123 schrieb:
Wird DirectDraw gar ganz aus dem DirectX Packet einamal verbannt werden?
Nein, wahrscheinlich nicht. Das Prinzip, nach dem DirectX aufgebaut ist, gewährleistet Abwärtskompatibilität in jedem Fall. Theoretisch solltest du ein auf DirectX1 geschriebenes Programm noch mit DirectX9 kompilieren können.
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.
Der einzige grössere Nachteil, der mir an DDraw bekannt ist, ist dass du das Alpha-blending Softwareseitig machen musst.Wenn du doch 2D per Direct3D machen willst, dann schau in der Doku mal unter D3DFVF nach. Da steht was von D3DFVF_XYZRHW, was dir weiterhelfen sollte.
EDIT: Oder das zweite Tutorial. Da wird auch noch D3DFVF_XYZRHW benutzt.
-
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?