Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

30.05.2008, 15:09

2D Engine mit DirectX9

Guten Tag allerseits :)
Ich würde gerne mal ein paar Sprites Figuren auf dem Bildschirm gegeneinander "antreten lasseen".
Hab früher mal ne kleine Engine für ISO-Grafiken auf SDL Basis programmiert.
Musste dann aber einsehen, das die SDL im Grafikbereich bezüglich Leistung schon eher zu schwach ist - für mein Vorhaben jedenfalls.

Nun habe ich mich mit DirectX9 etwas eingearbeitet und auch einige Methoden gefunden, wie man relativ einfach 2D Grafik realisieren kann.
Dabei bin ich auf die Methode ID3DXSprite gestossen.

Was denkt ihr. Ist diese Methode als Basis geeignet? Oder gibt es etwas was eurer Meinung nach dagegen spricht?

gruss neptun

2

30.05.2008, 15:16

Ich benutze zwar OpenGL aber mit ID3DXSprite wirste glaub ich ganz glücklich werden.
Lieber dumm fragen, als dumm bleiben!

TrommlBomml

Community-Fossil

Beiträge: 2 117

Wohnort: Berlin

Beruf: Software-Entwickler

  • Private Nachricht senden

3

30.05.2008, 16:14

jo, kann jonathan_klein nur unterstützen. ID3DXSprite ist sehr effizient und flexibel, damit wirste zufrieden sein.

Anonymous

unregistriert

4

30.05.2008, 16:26

neptun
Ich würde dir vorschlagen, allein schon aus Gründen falls du in solch eine Berufsrichtung gehen möchtest, erstmal auf D3DX zu pfeifen.

Eine Sprite-Klasse zu schreiben mit einem Texturloader ist kein Kunsterwerk und sollte für einen Anfänger innerhalb von wenigen Stunden über den Tisch sein. Man sollte immer erst wissen was dahinter steckt, bevor man es benutzt. ;)

Dazu ist der Lernfaktor viel höher und man kann das dort gesammelte Wissen auch auf andere Bereiche übertragen.

Ich habe dir mal 3 Funktionen zum Starten rausgesucht, die für dich für so einen Weg von elementarer Wichtigkeit sind:
Microsoft Developer Network: IDirect3DDevice9::CreateTexture
Microsoft Developer Network: IDirect3DDevice9::DrawPrimitive
Microsoft Developer Network: IDirect3DDevice9::CreateVertexBuffer


Im Grunde genommen erstellst du eine kleine Klasse, z. B. Sprite und darin einen Bitmap-Loader um eine Bitmap zu laden, dann erstellst du einen Vertexbuffer und kannst den Zeichnen. Sehr einfach halt. :)

Wie man so einen VertexBuffer füllt und zeichnet findest du hier:
ZFX: ZFX Graphics Series - Folge 2

Für einen Texturloader einfach nur fragen, wenn du nicht weiterkommst. :)

Einschlägige Frimen sagen sehr gerne: Richtige Informatik beginnt erst wenn man hinter den Kulissen ist und gelernt hat wie es geht, nicht wie man es nur verwendet. ;)

5

30.05.2008, 20:54

Danke für die Antworten.
Das Verständniss ist mir schon sehr wichtig - das sieht du ganz richitg ulong :)
Deshalb werde ich dein Vorschlag auch beherzigen.

Mich verwirrt aber diese Vertex Geschichte im Zusammenhang mit 2D-Grafik schon ein wenig. Ich hab jetzt einige Übungen bezüglich DirectX9 hinter mir und bringe es auch zustande einen Vertex bzw. IndexBuffer anzulegen und dessen Inhalt zu rendern. Aber wozu das ganze für 2D Grafik?
Eigentlich würde mir ja einen Zeiger auf den Backbuffer reichen. Dann könnte man ziemlich einfach die Farbwerte reinkopieren. Aber anscheinend muss man da einen Umweg gehen und erst zwei Dreiecke zusammensetzen und diese dann texturieren. Ich bin davon ausgegangen, das die DXSprite Klasse, das irgendwie eleganter und direkter löst. Aber dem scheint wohl nicht so zu sein.

Wenn ich dich jetzt richtig verstanden habe empfiehlst du verständnisshalber die ganzen D3DX Funktionen weg zu lassen und einen solchen Ansatz zu wählen:

Quellcode

1
2
3
4
5
6
7
8
9
    D3DXMATRIX Ortho2D; 
    D3DXMATRIX Identity;
    
    D3DXMatrixOrthoLH(&Ortho2D, WindowWidth, WindowHeight, 0.0f, 1.0f);
    D3DXMatrixIdentity(&Identity);

    g_pd3dDevice->SetTransform(D3DTS_PROJECTION, &Ortho2D);
    g_pd3dDevice->SetTransform(D3DTS_WORLD, &Identity);
    g_pd3dDevice->SetTransform(D3DTS_VIEW, &Identity);


Edit:
Ups, da hab ich ja auch wieder D3DX Funktionen drinnen. :X

6

30.05.2008, 20:58

Bin ich Blöd oder lese ich da dauernt D3DX bei dir im Code?!

Und wenn jeder alles neu schreiben würde, d.h. das Rad neu erfinden würde, wären viele Spiele heute noch nicht fertig. Es dauert schlicht weg zu lange, alles selber zu schreiben. Einer der Gründe, warum es Game Programming Gems usw. gibt. Einfach damit man sich nicht alles neu ausdenken muss, sondern vorhandene, ausgefeilte Ansätze übernehmen kann. Man kann das vllt. noch optimieren(das bezweifel ich bei D3DX) ...
Devil Entertainment :: Your education is our inspiration
Der Spieleprogrammierer :: Community Magazin
Merlin - A Legend awakes :: You are a dedicated C++ (DirectX) programmer and you have ability to work in a team? Contact us!
Siedler II.5 RttR :: The old settlers-style is comming back!

Also known as (D)Evil

Anonymous

unregistriert

7

30.05.2008, 21:06

neptun
Wie das mit der Mathematik geht findest du auf ZFX sehr genau in den weiteren Tutorials von Stefan Zerbst, der hat das sehr gut für Anfänger verständlich gemacht.

btw.: Du kannst dir sicher sein D3DX-Frei zu coden, wenn du die d3dx9.h nicht einbindest und alles kompiliert bekommst. ;)

Deviloper
Er soll das Rad ja nicht neu erfinden, er soll lernen wie es funktioniert. D3DX hat keinen sehr hohen Lernfaktor und fördert meiner Erfahrung nach, nicht sehr besonders die Kreativität bei der Programmierung ansich, sondern nur für "schöneren Look", auch entspricht es oft nicht den eigenem Coding-Stil. Wenn er weiß wie so eine Sprite-Klasse funktioniert und selbst schon mal eine geschrieben hat, wird er sicherlich auch in Zukunft seine eigene nehmen, eben weil sie sein ist, er dadurch mehr gelernt hat als durch ID3DXSprite, sie beliebig erweitern kann und sogar optimieren kann. :)

btw. Alles kann man nicht bei D3DX optimieren, aber einiges. ;)

8

30.05.2008, 22:03

Bezüglich den D3DX Matrix Funktionen sagt Zerbst aber:

Zitat


Die Direct3D Extension Funktionen hingegen werden von Microsoft in Kooperation mit Chip-Herstellern wie Intel und AMD implementiert und sind entsprechend für verschiedene Prozessoren optimiert. Beim ersten Aufruf einer D3DX Funktion wird die vorhandene CPU ermittelt und die Funktionspointer werden mit der entsprechenden Implementierung verbunden. Dabei gibt es Funktionsrümpfe für MMX, 3DNow!, SSE, SSE2 usw. So lange man also nicht selber in SIMD Assembler programmiert sind die D3DX Funktionen in ihrer Geschwindigkeit unseren reinen C Implementierungen weit überlegen.

Dann sollte man also zumindest die Matrix Funktionen doch verwenden?

Anonymous

unregistriert

9

30.05.2008, 22:06

neptun
Wenn du die Berechnungen nich verstehst --> Machs per Hand.
Wenn du die Berechnungen verstehst --> Machs mit D3DX.
Verstehen jetzt nicht im Detail (dafür muss man schon Matheprof werden), sondern nur warum hier das so gemacht wird.

Ich mach nur erstere Variante, da ich hauptsächlich nur noch portabel code und ich so selbst meine Matheklassen ohne Probleme auf einem Windows, Linux, Mac und DS ans laufen kriege ;)

Werbeanzeige