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

06.01.2008, 16:40

Asteroiden schaden dem Raumschiffnicht (Kapitel 12 edit)

Hallo,
ich habe das Forum schon auf dieses Problem durchforstet, bin auch fündig geworden. Aber diese Lösungen haben bei mir nicht viel geholfen!

Die Asteroiden die von oben kommen schaden dem Raumschiff nicht. Also habe ich mir gedacht ich mache einfach einen CheckPlayerCollision() die überprüft ob ein Asteroid und das Raumschiff sich überschneiden!

hier der Code was ich verändert habe:
player.h:

C-/C++-Quelltext

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
#ifndef PLAYER_HPP
#define PLAYER_HPP

#include <list>
#include "Sprite.h"
#include "Shot.h"

class CPlayer
{
  public:
    CPlayer     ();

    void Init   ();
    void Quit   ();
    void Render ();
    void Update ();
    void Reset  ();
    


    SDL_Rect GetRect () { return m_pSpritePlayer->GetRect(); }



     list<CShot> *GetShotList () {return &m_ShotList;}
    

  private:
    void ProcessMoving   ();
    void ProcessShooting ();
    void CheckPosition   ();

    CSprite *m_pSpritePlayer; // Sprite für Spieler

    CSprite *m_pSpriteShot;   // Sprite für Laserschüsse

    float m_fXPos;            // X-Position des Spielers

    float m_fYPos;            // Y-Position des Spielers

    float m_fAnimPhase;       // Aktuelle Animationsphase

    bool m_bShotLock;         // Darf der nächste Schuss raus?

    list<CShot> m_ShotList;   // Liste der Schüsse

    

    
};

#endif


game.h:

C-/C++-Quelltext

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
#ifndef GAME_HPP
#define GAME_HPP

#include "Player.h"
#include "Asteroid.h"

class CGame
{
  public:
    CGame ();

    void Init ();
    void Run  ();
    void Quit ();

  private:
    void ProcessEvents   ();
    void SpawnAsteroids  ();
    void RenderAsteroids ();
    void CheckCollisions  ();
    


    void CheckPlayerCollisions ();
    



    CPlayer *m_pPlayer;             // Spieler-Instanz

    CSprite *m_pSpriteBackground;   // Sprite für den Hintergrund

    CSprite *m_pSpriteAsteroid;     // Sprite für die Asteroiden

    CSprite *m_pOrange;
    float    m_fAsteroidTimer;      // Zeitgeber für nächsten Asteroiden

    bool     m_bGameRun;            // Läuft das Spiel noch?

    list<CAsteroid> m_AsteroidList; // Liste der Asteroiden


};

#endif

game.cpp:

C-/C++-Quelltext

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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
....
....

while (m_bGameRun == true)
  {
    // Events bearbeiten

    

    ProcessEvents ();

    // Framework updaten und Buffer löschen

    g_pFramework->Update ();
    g_pFramework->Clear ();

    // Hintergrundbild rendern

    m_pSpriteBackground->Render ();
    
    m_pOrange->Render ();

    // Spieler updaten und rendern

    m_pPlayer->Update ();
    m_pPlayer->Render ();

    // Neue Asteroiden hinzufügen

    SpawnAsteroids ();

    // Kollisionen prüfen

    CheckCollisions ();

    


//Prüfen ob Spieler getroffen ist!

    CheckPlayerCollisions();



    // Asteroiden rendern

    RenderAsteroids ();
    
    

    // Buffer flippen

    g_pFramework->Flip ();

  }

} // Run


....
....
....

void CGame::CheckPlayerCollisions()
{
  list<CAsteroid>::iterator ItAsteroid = m_AsteroidList.begin ();

  SDL_Rect RectAsteroid;
  SDL_Rect RectP;

 
  while (ItAsteroid != m_AsteroidList.end () )
  {
    
    RectAsteroid = ItAsteroid->GetRect ();
    RectP = m_pPlayer->GetRect();



      if (RectP.y < RectAsteroid.y + RectAsteroid.h &&
          RectP.y + RectP.h > RectAsteroid.y &&
          RectP.x < RectAsteroid.x + RectAsteroid.w &&
          RectP.x + RectP.w > RectAsteroid.x)
      {
        //Spieler getroffen -> Programm herunterfahren! 

          m_bGameRun = false;
          
        
      }

  }
 
}


Vll hatte jemand das Problem schon aber alleine komme ich nicht darauf was falsch ist... Das Programm lässt sich einwandfrei kompilieren und ausführen nur man sieht schwarz und sofort ist das Programm beendet....

mfg Richard

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

2

06.01.2008, 16:56

Also erstmal auf den ersten Blick hast du auf alle Fälle eine Endlosschlaufe..

Du erhöst den Iterator ja überhaupt nicht...

3

06.01.2008, 17:01

Jetzt funktionierts ^^ danke!

mfg

4

06.01.2008, 17:06

Man hat David den Quark mit den Init-Methoden anstelle von anständigen Konstruktoren eingeführt? In CPlayer Konstruktor und Destruktor überladen und Init und Quit streichen ...
Devil Entertainment :: Your education is our inspiration
Der Spieleprogrammierer :: Community Magazin
Merlin - A Legend awakes :: You are a dedicated C++ (DirectX) programmer and you have ability to work in a team? Contact us!
Siedler II.5 RttR :: The old settlers-style is comming back!

Also known as (D)Evil

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

5

06.01.2008, 17:19

Das ist das Buch von Heiko Kalista...

Werbeanzeige