aboutsummaryrefslogblamecommitdiffstats
path: root/Game/Code/Classes/UTime.pas
blob: 2acca35cf9ad140128aa21445296d4ef5932185c (plain) (tree)
1
2
3
4
5
6
7
8
9



           


                
 
                 
 

               















                                                                                             




                           

   
                      

                               




                      



              
      
          


                             
 
  

                                                                           
 


                                                                                      


  

                           
                                



                        


                                                         

    
                       
     

                                                               

    









                         
                             
     
                                                 

    






































                                                                                         
    
unit UTime;

interface

{$IFDEF FPC}
  {$MODE Delphi}
{$ENDIF}

{$I switches.inc}

type
  TTime = class
    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;
procedure CountSkipTime;
procedure CountMidTime;

var
  USTime      : TTime;
  VideoBGTimer: TRelativeTimer;

  TimeNew     : int64;
  TimeOld     : int64;
  TimeSkip    : real;
  TimeMid     : real;
  TimeMidTemp : int64;

implementation

uses
  sdl,
  ucommon;
  
const
  cSDLCorrectionRatio = 1000;

(*
BEST Option now ( after discussion with whiteshark ) seems to be to use SDL
timer functions...

SDL_delay
SDL_GetTicks
http://www.gamedev.net/community/forums/topic.asp?topic_id=466145&whichpage=1%EE%8D%B7
*)


procedure CountSkipTimeSet;
begin
  TimeNew     := SDL_GetTicks();
end;

procedure CountSkipTime;
begin
  TimeOld     := TimeNew;
  TimeNew     := SDL_GetTicks();
  TimeSkip    := (TimeNew-TimeOld) / cSDLCorrectionRatio;
end;

procedure CountMidTime;
begin
  TimeMidTemp := SDL_GetTicks();
  TimeMid     := (TimeMidTemp - TimeNew) / cSDLCorrectionRatio;
end;

{**
 * TTime
 **}

constructor TTime.Create;
begin
  inherited;
  CountSkipTimeSet;
end;

function TTime.GetTime: real;
begin
  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.