Guten Tag zusammen,
bin gerade dabei, für ein 2D-Spiel eine Klasse zu schreiben, die die Arbeit mit Sprites (DirectX) vereinfacht:
|
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
|
class CSprite
{
private:
LPDIRECT3DDEVICE9 lpD3DDevice; //Zeiger aufs Device/Gerät
LPDIRECT3DTEXTURE9 pTexture; //Zeiger auf die Textur
LPD3DXSPRITE pSprite; //Zeiger auf das Sprite
std::string File; //Pfad und Dateiname der Textur
int FrameWidth, FrameHeight; //Höhe und Breite eines Frames
public:
CSprite(LPDIRECT3DDEVICE9 lpD3DDevicePointer, std::string File);
CSprite(LPDIRECT3DDEVICE9 lpD3DDevicePointer, std::string File, int FrameWidth, int FrameHeight);
};
CSprite::CSprite(LPDIRECT3DDEVICE9 lpD3DDevicePointer, std::string FilePath)
{
File = FilePath;
lpD3DDevice = lpD3DDevicePointer;
D3DXCreateTextureFromFile (lpD3DDevice, File.c_str(), &pTexture);
D3DXCreateSprite (lpD3DDevice, &pSprite);
}
CSprite::CSprite(LPDIRECT3DDEVICE9 lpD3DDevicePointer, std::string File, int FrameWidth, int FrameHeight)
{
//Erst den "ersten" Konstruktor aufrufen (Variablen speichern, Textur laden, Sprite erstellen)
CSprite(lpD3DDevicePointer, File);
//Beschreibung der Textur (= SurfaceLevel 0) holen
D3DSURFACE_DESC SurfaceDesc;
pTexture->GetLevelDesc(0, &SurfaceDesc);
}
|
Der zweite Konstruktor soll bei einem animierten Sprite zum Einsatz kommen und einen std::vector<RECT> mit den Koordinaten der einzelnen Animationsphasen füllen.
Dabei dachte ich mir, dass der zweite Konstruktor einfach den ersten aufrufen könnte, um das Erstellen der Textur und des Sprites nicht doppelt schreiben zu müssen. Scheint auch zu funktionieren, aber:
Wenn ich jetzt eine Instanz mit dem zweiten Konstruktor initialisiere, tritt ein Problem mit pTexture auf: Nach dem Aufruf von CreateTextureFromFile wird der Zeiger korrekt gesetzt, beim Rücksprung in den zweiten Konstruktor aber wird er plötzlich zu 0xcccccc und der Aufruf von GetLevelDesc führt dann zu einem Fehler.
Wie kann das passieren? pTexture ist doch Klassenmember, deshalb hat der Scope des Konstruktors damit nichts zu tun, oder ist das nicht richtig?
Vielen Dank für eure Antworten!
PPretzel