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

idontknow

unregistriert

31

27.07.2010, 20:39

Würde heri auch gerne mal eine Design Frage stellen!

Aus vielen 2D Frameworks kennt man sowas in der Art:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
class Image;

class Sprite
{
public:
   Sprite(Image* texture);
   void Draw(Window* wnd);
   // ...
};


Der springenden Punkt ist. Image ist die Textur des Sprites. z.b. in SFML wird das wie oben gehandhabt. ich programmiere mit DirectX, denke aber in OGL wird es ähnlich sein (weswegen ich oben genanntes Design nicht nachvollziehen kann...): Eine Textur ist an Device gebunden. Ein Sprite wird mit einer Textur gekoppelt! Ergo: Mit dem Binden einer Textur an einen Sprite steht das Device/Fenster in das gerendert wird implizit fest.... deshalb verstehe ich das SFML Design z.b. nicht. Außer OGL handhbat das anderst!

Naja auf jedenfall so würde mein Design gekürz so aussehen:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Textur
{
public:
   Device _Device;
   Texture _Texture;
};

class Sprite
{
public:
   Sprite(Texture* texture);
   void Draw(); // Renderfenster/Device steht mit der gewählten Textur fest!
   // ...
};


Naja, da ich das so noch nie gesehen habe, sondenr nur ersteres bin ich jetzt sehr verwirrt :).

Anmerkungen/Vorschläge bitte :)

32

27.07.2010, 21:48

Hab nur Anmerkungen, keine Vorschläge. ;)

Eine Textur ist nur dann an den Device gebunden, wenn du dessen Speicher (Pool) nutzt.
Es gibt nämlich viele Wege, eine Textur zu laden.
Also kann ich deine Ableitungen mit Koppeln am Sprite etc. nicht nachvollziehen.
fka tm

idontknow

unregistriert

33

27.07.2010, 22:09

jop, aber idR ist die Textur im Grafikarten RAM. Demnach legt die Textur fest in welches Device ein Sprite der diese Textur benutzt gerendert wird.

34

27.07.2010, 22:47

Ich bin dabei mir die Klasse für den Vertexbuffer zu schreiben die momentan so aussieht

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
class VertexbufferD3D9 : public Vertexbuffer
{
private:
   DeviceD3D9 m_Device;
   IDirect3DVertexBuffer9* m_vBuffer; // Fehlermeldung "IntelliSense: Ein Objekt vom Typ ""DeviceD3D9"" einer abstrakten Klasse ist nicht zulässig:"

   int Size;
public:
   VertexbufferD3D9();
   ~VertexbufferD3D9();

   void Create(const DeviceD3D9& Device, int Size);
}


In einer anderen Klasse, hat es geklappt das ich eine Klasse, die von ein Interface abgeleitet wurde, als normale Klasse erstellen konnte... Warum da nicht?

Mfg Male

idontknow

unregistriert

35

27.07.2010, 22:48

Hast halt ne abstrakte Klasse erwischt die ne Pure virtuelle Methode hat`? Wo genau kommt der Fehler denn?

36

27.07.2010, 22:52

Der Fehler kommt da, wo ich ihn mit den Kommentar makiert habe... DeviceD3D9 hat keine virtuellen Funktionen, wird von einer Klasse abgeleitet die rein virtuelle Funktionen hat

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

37

27.07.2010, 22:54

wird von einer Klasse abgeleitet die rein virtuelle Funktionen hat

Dann hast du eine nicht oder nicht richtig definiert. Bei VS sollte da noch stehen an welcher Funktion es gelegen hat. Schau mal nach, ob die implementiert ist und wenn ja, ob du die Funktion richtig geschrieben hast und die Argumente passen.

38

27.07.2010, 23:21

Lag wohl daran... Ich hab in der Interface Klasse z.b. "virtual bool CreateDevice() = 0;" stehen gehabt, habs durch "virtual bool CreateDevice() {}" ersetzt und jetzt geht es
Vielen Dank
Mfg Male

39

28.07.2010, 08:15

Argh, falsch.
Wenn die Klasse schon abstrakt war (d.h. eine oder mehrere Methoden =0) hat das schon seinen Sinn. Du solltest eigentlich eine Klasse davon ableiten und die Methoden dort definieren.
Wenn die Klasse nicht abstrakt war, sollte sie auf jeden Fall auch alle Methoden implementieren. Und zwar nicht einfach mit einem leeren Block, wie du es getan hast. Du gibts ja nichtmal einen Wert zurück, das sollte eigentlich eine Warnung geben.
Also, wenn du die CreateDevice Funktion nicht brauchst, lösche sie komplett, wenn du sie brauchst, implementiere sie in dieser oder einer abgeleiteten Klasse (die du dann stattdessen benutzt) ordentlich, so dass sie auch das tut, was man von ihr erwartet.
Lieber dumm fragen, als dumm bleiben!

40

28.07.2010, 11:39

Meine Interface klasse hat bis jetzt nur diese eine Funktion und die abgeleitete Klasse hat die auch definiert... So sah das aus

C-/C++-Quelltext

1
2
3
4
5
6
7
8
class Device
{
public:
   Device() {}
   virtual ~Device() {}
   
   virtual bool CreateDevice() = 0;
};


Die Device für Direct3D 9 sah so aus

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class DeviceD3D9 : public Device
{
private
   IDirect3D9* pD3D;
   IDirect3DDevice9* pDevice;
   D3DPRESENT_PARAMETER D3Dpp;
public
   DeviceD3D9() // Zeiger auf Null setzen
   ~DeviceD3D9() // Com Schnitstellen Releasen

   bool CreateDevice() { 
     // Device erstellen
   }

   IDirect3DDevice9* GetDevice() { return pDevice; }
}; 


An welche Funktion es lag, kam nicht... Der hat nur an dieser Stelle rot unterstrichen

Werbeanzeige