Timebased Movement: Unterschied zwischen den Versionen
Flo (Diskussion | Beiträge) K (→Millisekunden genau unter Windows: Pascal Tags eingesetzt statt HTML formatierung) |
Flo (Diskussion | Beiträge) (→Absolute Genauigkeit per Hardware: auch hier das gleiche) |
||
| Zeile 53: | Zeile 53: | ||
=== Absolute Genauigkeit per Hardware === | === Absolute Genauigkeit per Hardware === | ||
Man kann auch die Hardware zur Zeitmessung nutzen um so noch genauere Ergebnisse zu erziehlen. Es kann jedoch theoretisch sein(auch jetzt noch?), dass diese nicht zur verfügung steht. | Man kann auch die Hardware zur Zeitmessung nutzen um so noch genauere Ergebnisse zu erziehlen. Es kann jedoch theoretisch sein(auch jetzt noch?), dass diese nicht zur verfügung steht. | ||
| − | + | <pascal> | |
| − | + | //Benötigte Variablen | |
| − | + | var | |
| − | + | BerechnungsZeit:Int64; | |
| − | + | Frequenz:Int64; | |
| − | + | procedure BeimStart;//Was hier drinnen steht sollte zum Start ausgeführt werden | |
| − | + | begin | |
| − | + | if not QueryPerformanceFrequency(Frequenz) then//Frequenz ermitteln | |
| − | + | raise Exception.create('Kein Hardware Timer vorhanden'); | |
| − | + | QueryPerformanceCounter(BerechnungsZeit);//Aktuelle Zeit ermitteln | |
| − | + | end; | |
| − | + | procedure BerechnungsCheck;//Alle nötigen Berechnungen durchführen | |
| − | + | var | |
| − | + | AktuelleZeit:Int64; | |
| − | + | begin | |
| − | + | QueryPerformanceCounter(AktuelleZeit); | |
| − | + | Berechne((AktuelleZeit - BerechnungsZeit) /Frequenz); | |
| − | + | BerechnungsZeit := AktuelleZeit; | |
| − | + | end; | |
| − | + | procedure Berechne(ZeitFaktor:Double); | |
| − | + | begin | |
| − | + | {Alle Berechnungen stehen hier } | |
| − | + | //z.B | |
| − | + | Pos.X := Pos.X + Speed.X*ZeitFaktor; | |
| − | + | if Pos.X > 20 then Pos.X := 0; | |
| + | end; | ||
| + | </pascal> | ||
== Links == | == Links == | ||
*[http://www.delphigl.com/script/do_show.php?name=bombman2&action=2 Bomberman DGL-Tutorial] | *[http://www.delphigl.com/script/do_show.php?name=bombman2&action=2 Bomberman DGL-Tutorial] | ||
Version vom 3. Dezember 2005, 18:25 Uhr
Inhaltsverzeichnis
Kurz-Beschreibung
Timebased Movement sorgt dafür, dass die Bewegungsgeschwindigkeiten nicht vom CPU-/Renderspeed abhängen.
Prinzip
Anstatt Bewegungs-Änderungen mit festen Werten durchzuführen, wird dieser Betrag vorher anhand der vergangenen Zeit berechnet. Dadurch wird verhindert das die Spielgeschwindigkeit an die Bildwiederholungs Frequenz gekoppelt ist.
Berechnung
Der Faktor um wieviel sich alles zu bewegen hat, kann zum Beispiel über die, seit der letzen Abfrage vergangen, Zeit ermittelt werden.
Allgemein:
VergangeneZeit:= (Zeit1-Zeit0)/Frequenz;
Diese vergangende Zeit(eigentlich immer in Sekunden oder Sekundenbruchteilen) ist nun der ZeitFaktor, den wir nutzen um zu bestimmen um wieviel sicht etwas bewegt.
Die Bewegung dann:
Position := Position + Geschwindikeit*VergangeneZeit;
Möglichkeiten
Millisekunden genau unter Windows
Die wohl einfachste Möglichkeit unter Windows so etwas zu realisieren besteht darin mit Hilfe von GetTickCount die Zeit (in Millisekunden) seit dem letzen Windows-Start zu ermitteln.
//Benötigte Variablen
var
BerechnungsZeit:LongWord;
procedure BeimStart;//Was hier drinnen steht sollte zum Start ausgeführt werden
begin
BerechnungsZeit := GetTickCount();
end;
procedure BerechnungsCheck;//Alle nötigen Berechnungen durchführen
const
Frequenz=1000;//Durch Windows festgelegt
var
AktuelleZeit:LongWord;
begin
AktuelleZeit := GetTickCount();
Berechne((AktuelleZeit - BerechnungsZeit) /Frequenz);
BerechnungsZeit := AktuelleZeit;
end;
procedure Berechne(ZeitFaktor:Double);
begin
{Alle Berechnungen stehen hier }
//z.B
Pos.X := Pos.X + Speed.X*ZeitFaktor;
if Pos.X > 20 then Pos.X := 0;
end;
Absolute Genauigkeit per Hardware
Man kann auch die Hardware zur Zeitmessung nutzen um so noch genauere Ergebnisse zu erziehlen. Es kann jedoch theoretisch sein(auch jetzt noch?), dass diese nicht zur verfügung steht.
//Benötigte Variablen
var
BerechnungsZeit:Int64;
Frequenz:Int64;
procedure BeimStart;//Was hier drinnen steht sollte zum Start ausgeführt werden
begin
if not QueryPerformanceFrequency(Frequenz) then//Frequenz ermitteln
raise Exception.create('Kein Hardware Timer vorhanden');
QueryPerformanceCounter(BerechnungsZeit);//Aktuelle Zeit ermitteln
end;
procedure BerechnungsCheck;//Alle nötigen Berechnungen durchführen
var
AktuelleZeit:Int64;
begin
QueryPerformanceCounter(AktuelleZeit);
Berechne((AktuelleZeit - BerechnungsZeit) /Frequenz);
BerechnungsZeit := AktuelleZeit;
end;
procedure Berechne(ZeitFaktor:Double);
begin
{Alle Berechnungen stehen hier }
//z.B
Pos.X := Pos.X + Speed.X*ZeitFaktor;
if Pos.X > 20 then Pos.X := 0;
end;