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

29.02.2008, 23:28

Problem in Kollisionserkennung in Kap. 12

Ich hab mich inzwischen bis Kapitel 12 vorgearbeitet und das Spiel ein bischen erweitert ,mit Explosionen(sofern man das bei meinen
Zeichenkünsten so nennen darf) und einem Punktezähler. Dabei ist mir aufgefallen,dass der erste Asteroid bei einem Schuss unabhängig von der x-achse des Schusses
getroffen wird.Habs dann auch mit dem ursprünglichen Code von der CD probiert bleibt aber das Gleiche die Y-Achse funktioniert aber.

Weiß jemand woran es liegen könnte?
Mfg Soad51

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

2

29.02.2008, 23:33

Ich weiss zwar nicht, was eine

Zitat

Lollisionserkennung
ist, aber OK.

Hmm, ich habe in Erinnerung, dass das bei mir nicht so war, aber bin nicht 100% sicher. Zeig mal nochmal den Code, wo die KOLLISIONSERKENNUNG stattfindet. ;)

3

29.02.2008, 23:42

so hier:

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
void CGame::CheckCollisions ()
{
  // Schussliste des Spielers holen

  list<CShot> *ShotList = m_pPlayer->GetShotList ();

  // Iteratoren für Asteroiden- und Schussliste

  list<CAsteroid>::iterator ItAsteroid = m_AsteroidList.begin ();
  list<CShot>::iterator ItShot;

  // Rects für Asteroiden und Schüsse

  SDL_Rect RectAsteroid;
  SDL_Rect RectShot;

  // Alle Asteroiden durchlaufen

  while (ItAsteroid != m_AsteroidList.end () )
  {
    // Rect des Asteroiden holen

    RectAsteroid = ItAsteroid->GetRect ();

    // Alle Schüsse durchlaufen

    for (ItShot = ShotList->begin (); 
         ItShot != ShotList->end ();
         ++ItShot)
    {
      // Rect des Schusses holen

      RectShot = ItShot->GetRect ();

      // Ü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

        ItAsteroid->SetAlive (false);
        ItShot->SetAlive (false);
      }

    }

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

4

29.02.2008, 23:47

Also ich sehe da kein Problem. ;)

Hmm, aber kannst ja mal mit dem Debugger die Werte prüfen, die bei der Kollision aktuell sind.

Also einfach Haltepunkt im Vergleichsrumpf ansetzen und dann mal debuggen. :)

5

01.03.2008, 08:21

Das Problem hab ich hier schon öfter herumgeistern gesehen.
Zum Beispiel hier...
Keine Ahnung, ob jemand schon eine Lösung dafür gefunden hat.
Einfach mal die Forensuche verwenden. Suchbegriff "kollisionserkennung" ;)

6

01.03.2008, 21:18

ok hab jetzt die lösung gefunden (:D das sind die kleinen aber feinen Erfolgserlebnisse)

Der Fehler lag hier:

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
// Load

//

// Aufgabe: Animiertes Sprite laden

//

void CSprite::Load (const string sFilename, int NumFrames,
                    int FrameWidth, int FrameHeight)
{
  // Bitmap laden

  Load (sFilename); //Genau hier!!!!!!!!


  // Rect für Animationsphase initialisieren

  m_NumFrames   = NumFrames;
  m_FrameWidth  = FrameWidth;
  m_FrameHeight = FrameHeight;
  m_FrameRect.w = FrameWidth;
  m_FrameRect.h = FrameHeight;
  m_NumFramesX  = m_pImage->w / m_FrameWidth;
 
} // Load



// Load

//

// Aufgabe: Einfaches, nicht animiertes Sprite laden

//

void CSprite::Load (const string sFilename)
{
  // Bitmap laden

  m_pImage = SDL_LoadBMP (sFilename.c_str () );

  // Prüfen, ob alles glatt ging

  if (m_pImage == NULL)
  {
    cout << "Fehler beim Laden von: " << sFilename.c_str ();
    cout << endl;
    cout << "Fehlermeldung: " << SDL_GetError () << endl;

    // Framework herunterfahren

    g_pFramework->Quit ();

    // Gesamtes Spiel beenden

    exit (1);
  }

  // Rect initialisieren

  m_Rect.x = 0;
  m_Rect.y = 0;
  m_Rect.w = m_pImage->w;//Hier werden die gesamtgrößen der bmp eingefügt

  m_Rect.h = m_pImage->h;

} // Load

Man hängt einfach

C-/C++-Quelltext

1
2
 m_Rect.w =FrameWidth;
  m_Rect.h = FrameHeight;

an das ende der Funktion für animierte Sprites.

Jetzt ist die Frage warum es nach dem ersten Asteroid nicht funktioniert wenn es sonst läuft?????[/cpp]

Ok,auch das hätte ich jetzt gelöst.Falls es wen interessiert: die Antwort liegt wieder in der Sprite-Klasse,genauer in der Funktion Render

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
// Render

//

// Aufgabe: Ausschnitt des Sprites rendern (Animationsphase)

//

void CSprite::Render (float fFrameNumber)
{
  // Spalte berechnen

  int Column = static_cast<int>(fFrameNumber)%m_NumFramesX;

  // Ausschnitt der aktuellen Animationsphase berechnen

  //


  // Zeile berechnen

  int Row = static_cast<int>(fFrameNumber)/m_NumFramesX;

  // Rect berechnen

  m_FrameRect.x = Column * m_FrameWidth;
  m_FrameRect.y = Row * m_FrameHeight;

  // Ausschnitt rendern

  
  SDL_BlitSurface (m_pImage, &m_FrameRect, m_pScreen, &m_Rect);
 
} // Render

Die blit-funktion hat die Eigenschaft den erfolgreich kopierten Abschnitt nachträglich im vierten Parameter also m_Rect zu speichern.Von diesem wurden beim Aufruf nur die Koordinaten benötigt weswegen es zu keinem Fehler kommt.Also wurden die FramRect-Daten welche ja richtig waren ins m_Rect kopiert.Die Kollisionsabfrage hat nun die Werte gespeichert bevor der Asteroid gerendert und damit sein Rect aktualisiert wurde.

Hoffe ihr könnt verstehen was ich meine is ja auch net so wichtig solange es läuft :D

T-VIRUS

Alter Hase

Beiträge: 548

Wohnort: Göttingen(West)/Nordhausen(Ost)

Beruf: Schüler

  • Private Nachricht senden

7

09.03.2008, 13:57

Hallo,
den Fehler hatte ich schon längst bei mir gefixt, nur blöd wenn man lange nicht mehr im Forum ist um das zu posten :)
Aber sonst gute Arbeit.
Ich denke das sollte mal speziell festgehalten werden, da dies doch öfters vorkommt.

MFG T-Virus
Meine Blog:)

Wer Bugs im Text findet kann sie melden, fix erscheint irgendwann :D

MFG T-VIRUS

Werbeanzeige