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

Lares

1x Contest-Sieger

  • »Lares« ist der Autor dieses Themas
  • Private Nachricht senden

1

21.04.2007, 20:33

Problem mit Kollision zwischen Spieler und Kacheln

Hi leute
Also ich häng hier gerade an der Kollision in meinen Spiel.
Wenn der Spieler sich über eine Kachel bewegt soll sich die Kachel verfärben.
habe folgenden Code für die Kollision:

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
//CheckCollision()

void CGame::CheckCollision()
{
 //Iterator für Tiles machen

 list<CTile>::iterator ItTile = m_TileList.begin();
 
 //rects für Tiles und Player holen

 SDL_Rect RectTile;
 SDL_Rect RectPlayer;
 
 //Alle Tiles durchlaufen

 while (ItTile != m_TileList.end())
 {
  //Rect des Tiles holen

  RectTile = ItTile->GetRect();
  RectPlayer = m_pPlayer->GetRect();

  if(RectPlayer.y <= RectTile.y+RectTile.h &&
     RectPlayer.y >= RectTile.y ||
     RectPlayer.y + RectPlayer.h <=RectTile.y+RectTile.h &&
     RectPlayer.y + RectPlayer.h >=RectTile.y)
  {
   if(RectPlayer.x <= RectTile.x +RectTile.w &&
      RectPlayer.x >= RectTile.x ||
      RectPlayer.x + RectPlayer.w <=RectTile.x+RectTile.w &&
      RectPlayer.x + RectPlayer.w >=RectTile.x )
   {
    //Kollision ist aufgetreten also Tile ist berührt worden

    ItTile->ChangeActive(true);
   }
  }
  ItTile++;
 }
}


So das Problem an der Sache ist nicht dass die Kollision gar nicht funktioniert, sondern teilweise:wenn die Figur nach oben oder unten läuft, färben sich immer zwei nebeneinander liegende kacheln(die auf der der Spieler steht und die links von dieser). Wenn ich nach links oder rechts gehe und den Spieler einigermaßen mittig auf der Kachel laufen lasse, funktioniert es. :?

Bin ziemlich ratlos hat einer ne idee?
mfg
Lares

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

2

21.04.2007, 20:45

Ohne das lange Wirrwarr an Kollisiontest anzusehen vermute ich mal das der Fehler einfach bei einer falschen Abfrage liegt. Das kannst du doch auch simpler gesalten:

C-/C++-Quelltext

1
2
3
4
5
6
7
bool RectCollision( const SDL_Rect& r1, const SDL_Rect& r2 )
{
  return !( r1.x+r1.w < r2.x ||
               r1.x > r2.x+r2.w ||
               r1.y > r2.y+r2.h ||
               r1.y+r1.h < r2.y );
}


Wenn der Koordinatenursprung des Rechtecks links oben ist.

grüße
@D13_Dreinig

Lares

1x Contest-Sieger

  • »Lares« ist der Autor dieses Themas
  • Private Nachricht senden

3

21.04.2007, 21:10

Thx für die Antwort aber das Problem hat es nicht gelöst. Es macht keinen Unterschied :cry:

Also ich hab die von dir gepostete Funktion als Funktion von CGame deklariert und dann so eingebunden:

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
void CGame::CheckCollision2()
{
 //Iterator für Tiles machen

 list<CTile>::iterator ItTile = m_TileList.begin();
 
 //rects für Tiles und Player holen

 SDL_Rect RectTile;
 SDL_Rect RectPlayer;
 
 //Alle Tiles durchlaufen

 while (ItTile != m_TileList.end())
 {
  //Rect des Tiles holen

  RectTile = ItTile->GetRect();
  RectPlayer = m_pPlayer->GetRect();

  if(RectCollision(RectPlayer,RectTile))
  {
   //Kollision ist aufgetreten also Tile ist berührt worden

    ItTile->ChangeActive(true); 
  }
  ItTile++;
 }
}


Hab ich was falsch gemacht oder kann der Fehler noch woanders liegen?

mfg
Lares

Lares

1x Contest-Sieger

  • »Lares« ist der Autor dieses Themas
  • Private Nachricht senden

4

22.04.2007, 13:56

Ok ich hab den Fehler gefunden :D
Die Kollision funktioniert jetzt zwar noch ein bisschen zu genau, aber das bekomme ich (denk ich) alleine geändert.
Der Fehler war folgender: Die Weite der Tiles war aus irgendeinem Grund doppelt so groß wie die Höhe. Hab also die Weite einfach durch 2 geteilt und schon gings.
Thx für die Hilfe David_pb, auch wenn der Fehler ganz woanders war.^^

mfg
Lares

Werbeanzeige