Registriert: Sa Jul 22, 2006 00:43 Beiträge: 30 Wohnort: Borland
Hallo Community,
ich habe mich soeben daran versucht time based movement in mein Projekt zu integrieren, allerdings habe ich das Gefühl, dass ich das Tutorial dazu im Wiki nicht ganz verstanden habe, denn es funktioniert nicht ganz Auf einem langsameren Rechner ist die Bewegung leider immer noch langsamer.
Ich habe versucht das Ganze etwas zu vereinfachen und es in eine Funktion gepackt, sodass der korrigierte Wert zurückgegeben wird. Das sieth dann in etwa so aus:
Code:
function TUnit.TBMCorrection(speed:Double):double;
Nebenbei: TShip ist eine abgeleitete Klasse von TUnit. Der Code wurde vorerst mal auf das Nötigste reduziert.
Es sieht ganz danach aus, als wäre es nicht der richtige Weg den Zeitunterschied so zu ermitteln:
Code:
QueryPerformanceCounter(BerechnungsZeit);
QueryPerformanceCounter(AktuelleZeit);
Dadurch wird wohl auch der Faktor letztenendes so klein, dass ich mit einem weiteren Faktor (1Mio) multiplizieren muss um wieder auf eine halbwegs ordentliche Zahl zu kommen. Die Frage ist jetzt, was muss zwischen den beiden Zeilen stehen, an denen die aktuelle Zeit abgegriffen wird? Irgendwie geht das aus dem Tutorial nicht ganz hervor oder ich habe es nicht richtig interpretiert
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
Der Grund liegt darin, dass du die beiden Zeiten sofort hintereinander misst. Dadurch bekommst du einen Wert, der ziehmlich genau demjenigen von Frequency entsprechen sollte, vllt das drei oder vierfache.
Du musst das ungefähr so machen:
Code:
// Ein paar Variablen
var
Frequency:Double;
LastFrame:Double;
// Initialisierungsmethode (Frequency sollte man nicht jeden Frame abfragen)
begin
ifnot QueryPerformanceFrequency(Frequency)then
// Raise error
// Last frame einmal initialisieren, damits nicht zu einem großen Sprung beim
// start des Programms kommt
QueryPerformanceCounter(LastFrame);
end;
// Deine Rendermethode, wo auch alle berechnungen stattfinden
// Framerate beschränken. Eine Framerate von > 100 Hz ist meistens
// sinnlos
if(PassedTime < 0.01)then
Exit;
LastFrame := CurrentFrame;
// Mach alles, was zu tun ist. Berechnungen, Rendern, sonstwas
end;
(Anmerkungen: Frequency und LastFrame sind globale Variablen oder Variablen, die zu der Klasse gehören, die das Rendern steuert. CurrentFrame und PassedTime sind lokale Variablen der Methode, die das Rendern steuert)
Damit misst du immmer bei beginn des Frames die aktuelle Zeit. Dazu hast du in LastFrame die Zeit des letzten Frames. Wenn du die voneinander Subtrahierst, dann erhälst du die vergangen Zeit. Geteilt durch Frequency hast du die Zeit in Sekunden. Diesen Wert kannst du jetzt für dein TBM verwenden.
Du hast deine Zeit wie gesagt direkt hintereinander in einem Frame gemessen. Damit hattest du einen seeeeeehr geringen Zeitabstand, der kaum zu gebrauchen war.
Ich hoffe, das hilft dir.
Gruß Lord Horazont
_________________ If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung. current projects: ManiacLab; aioxmpp zombofant network • my photostream „Writing code is like writing poetry“ - source unknown
„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb
Mitglieder in diesem Forum: 0 Mitglieder und 6 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.