Einzelnen Beitrag anzeigen

Passi077

Registriert seit: 7. Okt 2004
23 Beiträge
 
#1

Subiteration - Vorgehensweise?

  Alt 4. Mai 2006, 08:30
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
  Mit Zitat antworten Zitat