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

Klaus

Treue Seele

  • »Klaus« ist der Autor dieses Themas

Beiträge: 245

Wohnort: Stuttgart

Beruf: Schüler

  • Private Nachricht senden

1

15.01.2004, 16:19

EDIT: Gelöst! :)) | Titel: tbObject::Move-->AccessViol...

Ja, hi! :)

Ich hab da grade mal so ein Problem :rolleyes:

Und zwar hab ich eine (eben bisher) noch ganz einfache Funktion zum Bewegen eines (2D)-Helikoptermodells, also ein Viereck mit Textur draufgeklebt und gesperrtem Z-Buffer. Aber das Zeichnen ist ja eben auch nicht mein Problem. Die Move-Funktion von

Quellcode

1
class CHelicopter : public tbObject


lautet bisher einfach nur:

Quellcode

1
2
3
4
5
tbResult CHelicopter::Move(float fTime)
{
    tbObject::Move(fTime);
    return TB_OK;
}

.

Durch verschiedenes Auskommentieren und so bin ich mir jetzt ganz sicher, dass der Fehler in der tbObject::Move auftritt, wobei ich nicht kapiere, warum.

Der Debugger fliegt mit der Meldung

Zitat

Nicht abgefangene Ausnahme in Heli1.exe (TRIBASED.DLL): 0xC0000005: Access Violation.


auf die Zeile

Quellcode

1
    inline tbVector3 operator * (const float f) const                       {return tbVector3(x * f, y * f, z * f);}


in tbVector3.h

In der tbObject::Move wird das meiner Ansicht nach vier Male aufgerufen:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void tbObject::Move(const float fTime)
{
    // Objekt verschieben: s = v * t
    m_vPosition += m_vVelocity * fTime;

    // Objekt rotieren
    RotateRel(m_vRotation * fTime);

    // Bewegungs- und Rotationsreibung anwenden
    if(m_fMovementFriction != 1.0f) m_vVelocity *= powf(m_fMovementFriction, fTime);
    if(m_fRotationFriction != 1.0f) m_vRotation *= powf(m_fRotationFriction, fTime);

    // Matrizen aktualisieren
    Update();
}

(der Code is ja bekannt :-D )



Interessant ist jetzt, wann der Fehler nur auftritt - nämlich nicht bei jedem Aufruf von Move, sondern nur, wenn ich den GameState (siehe Breakanoid und Galactica) wieder von GS_GAME auf GS_MAINMENU zurücksetze:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
tbResult CGame::Move(float fTime)
{
    if(!g_pbButtonsLF[TB_KEY_ESCAPE] && g_pbButtons[TB_KEY_ESCAPE])
    {
        tbDelay(100);
        g_pHeli->SetGameState(GS_MAINMENU);
    }

    for(int iHeli = 0; iHeli < 2; iHeli++)
        m_apHeli[iHeli]->Move(fTime);

    return TB_OK;
}

(das LF bei den ersten "Buttons" steht für "Last Frame", also für ein KeyDown Event. Ich glaub in Galactica heißt das OldButtons oder so was...)


Die SetGameState ist nahezu identisch mit dem Original von David.

Wie kann es nun sein, dass in einer so einfachen Funktion, also dem * Operator, ein Zugriffsfehler entsteht? ???
Ich kann doch vorher nicht schon irgendwas deleted haben oder so... ?!

(Übrigens bisher immer 0xC0000005. Ich kenne Zugriffsfehler praktisch nur als 0x00000000 - Null-Pointer ;D )

Wär echt toll, wenn mir jemand helfen könnte :)
Ich hoffe, ich hab das Problem ordentlich genug dargestellt. Wenn ihr noch Infos braucht, bitte, bitte sagts mir einfach - nich einfach nur sagen "is mir zu undurchsichtig", oder so, ja? Bittää :roll:

Also, wär echt super - sonst komm ich nämlich net weiter

bye
Klaus :huhu:
Mozilla Firefox
The Browser - reloaded

Klaus

Treue Seele

  • »Klaus« ist der Autor dieses Themas

Beiträge: 245

Wohnort: Stuttgart

Beruf: Schüler

  • Private Nachricht senden

2

15.01.2004, 16:25

Re: tbObject::Move(float fTime) --> Access Violation

Neeeee, oder? ;D ;D ;D

Ich glaubs ja nich... ich hab den Fehler praktisch vor der Nase, hab ihn mir sogar in dem Posting selbst erklärt *lol*

Na gut, is ja prima :) Also sorry, dass ich euch bemüht habe.

Aber man kann ja auch was draus lernen: Es ist immer gut, den Fehler mit allen Umständen mal ganz genau aufzuschreiben - oft sieht man dann selbst, woran es liegt :)

Ach ja, die Lösung:
Ich darf natürlich in der Spielklasse nicht nach SetGameState nochmal Move aufrufen... *blöööödbin*
Entweder return oder Positionen tauschen.
Hab mich für letzteres entschieden:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
tbResult CGame::Move(float fTime)
{
    for(int iHeli = 0; iHeli < 2; iHeli++)
        m_apHeli[iHeli]->Move(fTime);

    if(!g_pbButtonsLF[TB_KEY_ESCAPE] && g_pbButtons[TB_KEY_ESCAPE])
    {
        tbDelay(100);
        g_pHeli->SetGameState(GS_MAINMENU);
    }

    return TB_OK;
}


:) :roll: :wirbel:
Mozilla Firefox
The Browser - reloaded