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

25.01.2010, 13:10

Problem mit erweiterung des SDL-Games

Ich habe explosionen implementieren wollen:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// Überschneiden sich die Rects?

      if (RectShot.y < RectAsteroid.y + RectAsteroid.h &&
          RectShot.y + RectShot.h > RectAsteroid.y &&
          RectShot.x < RectAsteroid.x + RectAsteroid.w &&
          RectShot.x + RectShot.w > RectAsteroid.x)
      {
        // Ja, also gab es eine Kollision. Somit Schuss und

        // Asteroid deaktivieren

        g_pHighscore->Add(100);
        ItAsteroid->SetAlive (false);
        ItShot->SetAlive (false);
        CExplosion Explosion(static_cast<float>(RectShot.x), static_cast<float>(RectShot.y + RectShot.w/2), m_pSpriteExplosion);
        m_ExplosionList.push_back(Explosion);
      }

falls es also ne kollision gibt spööte theoretisch ne explosion erzeugt werden und im update rufe ich immer noch

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
void CGame::ProcessExplosions()
{
    list<CExplosion>::iterator ItExplosion;

    for (ItExplosion = m_ExplosionList.begin(); ItExplosion != m_ExplosionList.end(); ItExplosion++)
    {
        ItExplosion->Process();
    }
}
auf um die explosionen zu rendern und zwar so:

C-/C++-Quelltext

1
2
3
4
5
6
7
void CExplosion::Process()
{
    if(AnimPhase > 20)
        this->~CExplosion();
    m_pSpriteExplosion->Render(static_cast<float>(AnimPhase));
    AnimPhase++;
}

Das alles kompiliert auch und läuft schön durch usw. allerdings hängt es sich auf, wenn eine explosion erzeugt wird
Gewinnen ist, wenn man einmal mehr aufsteht, als man zu Boden geht.

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

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

  • Private Nachricht senden

2

25.01.2010, 13:23

du rufst den eigenen destruktor auf xD

Quellcode

1
this->~CExplosion(); 
"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?

3

25.01.2010, 13:28

is das schlecht? aber der fehler kommt schon beim erzeugen der Explosion
Gewinnen ist, wenn man einmal mehr aufsteht, als man zu Boden geht.

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

4

25.01.2010, 13:32

Zitat von »"Flonk"«

is das schlecht? aber der fehler kommt schon beim erzeugen der Explosion


Ja! Zumindest äußerst unüblich in den meißten Fällen.

Wenn der Fehler beim erzeugen liegt, dann wär der Konstruktor noch interessant.

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

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

  • Private Nachricht senden

5

25.01.2010, 13:33

ja das ist schlecht.
der destruktor wird automatik bzw. mit hilfe delete aufgerufen, versuch aber bitte nicht "delete this;" zu schreiben. xD
ich glaub es ist einfacher dem asteroiden einen status(so wie gamestates mit menu, spiel...) zu geben und die explosion zum teil des asteroiden zu machen(ist ja auch ein teil davon)

http://www.pronix.de/comment/site-963/open-1367/site-1.html
"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?

6

25.01.2010, 19:01

Fehler kommt auch nach umstellen des codes noch :(
Gewinnen ist, wenn man einmal mehr aufsteht, als man zu Boden geht.

7

25.01.2010, 19:20

Wie sieht denn der Code vom Konstuktor von CExplosion aus ?

Ansonsten: bist du sicher, dass m_pSpriteExplosion einen Richtigen wert hat ?

8

25.01.2010, 20:11

C-/C++-Quelltext

1
2
3
4
5
6
7
8
CExplosion::CExplosion(float fXPos,float fYPos, CSprite *pExplosion)
{
    m_pSpriteExplosion = pExplosion;

    m_pSpriteExplosion->SetPos(fXPos,fYPos);
    AnimPhase = 0;
    isAlive = 1;
}


außerdem

C-/C++-Quelltext

1
2
3
m_pSpriteExplosion = new CSprite;
  m_pSpriteExplosion->Load("Data/explosion.bmp", 20, 64, 64);
  m_pSpriteExplosion->SetColorKey (255, 0, 255);
in der init von game.cpp. in game werden nachher auch die explosionen erzeugt
Gewinnen ist, wenn man einmal mehr aufsteht, als man zu Boden geht.

9

26.01.2010, 20:26

is da so ein dummer fehler drin?
Gewinnen ist, wenn man einmal mehr aufsteht, als man zu Boden geht.

D-eath

Treue Seele

Beiträge: 102

Beruf: Freelance Software Engineer

  • Private Nachricht senden

10

30.01.2010, 02:16

Ungültiger Zeiger? Benutz halt den Debugger.

Ich sehe nur grad, dass du isAlive auf 1 setzt, oben aber auf true oder false, sollteste zumindest einheitlich gestalten.

Werbeanzeige