unit Main; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, typeRendrer, typeParticleManager; type TfrmMain = class(TForm) Panel1: TPanel; Timer1: TTimer; procedure Timer1Timer(Sender: TObject); procedure FormResize(Sender: TObject); procedure FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); private { Private declarations } FRendrer: TRendrer; FParticleManager: TParticleManager; FStart: int64; public { Public declarations } constructor Create(AOwner: TComponent); override; destructor Destroy; override; end; var frmMain: TfrmMain; implementation uses typeParticleEmitter; {$R *.dfm} { TfrmMain } { TfrmMain } constructor TfrmMain.Create(AOwner: TComponent); begin inherited; FStart := GetTickCount; FRendrer := TRendrer.Create(Panel1.Handle); FParticleManager := TParticleManager.Create; FParticleMAnager.AddEmitter(TParticleEmitter.Create); end; destructor TfrmMain.Destroy; begin FParticleManager.Free; FRendrer.Free; inherited; end; procedure TfrmMain.FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); begin if Key = VK_RIGHT then FRendrer.Camera.Rotate(-1) else if Key = VK_LEFT then FRendrer.Camera.Rotate(1) else if Key = VK_UP then FRendrer.Camera.MoveForward(1) else if Key = VK_DOWN then FRendrer.Camera.MoveForward(-1) ; end; procedure TfrmMain.FormResize(Sender: TObject); begin FRendrer.HandleResize(Panel1.BoundsRect); end; procedure TfrmMain.Timer1Timer(Sender: TObject); begin FParticleManager.ProcessFrame(GetTickCount - FStart); FRendrer.Render(FParticleManager.Particles); end; end.