Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Subiteration - Vorgehensweise? (https://www.delphipraxis.net/68725-subiteration-vorgehensweise.html)

Passi077 4. Mai 2006 08:30


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:
  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

marabu 4. Mai 2006 09:54

Re: Subiteration - Vorgehensweise?
 
Hi.

Berechne einfach zuerst den Abstand zum nächsten Hindernis, dann brauchst du keine Subiteration mehr:

Delphi-Quellcode:
const
  TDirection = (dirNone, dirRight, dirUp, dirLeft, dirDown);

begin
  distance := Map.GetDistance(Player, dirDown);
  with Player do
    setPosY(getPosY + Min(15 * timefactor, distance));
end;
Grüße vom marabu


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