Guten Abend,
nachdem ich das Buch "C++ für Spieleprogrammierer" von Heiko Kallista nun durchgearbeitet hab, wollte ich mich mal an einem eigenen Spiel versuchen.
Diese Idee ist zugleich mein Facharbeitsthema.
Das Prinzip des Spiels ist altbekannt: Wie in 'Space Invaders' erscheinen Aliens im oberen Bildschirmdrittel welche man alle zerstören muss.
Das Spiel funktioniert soweit wunderbar, die Aliens werden gespawnt und die Kollisionsabfrage funktioniert ebenfalls.
Doch bei den Aliens stellt sich ein Problem: Ich möchte, dass diese Schüsse auf den Spieler abfeuern können. Leider funktioniert das nicht so ganz.
Mein erstes Etappenziel ist es, dass jeder Alien einen Schuss abfeuert, bevor ich diese nachher time.
Folgendes sind wahrscheinlich relevante Code-Abschnitte:
|
C-/C++-Quelltext
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
void CGame::ProcessAliens()
{
//Iterator für die AlienListe
list<CAlien>::iterator ItAlien;
//Alien Liste durchlaufen
for (ItAlien = m_AlienList.begin(); ItAlien != m_AlienList.end(); ++ItAlien)
{
//Alien updaten
ItAlien->Update();
//Alien rendern
ItAlien->Render();
}
}//RenderAliens
|
Hier werden einfach alle Aliens aktualisiert und anschließend gerendert
|
C-/C++-Quelltext
|
1
2
3
4
5
6
|
void CAlien::Update()
{
//Alien schießen lassen
Shoot();
}
|
|
C-/C++-Quelltext
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
void CAlien::Shoot()
{
if(m_bShotLock == false)
{
//Schuss erstellen, wenn es noch keinen gibt
m_Shot = new CShot();
//Schuss initalisieren
m_Shot->Init(m_pSpriteShot, m_fXPos, m_fYPos, true);
m_bShotLock = true;
}
}
|
Hier wird nun ein Schuss des jeweiligen Aliens abgefeuert.
|
C-/C++-Quelltext
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
void CAlien::Render()
{
m_pSpriteAlien->SetPos(m_fXPos, m_fYPos);
m_pSpriteAlien->Render();
//Wenn Schuss vorhanden, dann rednern
if (m_Shot != NULL)
{
m_Shot->Update();
//Ist der Schuss noch aktiv?
if (m_Shot->IsAlive())
{
//Ja, dann rendern
m_Shot->Render();
}
}
}
|
Zuletzt wird der Schuss gerendert
|
C-/C++-Quelltext
|
1
2
3
4
5
6
7
8
|
void CShot::Update ()
{
//Überprüfen, ob Spieler den Schuss abgefeuert hat oder Alien
if (m_bIsAlien == true)
{
//Wenn ein Alien geschossen hat, Schuss in Richtung des unteren Bildschirmrandes bewegen
m_fYPos += 400.0f * g_pTimer->GetElapsed ();
}
|
Das ist die kleine Änderung an der Funktion Update der Klasse CShot. Wenn es sich um einen Alien handelt, soll der Schuss einfach von oben nach unten "fliegen".
Ich weiß dass es einiges an Quelltext ist, ich sitze jedoch schon recht lange an dem Problem...ohne eine Lösung.
Der großteil ist, wie man sieht, aus den Klassen des SDL-Games aus Kapitel 12 übernommen. Eventuell hab ich dort auch einen Fehler gemacht?!
Wenn mir irgendjemand einen Tipp geben könnte oder sogar den Fehler findet wäre ich sehr dankbar, da ich das Programm so langsam mal fertig bekommen müsste
Danke im Voraus :-)