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
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
for (ItTile = TileList->begin (); ItTile != TileList->end (); ++ItTile) { if (ItTile->IsSolid () == true) { // Rects holen RectTile = ItTile->GetRect (); RectPlayer = m_pPlayer->GetRect (); // Überschneiden sich die Rects? if ((RectTile.y < RectPlayer.y + RectPlayer.h) && (RectTile.y + RectTile.h > RectPlayer.y) && (RectTile.x < RectPlayer.x + RectPlayer.w) && (RectTile.x + RectTile.w > RectPlayer.x)) { m_pPlayer->MoveBack (); } } } |
Du könntest versuchen die Seite, die kollidiert
herauszufinden und dann nur diese Bewegungsrichtung
zurücksetzen.
Zitat von »Sc4v«
Ich hatte es damals so gelöst, dass ich nicht überprüft habe ob es derzeit eine Kollision gibt, sondern ob es in Zukunft eine gibt. Falls nein habe ich die Figur weiter bewegen lassen.
Ich weiß aber nicht ob das die Beste Lösung ist xD
lg
die Seite die kollidiert müsste man doch eigentlich durch die Bewegungsrichtung der Figur herausfinden können.
Fällt die Figur nach unten ist die kollidierende Seite die untere (bzw obere des kollidierten Objekts)... bewegt sich die Figur nach rechts ist es die rechte(linke) Seite
Mach es doch mit 'nem Vector, dann brauchst du keine zwei Variablen. Y bleibt dank Schwerkraft immer negativ, x ändert sich je nach Seite.
C-/C++-Quelltext |
|
1 |
if (rect.y >= (rectPlayer.y + rectPlayer.h) + abs(vec.y)) { // Kollision mit dem nächsten Punkt |
Ich meinte den Vector nur für den Sturz bzw. Schwerkraft.
C-/C++-Quelltext
1 if (rect.y >= (rectPlayer.y + rectPlayer.h) + abs(vec.y)) { // Kollision mit dem nächsten Punkt
Und dann vec.y = 0;
Bei den Seiten Kollisionen müsste man dann nur noch die x Werte testen und ebenfalls vec.x hinzunehmen, um den Punkt zu finden, der eine Iteration weiter erreicht wird.
Sollte es zu einer Kollision mit der Seite kommen, dann könnte du den Spieler abprallen lassen (ggf. mit einer geringen Verletzung für das tangieren der Wand), so würde der Spieler nicht "hängen" bleiben.
Und mit der obigen Kollisionserkennung sollte eig. auch nicht der Fall auftreten, dass du nicht mehr nach rechts oder links kannst, denn du wirst durch die Überprüfung des nächsten Schrittes niemals in ein Rect "hineinsacken".
Oder missverstehe ich dich?
Werbeanzeige