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

1

05.03.2014, 21:10

SDLGame --> Explosion

Guten Abend

Ich habe meinen ersten Versuch gestartet am Game eine "kleine Erweiterung" zu versuchen. Ich habe hinbekommen, dass es beim Auftreffen
des Schusses auf den Asteroiden eine kleine Explosion gibt (leider nur ein Bild, irgendwie hat es nicht anders geklappt).

Nun ich wollte gerne eure Meinung erfragen, ob ich hier etwas vollständig verdrehtes gemacht habe oder nicht. Danke für eure Meinungen.

Game.cpp

// Sprite für Explosion laden
m_pSpriteExplosion = new CSprite;
m_pSpriteExplosion->Load ("/Volumes/Mason/Hobbies/Cplusplus/SDLGame/SDLGame/Explosion.bmp", 1, 64, 64);
m_pSpriteExplosion->SetColorKey (255, 0, 255);


Game.cpp


// Ja, also gab es eine Kollision. Somit Schuss und
// Asteroid deaktivieren und Explosion anzeigen
ItAsteroid->SetAlive (false);
ItShot->SetAlive (false);

CExplosion Explosion;
Explosion.Init(m_pSpriteExplosion, RectAsteroid.x, RectAsteroid.y);
Explosion.Render();


Explosion.hpp

#ifndef EXPLOSION_HPP
#define EXPLOSION_HPP


#include "Sprite.hpp"


class CExplosion
{
public:
void Init (CSprite *pSpriteExplosion, float x, float y);
void Render ();
SDL_Rect GetRect () {return m_Rect;}

private:
CSprite *m_pSpriteExplosion; // Zeiger auf Explosion-Sprite
float m_fXPos; // X-Position der Explosion
float m_fYPos; // Y-Position der Explosion
SDL_Rect m_Rect; // Rect der Explosion

};

#endif



Explosion.cpp

#include "Explosion.hpp"

void CExplosion::Init (CSprite *pSpriteExplosion, float x, float y)
{

// Zeiger auf Sprite kopieren und Koordinaten setzen
m_pSpriteExplosion = pSpriteExplosion;
m_fXPos = x;
m_fYPos = y;

// Rect initialisieren
m_Rect.x = pSpriteExplosion->GetRect().x;
m_Rect.y = pSpriteExplosion->GetRect().y;
m_Rect.w = pSpriteExplosion->GetRect().w;
m_Rect.h = pSpriteExplosion->GetRect().h;

} // Init


// Render

void CExplosion::Render ()
{
m_pSpriteExplosion->SetPos (m_fXPos, m_fYPos);
m_pSpriteExplosion->Render();
} // Render

Cranberry

Treue Seele

Beiträge: 312

Wohnort: Innsbruck, Tirol

  • Private Nachricht senden

2

05.03.2014, 21:27

Wenn alles funktioniert, dann hast du es richtig gemacht.
Hab den Code nur überflogen, aber verschwindet die Explosion wieder?

P.S. Wenn du beim Posten in den Quellcode Modus gehst (Tab neben Editor) kannst du aufs C++ Symbol klich und so schön formatierten C++ Quellcode einfügen.

3

05.03.2014, 21:35

Danke für deinen Tipp.
Ja die Explosion verschwindet jeweils, halte sie nicht am Leben.

Lares

1x Contest-Sieger

  • Private Nachricht senden

4

06.03.2014, 17:09

Soweit wie ich das sehe erstellst und renderst du die Explosion nur während der Kollision. Das ist ein beliebter Denkfehler, denn:
Die Kollision tritt nur einen Frame lang auf, da der Asteroid ja dann zerstört wird. Ergo wird deine Explosion auch nur einen Frame angezeigt, weil dieser Programmteil nur enmal erreicht wird. Dazu kommt, dass du eine neue Explosion erstellst, anstatt die vorhandene zu aktualisieren (Stichwort Animation).

Du musst also die Lebensdauer der Explosion unabhängig von den Asteroiden machen (wenn die Animation vorbei ist löschen) und separat abspeichern, dass du sie jeden Frame anzeigen und aktualisieren kannst. Das Prinzip ist also recht ähnlich wie bei den Asteroiden, nur dass du eine neue Explosion erstellst und in eine Liste einträgst, wenn eine Kollision zwischen Asteroiden und Spieler/Schuss erfolgt.

Werbeanzeige