hi!
ich hätte da mal eine frage:
ich habe meine DirectX Initialisierungen in eine Singleton-Klasse verpackt.
mir taugts ja nicht unbedingt, da singleton mehr probleme bringt, als vorteile, aber bitte ...
hier mal meine .h
|
C-/C++-Quelltext
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
class cDX_Interface
{
private:
static cDX_Interface* pDX_Interface;
HWND * m_hWnd;
LPDIRECT3D9 m_D3DObject;
LPDIRECT3DDEVICE9 m_D3DDevice;
cDX_Interface();
cDX_Interface( const cDX_Interface& ); // kopierkonstruktor private, KEIN kopieren mehr möglich
public:
~cDX_Interface(){ Destroy(); }
static cDX_Interface* Create();
BOOL InitDirectX(HWND * phWnd);
LPDIRECT3DDEVICE9 & GetD3DDevice(){return m_D3DDevice; }
HRESULT Destroy();
HRESULT CleanUpDirectX();
}
|
noch der 'wichtige' teil aus der .cpp:
|
C-/C++-Quelltext
|
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
|
cDX_Interface* cDX_Interface::pDX_Interface = NULL;
cDX_Interface::cDX_Interface(): m_D3DObject(NULL),
m_D3DDevice(NULL)
{
//
}
cDX_Interface* cDX_Interface::Create()
{
if (pDX_Interface==NULL)
{
pDX_Interface = new cDX_Interface;
return pDX_Interface;
}
return pDX_Interface;
}
HRESULT cDX_Interface::Destroy()
{
// Speicherbereich mit 0 auffüllen
// Pointer löschen
// Point-to Adresse löschen
if (pDX_Interface)
{
SecureZeroMemory(&pDX_Interface,sizeof(pDX_Interface));
delete pDX_Interface;
pDX_Interface = NULL;
return S_OK;
}
// Keine Objektinstanz zum löschen vorhanden
// RETURN: Invalid_Pointer
return E_POINTER;
}
|
wenn ich nun zb. in meiner WinMain folgenden aufruf mache:
|
C-/C++-Quelltext
|
1
2
3
4
5
6
7
8
9
10
11
12
13
|
cDX_Interface* DX_DEVICE = cDX_Interface::Create();
BOOL initOk = DX_DEVICE->InitDirectX(&hWnd);
if (!initOk)
{
DX_DEVICE->Destroy();
LOGFILE->ShowMsg(ERR_MSG_INIT_D3DDEVICE);
// APP-beenden
PostQuitMessage(WM_QUIT);
}
LPDIRECT3DDEVICE9 refDX_DEVICE = DX_DEVICE->GetD3DDevice();
|
... haut danach auch alles super hin - sprich wenn ich in meiner WinMain dann zb. meine Sprites rendern lasse.
nun sollte aber der renderer auch in eine eigene klasse.
wie oder wo platziert mann sowas am geschicktesten?
könnt ihr mir da einen rat geben?
von der cDX_Interface trau ich mich nicht wirklich ableiten.
sollte ich den renderer auch als eigenständige singleton machen und dann das DX_DEVICE übergeben?
wah mir kommt das alles a bisserl unsauber und gefährlich im bezug auf mem-leaks vor ...