From c6db72ff9c26450987ddbafdd5a3b573e17439e2 Mon Sep 17 00:00:00 2001 From: tobigun Date: Tue, 13 May 2008 18:29:58 +0000 Subject: TRelativeTimer added. A replace for the buggy TimeSkip/SkipTime stuff. It works like a simple stopwatch. git-svn-id: svn://svn.code.sf.net/p/ultrastardx/svn/trunk@1085 b956fd51-792f-4845-bead-9b4dfca2ff2c --- Game/Code/Classes/UTime.pas | 78 +++++++++++++++++++++++++++++++++++++++------ 1 file changed, 68 insertions(+), 10 deletions(-) (limited to 'Game/Code/Classes/UTime.pas') diff --git a/Game/Code/Classes/UTime.pas b/Game/Code/Classes/UTime.pas index bd03754d..2acca35c 100644 --- a/Game/Code/Classes/UTime.pas +++ b/Game/Code/Classes/UTime.pas @@ -10,8 +10,22 @@ interface type TTime = class - constructor Create; - function GetTime: real; + public + constructor Create; + function GetTime(): real; + end; + + TRelativeTimer = class + private + AbsoluteTime: int64; // system-clock reference time for calculation of CurrentTime + RelativeTimeOffset: real; + Paused: boolean; + public + constructor Create; + procedure Pause(); + procedure Resume(); + function GetTime(): real; + procedure SetTime(Time: real); end; procedure CountSkipTimeSet; @@ -20,7 +34,8 @@ procedure CountMidTime; var USTime : TTime; - + VideoBGTimer: TRelativeTimer; + TimeNew : int64; TimeOld : int64; TimeSkip : real; @@ -46,12 +61,6 @@ http://www.gamedev.net/community/forums/topic.asp?topic_id=466145&whichpage=1%EE *) -constructor TTime.Create; -begin - inherited; - CountSkipTimeSet; -end; - procedure CountSkipTimeSet; begin TimeNew := SDL_GetTicks(); @@ -70,9 +79,58 @@ begin TimeMid := (TimeMidTemp - TimeNew) / cSDLCorrectionRatio; end; +{** + * TTime + **} + +constructor TTime.Create; +begin + inherited; + CountSkipTimeSet; +end; + function TTime.GetTime: real; begin - Result := SDL_GetTicks() / cSDLCorrectionRatio; + Result := SDL_GetTicks() / cSDLCorrectionRatio; end; +{** + * TRelativeTimer + **} + +constructor TRelativeTimer.Create; +begin + inherited; + RelativeTimeOffset := 0; + AbsoluteTime := SDL_GetTicks(); + Paused := false; +end; + +procedure TRelativeTimer.Pause(); +begin + RelativeTimeOffset := GetTime(); + Paused := true; +end; + +procedure TRelativeTimer.Resume(); +begin + AbsoluteTime := SDL_GetTicks(); + Paused := false; +end; + +function TRelativeTimer.GetTime: real; +begin + if Paused then + Result := RelativeTimeOffset + else + Result := RelativeTimeOffset + (SDL_GetTicks() - AbsoluteTime) / cSDLCorrectionRatio; +end; + +procedure TRelativeTimer.SetTime(Time: real); +begin + RelativeTimeOffset := Time; + AbsoluteTime := SDL_GetTicks(); +end; + + end. -- cgit v1.2.3