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

11

18.08.2009, 16:41

Ich denke, ich würde irgendwas selbst bauen. Man hat ja irgendwo die Framerate oder weiß, wie lange ein Frame dauert und damit kann man dann ja äußerst einfach einen kleinen Counter bauen.
Lieber dumm fragen, als dumm bleiben!

Lord-archimedes

Treue Seele

Beiträge: 234

Wohnort: Hannover

  • Private Nachricht senden

12

18.08.2009, 17:37

Du kannst auch GetTickCount () nehmen

13

18.08.2009, 19:06

Ich benutze jetzt die Funktion SDL_GetTicks(), welche mir die Zeit in millisekunden ausgibt seit wann SDL rennt.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void CGame::Explosionen ()
{
    list<CExplosion>::iterator ItExplosion = m_ExplosionList.begin ();

    while (ItExplosion != m_ExplosionList.end ())
    {
        if (ItExplosion->IsAlive ())
        {   
          ItExplosion->Render ();
          ItExplosion++;

        }
        else
            ItExplosion = m_ExplosionList.erase (ItExplosion);
    }
}


So siehts im Moment aus, wie mach ich aus SDL_GetTicks einen Timer der beispielsweise nach 3 Sekunden ItExplosion->SetAlive(false) setzt, damit sie aus der Liste gekickt wird?

Lord-archimedes

Treue Seele

Beiträge: 234

Wohnort: Hannover

  • Private Nachricht senden

14

18.08.2009, 19:33

Genauso wie hier:
http://spieleprogrammierer.de/phpBB2/viewtopic.php?t=12186

15

18.08.2009, 19:53

Ich danke dir.

16

06.08.2011, 18:31

Ist zwar schon lange her, aber wie genau krieg ich denn die Asteroiden, die explodieren sollen in die Liste?Von dem obenstehennden Code ausgehend ;)

17

06.08.2011, 18:44

push_back

MfG
Check

18

06.08.2011, 19:04

Jo das mit pushback is klar, nur wenn ich das zum Beispiel hier einfüge:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
{
 // Ja, also gab es eine Kollision. Somit Schuss und
 // Asteroid deaktivieren
 ItAsteroid->SetAlive (false);
 ItShot->SetAlive (false);
 

 // Rect der Explosion holen
 RectExplosion = ItExplosion->GetRect();

 // Neue Explosions-Instanz erschaffen und Rendern
 CExplosion Explosion; 
 // m_ExplosionList.push_back (Explosion);
 Explosion.Init (m_pSpriteExplosion, RectAsteroid.x, RectAsteroid.y);
 Explosion.Update(); 
 Explosion.Render(); 

 }



stürzt das Programm ab, wo muss ich das denn einfügen und ich muss schon eine Instanz meiner Explosions-Klasse übergeben oder nicht?

19

06.08.2011, 19:16

Sofern deine Liste vom Typ CExplosion ist.

Was machst du da eigentlich bei der Kollision herum? xD
Mach eine Liste wo du immer die Explosion einordnest wenn der Spieler mit dem Asteroiden kollidiert.
Du lässt einfach jedes mal in deiner Run() Funktion eine Update()-Funktion von CExplosion auf, die die Explosionen rendert. Durch eine if-Abfrage werden diese nur gerendet, wenn sie auch in der Liste sind. Wenn der Timer für die Explosion abgelaufen ist btw. die Explosions-Animation am Ende, lässt du auch einfach in der Update-Funktion das jeweilige Element via pop_back entfernen.

MfG
Check

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

20

06.08.2011, 19:34

Er stürzt in zeile 9 ab weil dein Iterator wahrscheinlich ungültig ist.
Im Grunde kannst du die Explosionen genau wie die Asteroiden erzeugen(wie in der Funktion SpawnAsteroids) und behandeln. Du hast nur einen anderen Auslöser(die Kollision statt dem Timer) und eine andere Position.
Als erstes rufst du push_back auf um ein neues Objekt zu erstellen. Dann initialisierst du mit der Position des Asteroiden. Oben versuchst du die von der Explosion, die noch garnicht existiert, zu übernehmen. Deshalb stürzt dein Programm ab.
Du brauchst ausserdem noch eine Funktion wie RenderAsteroids für die Explosionen. Damit alle gezeichnet und wieder zerstört werden können.

Allerdings find ichs wesentlich schwieriger fremden Code zu erweitern als es selbst zu schreiben. Schreib lieber kleine Übungsprogramme(vorerst in der Konsole) die immer größer werden.
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

Werbeanzeige