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

03.05.2017, 18:02

[Gelöst]Probleme mit selbstgeschriebener Modell - Funktion

Hallo,

ich habe wieder einmal ein Problem mit der TriBase.

Ich wollte der TriBase Modell Klasse noch ein Funktion hinzufügen, mit der man Effekte ändern/tauschen kann. Das wäre von Vorteil, wenn man z.B.: immer die gleiche Waffe hat, sie aber je nach Team verschieden einfärben möchte. Jedoch bekomme ich beim entladen des veränderten Modells immer einen NullPointer (oder so was ähnliches :P ).

Hier einfach mal der ganze Code:

Die Funktion um den Effekt zu verändern. Sie erwartet den Index des zu verändernden (dwOldEffect) Effekts und den des Effekts mit den neuen Einstellungen (dwNewEffect):

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// Neues Material aus der gleichen Datei lesen
tbResult tbModel::ChangeMaterial(DWORD dwOldEffect, DWORD dwNewEffect)
{
    // Alten Effekt-Header speichern
    tbModelEffectHeader OldEffectHeader;
    
    OldEffectHeader = m_pEffects[dwOldEffect].Header;

    // Effekt überschreiben
    m_pEffects[dwOldEffect] = m_pEffects[dwNewEffect];

    // Alten Effekt-Header wieder einsetzen (Effektname und Größe des Effektcodes aus dem neuen Effekt nehmen)
    m_pEffects[dwOldEffect].Header = OldEffectHeader;

    strcpy(m_pEffects[dwOldEffect].Header.acName, m_pEffects[dwNewEffect].Header.acName);
    m_pEffects[dwOldEffect].Header.dwEffectCodeSize = m_pEffects[dwNewEffect].Header.dwEffectCodeSize;

    return TB_OK;
}


Für alle die die TriBase nicht haben/kennen. Die nötigen Strukturen und Klassen:


Die Exit Funktion des Models:

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
36
37
38
39
40
41
// Herunterfahren
tbResult tbModel::Exit()
{
    char acVariable[256];

    if(!m_bExtraDataOnly)
    {
        // Puffer löschen
        TB_SAFE_DELETE(m_pVertexBuffer);
        TB_SAFE_DELETE(m_pIndexBuffer);

        // Effekte löschen
        for(DWORD dwEffect = 0; dwEffect < m_dwNumEffects; dwEffect++)
        {
            // Texturen freigeben
            for(DWORD dwTex = 0; dwTex < m_pEffects[dwEffect].dwNumTextures; dwTex++)
            {
                if(m_pEffects[dwEffect].apTexture[dwTex])
                {
                    // Texturvariable im Effekt zurücksetzen, damit die Texturschnittstelle
                    // freigegeben wird (mit SetTexture wurde der Referenzzähler erhöht)
                    sprintf(acVariable, "Texture%d", dwTex + 1);
                    m_pEffects[dwEffect].pEffect->GetEffect()->SetTexture(acVariable, NULL);

                    // Den Texturmanager auffordern, die Textur freizugeben
                    if(!tbTextureManager::IsInitialized()) tbTextureManager::Instance().ReleaseTexture(m_pEffects[dwEffect].apTexture[dwTex]);
                }
            }

            // Den Code und die Effektklasse löschen
            TB_SAFE_MEMFREE(m_pEffects[dwEffect].pcCode);
            TB_SAFE_DELETE(m_pEffects[dwEffect].pEffect);
        }

        // Effekt-Array löschen
        TB_SAFE_MEMFREE(m_pEffects);

        // Lichter löschen
        TB_SAFE_MEMFREE(m_pLights);
    }
}


Mit diesem Makro lösche ich das Modell:

C-/C++-Quelltext

1
#define TB_SAFE_DELETE(x)       {if((x)) {delete (x); (x) = NULL;}}         // Sicheres Löschen


Das müsste doch normalerweise den Destruktor aufrufen und der Destruktor ruft die Exit Funktion (von Oben) auf.

Wenn ich debugge, und das Fenster schließe (nachdem ich ein paar mal die Effeket getauscht habe, was auch ohne Probleme funktioniert), stoppt das Programm an der Stelle, an der ich mit dem Makro TB_SAFE_DELETE(Model) das Modell entladen möchte. Mit dem Debugger kann ich auch nicht weiter arbeiten, da die Ausnahme kommt, bevor irgend ein Breakpoint in der Exit Funktion erreicht wird (was mich sehr wundert).

Ich hoffe ihr versteht mein Problem und könnt mir helfen

Grüße Patrick

P.S.: Hier ist noch ein Bild vom Fehler

(Link)
Albert Einstein sagte: "2 Stunden mit einem netten Mädchen fühlen sich an wie 20 Minuten, 20 Minuten auf einem heißen Ofen fühlen sich an wie 2 Stunden. - Das ist Relativität"

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »Patrick Z.« (04.05.2017, 15:09)


BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

2

03.05.2017, 18:05

Da ist kein Bild. Zumindest sehe ich da nur ein kaputtes Bild.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

3

03.05.2017, 18:07

Da ist kein Bild. Zumindest sehe ich da nur ein kaputtes Bild.

Mach Rechtsklick "Bild in neuem Tab öffnen" (Außerdem wäre da sonst die Website schuld)
Albert Einstein sagte: "2 Stunden mit einem netten Mädchen fühlen sich an wie 20 Minuten, 20 Minuten auf einem heißen Ofen fühlen sich an wie 2 Stunden. - Das ist Relativität"

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

4

03.05.2017, 18:54

Du hast eine URL zu einer HTML-Seite als Bild eingefügt. Das geht natürlich nicht.

Aus der Meldung vermute ich, dass da etwas gelöscht werden soll, was schon vorher mal gelöscht wurde.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

5

03.05.2017, 18:57

Aber wo?
Albert Einstein sagte: "2 Stunden mit einem netten Mädchen fühlen sich an wie 20 Minuten, 20 Minuten auf einem heißen Ofen fühlen sich an wie 2 Stunden. - Das ist Relativität"

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

6

03.05.2017, 19:16

Breakpoint in die Funktion setzen, Stacktrace anschauen.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

7

03.05.2017, 20:00

Wo soll ich den Breakpoint setzen? Nach dem Fehler bringt sichs nichts, weil das Programm nie so weit läuft. Und vor den Fehler passen alle Werte, exakt bis zum Fehler.
Albert Einstein sagte: "2 Stunden mit einem netten Mädchen fühlen sich an wie 20 Minuten, 20 Minuten auf einem heißen Ofen fühlen sich an wie 2 Stunden. - Das ist Relativität"

8

03.05.2017, 21:27

Na mit dem ganzen unsicheren Gefrickel ist das ja auch kein Wunder. Benutze Container wie vector und string, smartpointer und gucke dir size_t sowie nullptr an. Halte dich bloß von solchen 'Hilfsmakros' fern die brauchst du bei genannten Dingen eh nicht.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

9

03.05.2017, 21:46

Wo soll ich den Breakpoint setzen?
Genau in der Zeile, wo dir der Debugger das Problem anzeigt.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

10

04.05.2017, 07:10

Wo soll ich den Breakpoint setzen?
Genau in der Zeile, wo dir der Debugger das Problem anzeigt.

Das Problem entsteht ja runtime u:d da bleibt das Programm sowieso stehen.
Albert Einstein sagte: "2 Stunden mit einem netten Mädchen fühlen sich an wie 20 Minuten, 20 Minuten auf einem heißen Ofen fühlen sich an wie 2 Stunden. - Das ist Relativität"

Werbeanzeige