AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Subiteration - Vorgehensweise?
Thema durchsuchen
Ansicht
Themen-Optionen

Subiteration - Vorgehensweise?

Ein Thema von Passi077 · begonnen am 4. Mai 2006 · letzter Beitrag vom 4. Mai 2006
Antwort Antwort
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
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#2

Re: Subiteration - Vorgehensweise?

  Alt 4. Mai 2006, 09:54
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
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:48 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz