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

14.07.2005, 16:13

Problem mit D3DX-Effekten

Ich habe bei meinem Spiel versucht, ein Hauptmenü einzubauen. Wird die Spielfigur von einem Gegner zerstört, sollman ins Hauptmenü zurückgelangen. Dazu habe ich mir eine Funktion SetGameState geschrieben, die genauso aufgebaut ist, wie die von David. Das heißt der alte Zustand wird gelöscht und der neue initialisiert. Alles klappt gut, nur wenn ich einen D3DX-Effekt mittels Release() löschen will, stürzt das Programm ab. Was mache ich falsch?
Ist es möglich, dass bei einem Effekt nur einmal Release() aufgerugen werden darf?
Mein Projekt: Rise of the Sylvan

2

14.07.2005, 17:08

ein bischen code wäre hilfreich 8)

3

14.07.2005, 17:32

ja, du solltest release nur einmal aufrufen. und wieso rufst du das bitte
dann auf, wenn jemand nur in ein menü wechselt?
dann musst du den effect ja anschließend wieder neu laden...
macht meiner ansicht nur bei einem großen projekt mi viel speicher-platz-bedarf sinn.

4

15.07.2005, 10:13

Also ich glaub mit code kann man hier nicht so viel anfangen. Sonst müsste ich das ganze Spiel posten.
Aber Initialisieren, Rendern und Löschen hab ich so gemacht:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
m_pEffect=NULL;
    if (FAILED(D3DXCreateEffectFromFile(g_pD3DDevice,"Data\\Effect.fx",
                                    NULL,NULL,0,NULL,&m_pEffect,NULL)))
    {
        return E_FAIL;
    }
//------------------------------------------------------------------------------

UINT uiPasses;
    m_pEffect->Begin(&uiPasses,0);
    m_pEffect->BeginPass(0);
    
    //etwas rendern


    m_pEffect->EndPass();
    m_pEffect->End();
//------------------------------------------------------------------------------

if (m_pStatusTextEffect!=NULL)  m_pStatusTextEffect->Release();

Und SetGameState():

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
HRESULT CPacman::SetGameState(EGameState NewGameState)
{
    HRESULT r = S_OK;

    // Alten Spielzustand entladen

    switch(m_GameState)
    {
    case GS_MAINMENU:   m_pMainMenu->Exit();        break;
    case GS_GAME:       m_pGame->Exit();            break;
    }

    // ------------------------------------------------------------------


    // Zeit zurücksetzen

    g_fTime = 0.0f;

    m_pStateBlock->Apply();

    // Neuen Spielzustand laden

    m_GameState = NewGameState;
    switch(m_GameState)
    {
    case GS_MAINMENU:   r = m_pMainMenu->Init();    break;
    case GS_GAME:       r = m_pGame->Init();        break;
    }

    return r;
}


So benutz ich Effekte immer. Aber das seltsame ist, dass nur bei Release() von Effekten das Spiel abstürzt. Und man wechselt ja u. U. öfters ins Hauptmenü bzw. Spiel.

Was allerdings funktioniert, ist, die CGame- und CMainMenu-Effekte und-Schriften in der Hauptspielklasse löscht - was das ganze aber nicht gerade übersichtlich macht. Und ich glaub SetGameState hat auch die Absicht, dass nur der Speicher für einen Spielstand reserviert ist.

???
Mein Projekt: Rise of the Sylvan

Werbeanzeige