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

killmichnich

unregistriert

1

23.09.2009, 19:25

Meine eigene Engine

Hiho,
ich versuch mir grad ne eigene kleine Grafik-Engine zu bauen, die wir vllt in der Schule benutzen können, im Unterricht. Die soll auf DirectX aufgebaut sein, und da liegt mein Problem:
Ich erstell ne dll, mit header und lib die man einfügen soll, und da drin stehen dann Klassen usw. die ich brauchen kann um DirectX zu initialisieren, Sprites zu erstellen etc.. Jetzt würde ich das aber gerne so gestalten, dass ich das DirectX SDK da nich ständig mitschleppen muss wenn ich meine eigene Engine benutz. Heißt ich will das ganze einfach hier auf meinem PC kompilieren, mit in die Schule nehmen, da ins Projekt einbinden und das soll dann ohne die ganzen DirectX Header und Libs laufen (nur die dlls denk ich halt brauch ich noch ^^).
Kann ich das denn irgendwie hinkriegen wie ich mir das gedacht hab, oder geht das garnicht? ^^

Das Gurke

Community-Fossil

Beiträge: 1 996

Wohnort: Pinneberg

Beruf: Schüler

  • Private Nachricht senden

2

23.09.2009, 19:28

Klar geht das, darfst halt in der API die du bereitstellst nicht auf DirectX bezug nehmen. Was der Compiler nicht sieht, fordert er auch nicht an ;)

killmichnich

unregistriert

3

23.09.2009, 19:31

jo aber ich brauch ja directx für die grafik, sonst krieg ich keine bilder aufn bildschirm ^^

Das Gurke

Community-Fossil

Beiträge: 1 996

Wohnort: Pinneberg

Beruf: Schüler

  • Private Nachricht senden

4

23.09.2009, 19:34

Du wirst also DirectX kapseln müssen. Also immer wenn du eine der DirectX Klassen benutzt, dafür einen "Wrapper" schreiben, der die DirectX Herkunft verbirgt.

killmichnich

unregistriert

5

23.09.2009, 22:32

also ich muss sagen das hört sich jetzt sehr spannend an ...ich weiß nur nich genau wie das gehen soll ôO
hast du vllt iein beispiel oder so? ^^

Und geht das denn einfach das ich das "unsichtbar" mach sodass es nich bemerkt wird ... weil es gibts ja immer noch oder? ^^

Sylence

Community-Fossil

Beiträge: 1 663

Beruf: Softwareentwickler

  • Private Nachricht senden

6

24.09.2009, 07:40

Du machst dir so eine Klasse:

Quellcode

1
2
3
4
5
class WrapperFürX
{
public:
   void macheY();
};


und in der implementierung dann

Quellcode

1
2
3
4
WrapperFürX::macheY()
{
   // Hier werden irgendwelche DirectX funktionen aufgerufen
}


Und fertig.

7

24.09.2009, 08:36

Brauchst man dabei nicht trozdem die Header von DX?
Im Header des Wrappers werden sie ja inkludiert.
Er spart sich dann ja eigentlich nur die DLLs und LIBs von DX

Das Gurke

Community-Fossil

Beiträge: 1 996

Wohnort: Pinneberg

Beruf: Schüler

  • Private Nachricht senden

8

24.09.2009, 08:41

Wie gesagt, es kommt darauf an die Header in den API Headern eben *nicht* zu inkludieren. Das kann man z.B. per #define machen. Immer wenn man die Library selber erstellt, werden die DirectX Header inkludiert, weil sie ja in den .cpp Dateien gebraucht werden.

Wenn man die Library dann einbindet ist das Symbol nicht definiert und er Compiler bekommt die DX Header nicht zu sehen.

Oder man inkludiert die DX spezifischen Sachen erst in der cpp.

Oder man schreibt erstmal ein abstraktes Rendering Interface, das man dann erst in einer ausgelagerten DLL implementiert.

Oder ...

Also es gibt dutzende Wege, Libraries zu wrappen.

Man muss sich halt "nur" merken, dass man in der API die Header der zu wrappenden Library nicht verwenden darf.

xardias

Community-Fossil

Beiträge: 2 731

Wohnort: Santa Clara, CA

Beruf: Software Engineer

  • Private Nachricht senden

9

24.09.2009, 08:50

Was das ganze in C++ manchmal etwas schwierig macht ist, dass man z.B. auch die Header für die Typen der privaten Variablen einer Klasse braucht.

Hier kann man entweder die Klassen vorwärts deklarieren, was jedoch nur funktioniert wenn sie als Pointervariablen vorkommen.

Quellcode

1
2
3
4
5
6
7
8
class D3DDevice; // Vorwärtsdeklaration
class MyGraphicsWrapper
{
private:
    D3DDevice* device;
public:
    ....
}


Wenn in der cpp dann die DX Header included werden kannst du D3DDevice dann auch verwenden. Wenn du Typen aber nicht als Pointer in der Klasse verwenden willst muss der Typ vollkommen bekannt sein. Hier schafft das PImpl Idiom abhilfe:
http://www.gamedev.net/reference/articles/article1794.asp

Sylence

Community-Fossil

Beiträge: 1 663

Beruf: Softwareentwickler

  • Private Nachricht senden

10

24.09.2009, 09:09

Noch einfacher sind abstrakte interface klassen, die dann entsprechend implementiert werden.

Werbeanzeige