![]() |
Subiteration - Vorgehensweise?
Hi,
ich programmiere zur Zeit ein Jump and Run in Delphi unter Verwendung von OpenGL. Ich bin nun so weit, dass ich meine Figur einer Gravitation sowie der dazugehörigen Kollisionsabfrage unterziehe. Ist unter der Figur kein Boden, so fällt sie mit einer konstanten Geschwindigkeit herunter:
Delphi-Quellcode:
timeFactor wird durch einen QueryPerformanceCounter berechnet.
Player.setPosY(Player.getPosY + 15*timefactor);
Nun habe ich aber das Problem, dass bei dünnen Böden und einem langsamen Rechner es passieren kann, dass die Figur einfach durchfällt, weil der Geschwindigkeitsfaktor zu groß ist und so die Kollisionsabfrage nicht wirkt. Daher habe ich versucht eine Subiteration zu implementieren:
Delphi-Quellcode:
Leider funktioniert das so nicht richtig. Der Spieler fällt zwar nicht mehr durch den Boden hindurch, aber dafür wird die Schleife wohl öfter ausgeführt als erwartet, denn er springt eine Weile auf und ab sobald er mit Boden in Kontakt kommt.
Runs := 1 + trunc(15*Main.getTimeFactor/15); // Anzahl der Durchläufe der Subiteration
FoundColl := false; for i := 0 to Runs-1 do begin if not FoundColl then begin if (Map.getFrontWall(trunc(((Player.getPosY + (15*Main.getTimeFactor/Runs)*i )) / 35)+3, round((Player.getPosX) / 35) ) = 0) and (Map.getFrontWall(trunc(((Player.getPosY + (15*Main.getTimeFactor/Runs)*i)) / 35)+3, round((Player.getPosX) / 35) +1) = 0) then begin // Abfrage: ist unter dem Spieler kein Boden? // Fall FoundColl := false; end else begin FoundColl := true; FoundCollOn := trunc(((Player.getPosY)) / 35)*35; // Wo wurde Boden gefunden? end; end; end; Kann mir jemand helfen? Vllt. kann mir auch jemand erklären wie genau man bei einer Subiteration vorgeht.. Danke + Grüße Passi |
Re: Subiteration - Vorgehensweise?
Hi.
Berechne einfach zuerst den Abstand zum nächsten Hindernis, dann brauchst du keine Subiteration mehr:
Delphi-Quellcode:
Grüße vom marabu
const
TDirection = (dirNone, dirRight, dirUp, dirLeft, dirDown); begin distance := Map.GetDistance(Player, dirDown); with Player do setPosY(getPosY + Min(15 * timefactor, distance)); end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:02 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz