87 lines
1.4 KiB
ObjectPascal
87 lines
1.4 KiB
ObjectPascal
unit Unit2;
|
|
|
|
{$mode ObjFPC}{$H+}
|
|
|
|
interface
|
|
|
|
uses
|
|
Classes, SysUtils;
|
|
|
|
const
|
|
StartMSecsPerFrame = 20;
|
|
|
|
type
|
|
IGameHandler = class(TObject)
|
|
private
|
|
MSecsPerFrame: Integer;
|
|
|
|
public
|
|
Finished: Boolean;
|
|
constructor Create;
|
|
procedure DoIteration; virtual; abstract;
|
|
|
|
procedure SlowDown;
|
|
procedure SpeedUp;
|
|
end;
|
|
|
|
TActionThread = class(TThread)
|
|
private
|
|
FGameHandler: IGameHandler;
|
|
|
|
public
|
|
constructor Create(AGameHandler: IGameHandler);
|
|
destructor Destroy;
|
|
|
|
property GameHandler: IGameHandler read FGameHandler;
|
|
|
|
procedure Execute; override;
|
|
end;
|
|
|
|
implementation
|
|
|
|
constructor IGameHandler.Create;
|
|
begin
|
|
Finished := false;
|
|
MSecsPerFrame := StartMSecsPerFrame
|
|
end;
|
|
|
|
procedure IGameHandler.SlowDown;
|
|
begin
|
|
MSecsPerFrame := StartMSecsPerFrame
|
|
end;
|
|
|
|
procedure IGameHandler.SpeedUp;
|
|
begin
|
|
MSecsPerFrame := 100
|
|
end;
|
|
|
|
constructor TActionThread.Create(AGameHandler: IGameHandler);
|
|
begin
|
|
inherited Create(false);
|
|
FGameHandler := AGameHandler
|
|
end;
|
|
|
|
destructor TActionThread.Destroy;
|
|
begin
|
|
FreeAndNil(FGameHandler)
|
|
end;
|
|
|
|
procedure TActionThread.Execute;
|
|
var
|
|
OldTime: TDateTime;
|
|
ToWait: Integer;
|
|
begin
|
|
while not GameHandler.Finished do
|
|
begin
|
|
OldTime := Now;
|
|
Synchronize(@FGameHandler.DoIteration);
|
|
{ Синхронизация с таймером. }
|
|
ToWait := Round(GameHandler.MSecsPerFrame - (Now - OldTime) * MSecsPerDay);
|
|
if ToWait > 0 then
|
|
Sleep(ToWait)
|
|
end
|
|
end;
|
|
|
|
end.
|
|
|