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:
Player.setPosY(Player.getPosY + 15*timefactor);
timeFactor wird durch einen QueryPerformanceCounter berechnet.
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:
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;
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.
Kann mir jemand helfen? Vllt. kann mir auch jemand erklären wie genau man bei einer Subiteration vorgeht..
Danke + Grüße
Passi