Ja, hi!
Ich hab da grade mal so ein Problem
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
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: