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

01.02.2008, 14:18

DirectX Problem - Buch: Spieleprogrammierung mit DirectX

Hi, ich bin gerade am Lernen mit DirectX umzugehen und stoße auch auf viele Probleme. Ich konnte zwar viele alleine lösen, doch jetzt verharre ich seit 3 Tagen bei einem Problem.

Das Spiel soll ein kleiner Space-Shooter werden, allerdings ist das erstmal unrelevant.

Ich habe die viel von den Klassen aus dem im Titel-stehenden Buch genommen.
Dazu habe ich noch 2 andere Klassen.

die cGame und die cPlayer Klasse (im Beispielprojekt befindet sich noch eine nicht fertige cShot Klasse...)

Das Problem ist, dass ich beim Initialisieren des Spielers, genauer gesagt der Ressourcen ein Problem bekomme.

Die Funktion:

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
int cPlayer::Init(cDirect3D *Direct3D, cAudio *Audio, cResourceManager *ResourceManager)
{
    //////////////////////////////////////////////////////////////

    m_pDirect3D = Direct3D;
    m_pAudio    = Audio;
    m_pResourceManager = ResourceManager;
    m_pSpritePlayer = new cSprite;

    m_pSpritePlayer->Create(m_pDirect3D->GetDevice(), m_pResourceManager, 3);
    m_pSpritePlayer->SetSpeed(600.0f, 600.0f);
    m_pSpritePlayer->SetPosition(50, 50);

// Wenn dies aufgerufen wird, findet der Fehler statt. Allerdings erst beim Beenden

//    m_pResourceManager->AddTexture("Sprites/Player/Player1.png");

//    m_pResourceManager->AddTexture("Sprites/Player/Player2.png");

//    m_pResourceManager->AddTexture("Sprites/Player/Player3.png");


// Sofern dies danach ausgeführt wird, stürzt das Spiel gleich beim Start ab!

//    m_pSpritePlayer->AddTexture(m_pResourceManager->GetTexture("Sprites/Player/Player1.png"));

//    m_pSpritePlayer->AddTexture(m_pResourceManager->GetTexture("Sprites/Player/Player2.png"));

//    m_pSpritePlayer->AddTexture(m_pResourceManager->GetTexture("Sprites/Player/Player3.png"));

    /////////////////////////////////////////////////////////////


    return 0;
}


Das Beispielprojekt könnt ihr hier Downloaden:
http://rapidshare.com/files/88317710/Game.rar.html

Edit: Ich vergaß, das Beispielprojekt ist eine CodeBlocks-Project Datei

Hoffe ihr versteht es und könnt mir helfen. ;)

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

2

01.02.2008, 14:25

Gut:
-du hast die Stelle gepostet von der du vermutest, dass dort der Fehler entsteht
-du hast den Code zur Verfügung gestellt.
-du hast genannt woher du die Idee hast.

Schlecht:
-nirgends steht der Fehler bzw. genaue Fehlerbeschreibung.


Es wäre daher in deinem eigenen Interesse, wenn du kurz das Problem beschreiben würdest, weil so gibst du auch den Leuten, die kein Code::Blocks haben oder nicht die Zeit/Geduld haben sich das Projekt unterzuladen, die Chance dir zu helfen. :)
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

3

01.02.2008, 14:29

Es ist kein Fehler, der nach dem kompilieren angezeigt wird.

Das Programm startet und stürzt einfach wieder ab (Normale "Hat einen Fehler gefunden"-Meldung). =/

3dcoder

Frischling

Beiträge: 40

Wohnort: Krefeld

  • Private Nachricht senden

4

01.02.2008, 14:43

Meine Vermutung:

"Sprites/Player/Player1.png" wird nicht gefunden und die Textur ist damit intern im ResourceManager nur als null-Pointer vorhanden. Damit gibts dann den Absturz beim Beenden des Programms (wenn du den Null-Pointer freigeben willst).

Da die Textur null ist, stürzt der zweite Block direkt am Anfang ab da m_pSpritePlayer->AddTexture irgendetwas mit der Textur macht und versucht diese zu dereferenzieren?!

Grüße

5

01.02.2008, 14:49

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
// Textur hinzufuegen

void cResourceManager::AddTexture(LPCSTR lpFileName)
{
    // testen, ob die Textur bereits vorhanden ist

    LPDIRECT3DTEXTURE9 lpTexture = GetTexture(lpFileName);

    // wenn sie nicht vorhanden ist, wird sie wie

    // gewohnt erzeugt

    if(lpTexture == NULL)
    {
        D3DXIMAGE_INFO ImageInfo;
        D3DXGetImageInfoFromFile(lpFileName, &ImageInfo);

        D3DXCreateTextureFromFileEx(m_lpD3DDevice,
                                    lpFileName,
                                    ImageInfo.Width,
                                    ImageInfo.Height,
                                    1, 0,
                                    D3DFMT_UNKNOWN,
                                    D3DPOOL_MANAGED,
                                    D3DX_FILTER_NONE,
                                    D3DX_FILTER_NONE,
                                    0, 0, 0,
                                    &lpTexture);

        // und in die Map unter ihrem Namen eingefuegt

        m_MapTextures[lpFileName] = lpTexture;
    }
}


C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// Textur suchen und ggf. zurueckgeben

LPDIRECT3DTEXTURE9 cResourceManager::GetTexture(LPCSTR lpTextureName)
{
    // Iterator fuer die Suche in der Map

    map<string, LPDIRECT3DTEXTURE9>::iterator result;

    // Nach dem Namen der Textur suchen

    result = m_MapTextures.find(lpTextureName);

    // wenn der Name nicht in der Map vorhanden ist

    // NULL zurueckgeben

    if(result == m_MapTextures.end())
    {
        return NULL;
    }

    // sonst den Zeiger auf die Textur zurueckgeben

    return result->second;
}


Nunja, Die Datei ist vorhanden (Der Pfad ist auch 100% richtig, auch wenn ich Player1.png eingebe und eben dann die Textur ins Verzeichnis schiebe funktioniert es auch nicht).

Von daher könnte man das eigentlich auschließen, oder?

Edit:
m_pSpritePlayer->AddTexture[...]
Speichert die Textur (bzw. den Zeiger) nur in einen Vektor.

Die cGame Klasse initialisiert durch die anderen Klassen (cSprite, cAudio, cResourceManger...) eben diese Komponenten.
Dies geschieht durch einen Zeiger und dann "new cKlasse".

Danach wird Player.Init aufgerufen und bekommt den Zeiger auf diese Klassen überliefert.

3dcoder

Frischling

Beiträge: 40

Wohnort: Krefeld

  • Private Nachricht senden

6

01.02.2008, 14:58

Bau mal eine Ausgabe in GetTexture ein die ausgibt was genau der Returncode der Funktion ist. Es sollten da drei mal null und drei mal nicht-null ausgegeben werden.
In GetTexture sollte der Inhalt von "m_MapTextures[lpFileName]" nach dessen Zweisung niemals null sein. (Wenn deine Annahme stimmt, dass das Bild gefunden wird)

Bist du mal mit dem Debugger durch das Programm gelaufen? Dann müsstest du feststellen wo _genau_ der abstürzt.

Grüße

7

01.02.2008, 15:36

Der Debugger funktioniert bei mir nicht (also der integrierte Debugger von Visual C++ 2008 funktioniert nicht in CodeBlocks. =/)

Die ResourceManager::AddTexture Funktion gibt jetzt den Zeiger auf die Textur zurück
Ich habe das jetzt mal gemacht:

C-/C++-Quelltext

1
2
3
4
5
6
7
// PlayerInit [...]

    LPDIRECT3DTEXTURE9 lpReturnTexture = m_pResourceManager->AddTexture("Sprites/Player/Player1.png");
    if (lpReturnTexture == NULL)
    {
        MessageBox(0, "Player-Textur konnte nicht erzeugt werden", "Fehler", MB_OK);
        return -1;
    }


Die MessageBox erscheint...

Nunja, die Sounds findet er auch (sind auch so angegeben) und es ist richtig angegeben.
Auch mit nur "Player1.png" und die Textur dann in das gleiche Verzeichnis geht auch nicht. =/

3dcoder

Frischling

Beiträge: 40

Wohnort: Krefeld

  • Private Nachricht senden

8

01.02.2008, 16:46

Also wenn die MessageBox erscheint dann konnte doch offensichtlich die Textur nicht geladen werden und der Fehler scheint beim Aufruf von D3DXCreateTextureFromFileEx zu sein?!

Da weiss ich leider nicht weiter da ich mit DirectX noch nie was gemacht hab :)

Grüße

9

01.02.2008, 22:53

Die Funktion funktioniert. Ich hatte es ovrher auch schon ohne Klasse probiert und da funktionierte es. Eventuell stimmt da irgendwas mit den Zeigern nicht?

Werbeanzeige