so, ich postes mal hier rein.
Ich habe eine std::list<CEnemy>, die ich durchlaufen will um erstens zu prüfen ob eine Position auf dem Bildschirm frei ist und um danach eine "freie" Klasse zu finden. Wenn keine da ist erstelle ich eine.
So, jetzt zum eigentlichen Fehler:
|
Quellcode
|
1
2
|
if(!i->IsAlive())
continue;
|
Er(Visual C++ 2005 Express) durchläuft die Funktion einmal fehlerfrei und erstellt ordnungsgemäß eine neue Klasse. och beim 2. Mal kommt wenn er diesen Code durchläuft eine Messagebox "List iterator not dereferencable".
ch habe echt keine Ahnung worans liegen könnte, achso und das ist ein Spiel mit der SDL. Falls das einem hilft, hier die ganze Funktion:
|
Quellcode
|
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
42
43
44
45
46
47
48
49
50
51
52
53
54
|
void CGame::SpawnEnemy ()
{
bool bSpawned=false;
bool bNoPosFound=false;
// Muss der Spieler noch Gegner umbringen
if(m_iEnemysLast == 0)
return;
// Wenn der Gegner weit genug vom Spawnpunkt entfernt ist, spawnen,
// wenn er nicht existiert vorherigen überprüfen,
// wenn Liste zuende auch spawnen.
list<CEnemy>::iterator i;
for(i=m_EnemyList.end(); i!=m_EnemyList.begin(); --i)
{
// lebendig?
if(!i->IsAlive())
continue;
// Ja, also unsere Position überprüfen
if(i->GetX()>70.0f || i->GetY()>70.0f)
{
// Freie Klasse zum Spawnen suchen
for(i=m_EnemyList.begin(); i!=m_EnemyList.end(); ++i)
{
if(!i->IsAlive())
{
i->Init(m_pSpriteEnemy, 50.0f, 50.0f);
bSpawned=true;
bNoPosFound=false;
m_iEnemysLast++;
break;
}
}
break;
}
else
bNoPosFound=true;
}
// Etwas gefunden? Wenn nein, dann etwas erstellen!
if(!bSpawned==!bNoPosFound)
{
CEnemy Enemy;
// Objekt Initialisieren
Enemy.Init(m_pSpriteEnemy, 50.0f, 50.0f);
// Objekt einfügen
m_EnemyList.push_back(Enemy);
// Der Spieler muss einen Gegner weniger abschiessen
m_iEnemysLast++;
}
} // SpawnEnemy
|
Danke im voraus