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

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

21

29.05.2003, 08:28

Habe die Engine jetzt auf Singletons umgestellt (tbDirect3D, tbDirectInput, tbDirectSound, tbTextureManager) und auch schon Breakanoid und Galactica angepasst. Und da ist mir noch eine feine Sache eingefallen, die Du bei Deiner EagleX-Engine auch machen kannst...

Es ist ja umständlich, immer folgendes zu schreiben:

Quellcode

1
2
tbDirect3D& D3D = tbDirect3D::Instance();
D3D.GetDevice()->DrawPrimitiveUP(...);


Darum habe ich einfach den "->"-Operator von tbDirect3D überladen. Dieser liefert nun direkt den Zeiger auf die IDirect3DDevice9-Schnittstelle, so dass es dann einfach so geht:

Quellcode

1
2
tbDirect3D& D3D = tbDirect3D::Instance();
D3D->DrawPrimitiveUP(...);

Patrick

Alter Hase

Beiträge: 1 264

Wohnort: Düren

Beruf: Fachinformatiker für Anwendungsentwicklung

  • Private Nachricht senden

22

29.05.2003, 10:48

@David:
Moin,

das hatte ich aus dem ganz einfachen grund nicht vor, da die tbDirect3D ja noch andere funktionen hat als das Device :D

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

23

29.05.2003, 10:52

Das ist doch jetzt kein Argument!
Es ist doch eigentlich unsinnig, alle Methoden von IDirect3DDevice9 zu kapseln und in tbDirect3D zu stecken. Das tue ich nur bei den Methoden, wo es sich wirklich lohnt, z.B. bei SetRS usw., wo eine Look-Up-Tabelle benutzt wird, um doppeltes Setzen von Render-States zu verhindern usw..

Ansonsten: viel Spaß beim Kapseln der 116 Methoden von IDirect3DDevice9! :)

Patrick

Alter Hase

Beiträge: 1 264

Wohnort: Düren

Beruf: Fachinformatiker für Anwendungsentwicklung

  • Private Nachricht senden

24

29.05.2003, 11:50

Ich meine die anderen Funktionnen aus der klasse die nix mit IDirect3DDevice9 zu tun haben ;)

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

25

29.05.2003, 12:31

Die kann man ja immer noch ganz normal mit dem "."-Operator ansprechen:

Quellcode

1
2
3
tbDirect3D& D3D = tbDirect3D::Instance();
D3D.MethodeDieNichtVonIDirect3DDevice9Stammt();
D3D->MethodeDieVonIDirect3DDevice9Stammt();

Patrick

Alter Hase

Beiträge: 1 264

Wohnort: Düren

Beruf: Fachinformatiker für Anwendungsentwicklung

  • Private Nachricht senden

26

29.05.2003, 12:42

hm joah so könnte man das machen :) ich überlegs mir mal

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

27

29.05.2003, 12:43

Hat sich bei mir als überaus praktisch erwiesen :)
Man muss sich eben nur merken, welche Methoden gekapselt sind (bei mir sind das SetRS, GetRS, SetTSS, GetTSS, SetSS, GetSS, SetTexture, GetTexture, SetTransform, GetTransform, SetFVF und Present).

Shark_3D

Treue Seele

  • »Shark_3D« ist der Autor dieses Themas

Beiträge: 311

Wohnort: Hannover

Beruf: Schüler

  • Private Nachricht senden

28

30.05.2003, 08:23

Also noch mal zum Topic Thema:Immer wenn ich etwas inna Klasse statisch mach krieg ich den Linker Error :kotz: Was ihr mir gesagt habt war zwar schön und gut aber das Problem hats auch nicht beseitigt.

Ach un wann nennt man ne Klasse eigentlich singleton?
"Immer die doppelte Menge"
(Kaufmannsregel Nr.355 von der Lehrkassette 3)

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

29

30.05.2003, 08:31

Ich habe Dir doch schon geschrieben: wenn Du ein statisches Element hast, musst Du es in der CPP-Datei erneut deklarieren. So:

H-Datei:

Quellcode

1
2
3
4
5
6
7
8
class CStaticClass
{
public:
    static int iIrgendeineZahl;
    static float fIrgendeineKommazahl;

    ...
};


CPP-Datei:

Quellcode

1
2
3
// Statische Variablen deklarieren
int CStaticClass::iIrgendeineZahl;
float CStaticClass::fIrgendeineKommazahl;

Shark_3D

Treue Seele

  • »Shark_3D« ist der Autor dieses Themas

Beiträge: 311

Wohnort: Hannover

Beruf: Schüler

  • Private Nachricht senden

30

30.05.2003, 08:54

hmm aber wenn ich da mache krieg ich immer Fehler ala :
Neudefintion oder so.Hmm ich guck nochmal vielleicht hab ichs ja doch irgendwie falsch gemacht ;)

Also es bringt nichts ich hab jetzt die RA_D3D Klasse

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class RA_API RA_D3D
{
private:
     RA_D3D (void);
     static RA_D3D  m_Instance;//The one and only :)
     LPDIRECT3D9 m_pD3D;
     LPDIRECT3DDEVICE9 m_pD3DDEVICE;
     HWND hWnd;

public:
HRESULT InitD3D();
static RA_D3D          &getInstance      (void)   { return (m_Instance); } 

};


Und dann die Init function

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
HRESULT  RA_D3D::InitD3D()
{
                            
RA_D3D RA_D3D::m_Instance = NULL;
  WNDCLASSEX WindowClass = {
                              sizeof(WNDCLASSEX), 
                              CS_CLASSDC, 
                              WindowProc, 
                              0, 
                              0,
                              GetModuleHandle(NULL),
                              NULL,
                              NULL,
                              NULL,
                              NULL,
                              "Direct3D window", 
                              NULL};
                  
    if (!RegisterClassEx(&WindowClass))
    return(0);             
        
    if(FAILED(this->hWnd = CreateWindowEx(NULL,"Direct3D window",
                             "DXInit",
                             WS_VISIBLE | WS_OVERLAPPEDWINDOW,
                             GetSystemMetrics(SM_CXSCREEN) / 2 - 800 / 2,
                             GetSystemMetrics(SM_CYSCREEN) / 2 - 600 / 2,
                             800,
                             600,
                             NULL,
                             NULL,
                             GetModuleHandle(NULL),

                            NULL)))
    {
        ERRORMSG("ERRORWin");
    }
    RA_D3D &D3D = RA_D3D::getInstance();
  if(FAILED(this->m_pD3D=Direct3DCreate9(D3D_SDK_VERSION)))
  {
  
    
 ERRORMSG("ERROR");
  }
 


return 0;
}


FEHLER:

Quellcode

1
2
D:\RaProjekt\RA_D3D.CPP(13) : error C2655: 'm_Instance' : Definition oder Neudeklaration im aktuellen Gueltigkeitsbereich unzulaessig
        d:\raprojekt\ra_d3d.h(11) : Siehe Deklaration von 'm_Instance'
"Immer die doppelte Menge"
(Kaufmannsregel Nr.355 von der Lehrkassette 3)

Werbeanzeige