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

1

15.02.2010, 15:59

Verlassen des konstruktors ändert Zeiger?

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

Alyx

Treue Seele

Beiträge: 236

Wohnort: Hannover

Beruf: Head Of Software Development

  • Private Nachricht senden

2

15.02.2010, 16:02

Du kannst einen Konstructor so nicht direkt aufrufen ohne Nebenwirkungen zu verursachen. Was du da durch den Aufruf der "Konstruktor-Funktion" bewirkst ist lediglich ein lokales, namenloses Objekt zu erstellen und dessen Konstruktor aufzurufen. Selbst verständlich ist der Pointer anders ;-).

Es gibt eine Möglichkeit dies zu tun, via placement new, aber das geht bei dem was du da vorhast spätestens bei abgeleiteten Klassen ebenfalls nach hinten los.

Pack den doppelt genutzen Quelltext in eine Funktion... gerne wird void Init() genommen und gut ist ;-).

LG
Alyx

3

15.02.2010, 16:31

Kleiner Hinweis am Rande ;)
Du solltest gucken, dass du die Texturen zentralisiert verwaltest, sonst hast du 30 gleiche Sprites, und 30 gleiche Texturen im Speicher, statt nur 1 den du bräuchtest.

4

15.02.2010, 17:53

Danke, Alyx!

E122, das geht dann in Richtung Ressourcenmanager und so? Alles zu seiner Zeit ;) Erstmal wollte ich mit den DirectX-Grundlagen ein größeres Ding machen, wobei sich "größer" hier auf meine bisherigen Projekte bezieht und deshalb eine evtl mehrfach geladene Textur noch keine Probleme bereiten sollte...
ist zwar unschön, aber im Moment noch ein bisschen viel. Wobei ich am Überlegen bin, ob ich im Anschluss eher die Spieleprogrammierung weiter vertiefen sollte (Scherfgen) oder lieber "reines" C++ üben...

the[V]oid

Alter Hase

Beiträge: 775

Wohnort: Aachen

  • Private Nachricht senden

5

15.02.2010, 18:53

Ich würd dir dringend zum Letzteren raten.
<< an dieser Stelle ist eine Signatur verstorben >>

Werbeanzeige