Wizard
13-11-2006, 05:33 AM
Hi everyone, I attach the unit file of my project (it's a starfighter game written with delphi and delphix) and would be pleased if someone can explain why the frames per second drops from 75 to about 30 after 60 seconds. Thanks for your help :-)
unit pasMain;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ExtCtrls, DXSounds, DXSprite, DXClass, DXInput, DXDraws, BackGround;
type
TForm1 = class(TDXForm)
DXDraw1: TDXDraw;
DXImageList1: TDXImageList;
DXTimer1: TDXTimer;
DXInput1: TDXInput;
DXSound1: TDXSound;
DXSpriteEngine1: TDXSpriteEngine;
DXWaveList1: TDXWaveList;
Timer1: TTimer;
procedure DXTimer1Timer(Sender: TObject; LagCount: Integer);
procedure DXDraw1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure DXDraw1KeyUp(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure DXDraw1Finalize(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
procedure DXDraw1Initialize(Sender: TObject);
private
procedure StartMain;
{ Private declarations }
public
{ Public declarations }
end;
//This is the player class
TPlayer = class(TImageSprite)
private
Fired: Integer;
public
procedure DoMove(MoveCount: Integer); override;
end;
// This is the attacker class
TAttacker = class(TImageSprite)
private
Fired: Integer;
public
procedure DoMove(MoveCount: Integer); override;
end;
//This is the Enimy class
TEnimy = class(TImageSprite)
private
Movement: Integer;
Speed: Integer;
public
procedure DoMove(MoveCount: Integer); override;
end;
//This is the bullet class
TBullet = class(TImageSprite)
public
procedure DoMove(MoveCount: Integer); override;
procedure DoCollision(Sprite: TSprite; var Done: Boolean);override;
end;
//This is the Bomb class
TBomb = class(TImageSprite)
public
procedure DoMove(MoveCount: Integer); override;
procedure DoCollision(Sprite: TSprite; var Done: Boolean);override;
end;
var
Form1: TForm1;
Player: TPlayer;
Seconds: Integer;
Enimies: Integer;
Bomb : TBomb;
Attacker: TAttacker;
implementation
{$R *.DFM}
{$O+}
var
Explode3x, Explode3y : integer;
Earthx, Earthy : integer;
Explode1x, Explode1y : integer;
Explode2x, Explode2y : integer;
Planetx, Planety : integer;
moveleft, moveright, moveup, movedown : boolean;
procedure TForm1.DXDraw1Initialize(Sender: TObject);
var
i: Integer;
begin
Form1.DoubleBuffered := True;
StartMain;
DXDraw1.Cursor := crNone;
randomize;
Explode3y := DXDraw1.Height - 700;
Explode3x := DXDraw1.Width - 350;
Earthy := DXDraw1.Height - 300;
Earthx := DXDraw1.Width - 300;
Explode1y := DXDraw1.Height -450;
Explode1x := DXDraw1.Width - 900;
Explode2y := DXDraw1.Height - 700;
Explode2x := DXDraw1.Width - 200;
Planetx := DXDraw1.Width - 600;
Planety := DXDraw1.Height -500;
Player := TPlayer.Create(DXSpriteEngine1.Engine);
Player.Image := DXImageList1.Items.Find('Player');
Player.X := 500;
Player.Y := 710;
Player.Width := Player.Image.Width;
Player.Height := Player.Image.Height;
Attacker := TAttacker.Create(DXSpriteEngine1.Engine);
Enimies := 30;
for i := 1 To Enimies do
begin
with TEnimy.Create(DXSpriteEngine1.Engine) do
begin
Image := DXImageList1.Items.Find('EnimyRight');
X := Random(640 * 3) - 640;
Y := Random(450);
Speed := Random(5)+ 3;
Width := Image.Width;
Height := Image.Height;
PixelCheck := True;
AnimLooped := True;
AnimSpeed := 15/1000;
AnimStart := 0;
end;
end;
DXTimer1.Enabled := True;
end;
procedure TForm1.DXDraw1Finalize(Sender: TObject);
begin
DXTimer1.Enabled := False;
end;
procedure TForm1.StartMain;
var
i: integer;
j: integer;
begin
with TBackground.Create(DXSpriteEngine1.Engine) do
begin
SetMapSize(200, 10);
Image:= DXImageList1.Items.Find('Stars');
Y:= 10;
Z:= -22;
FSpeed:= 0.5;
Tile:= TRUE;
for I:= 0 to MapHeight-1 do
for J:= 0 to MapWidth-1 do
begin
Chips[J, I]:= Image.PatternCount-Random(Image.PatternCount div 8);
if Random(100) < 95 then Chips[J, I]:= -1;
end;
end;
with TBackground.Create(DXSpriteEngine1.Engine) do
begin
SetMapSize(200, 10);
Image:= DXImageList1.Items.Find('Stars');
Y:= 30;
Z:= -21;
FSpeed:= 1;
Tile:= TRUE;
for I:= 0 to MapHeight-1 do
for J:= 0 to MapWidth-1 do
begin
Chips[J, I]:= Image.PatternCount-Random(Image.PatternCount div 4);
if Random(100) < 95 then Chips[J, I]:= -1;
end;
end;
with TBackground.Create(DXSpriteEngine1.Engine) do
begin
SetMapSize(200, 10);
Image:= DXImageList1.Items.Find('Stars');
Y:= 40;
Z:= -20;
FSpeed:= 2;
Tile:= TRUE;
for I:= 0 to MapHeight-1 do
for J:= 0 to MapWidth-1 do
begin
Chips[J, I]:= Image.PatternCount-Random(Image.PatternCount div 2);
if Random(100) <95>0) then
X := X - 15;
If moveright and
((X+Form1.DXImageList1.Items.Find('Player').Wid th)<Form1>0) then
Y := Y - 15;
if Movedown and
(y<form1.DXDraw1.Height-65)then
Y:= Y + 15;
MyX := X;
MyY := y;
If isButton1 in Form1.DXInput1.States Then
begin
if Fired <= 5 then //Check if max bullets hasn't been fired yet
begin
Inc(Fired); //Increase number of fired bullets
with TBullet.Create(Form1.DXSpriteEngine1.Engine) do
begin
Image := Form1.DXImageList1.Items.Find('Bullet');
Form1.DXWaveList1.Items.Find('Fire').Play(False);
X := MyX + 25;
Y := MyY;
Width := Image.Width;
Height := Image.Height;
end;
end;
end;
end;
procedure TBullet.DoMove(MoveCount: Integer);
begin
Y := Y - 25;
Collision;
if (Y <0>= Form1.DXDraw1.Height) then
Dead;
end;
procedure TBullet.DoCollision(Sprite: TSprite; var Done: Boolean);
begin
If (Sprite is TEnimy) Then
begin
Sprite.Collisioned := False;
Sprite.Dead;
Enimies := Enimies -1;
Form1.DXWaveList1.Items.Find('hit').Play(False);
Dead;
end;
end;
procedure TBomb.DoMove(MoveCount: integer);
begin
Y := Y + 25;
Collision;
if (Y <= 0) Then
Dead;
end;
procedure TAttacker.DoMove(MoveCount:integer);
begin
if Fired <2> 640 * 2 Then Movement := 1;
if X < -640 Then Movement := 2;
Case Movement of
1:
begin
If Image = Form1.DXImageList1.Items.Find('EnimyRight') Then
Image := Form1.DXImageList1.Items.Find('EnimyLeft');
X := X - Speed // + 10
end;
2:
begin
If Image = Form1.DXImageList1.Items.Find('EnimyLeft') Then
Image := Form1.DXImageList1.Items.Find('EnimyRight');
X := X + Speed // - 10
end;
end;
end;
procedure TForm1.DXDraw1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if key=VK_LEFT then moveleft := True;
if key=VK_RIGHT then moveright := True;
if key=VK_Up then moveup := True;
if key=VK_Down then movedown := True;
if KEY=vk_Escape then application.Terminate;
end;
procedure TForm1.DXDraw1KeyUp(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if key=VK_LEFT then moveleft := False;
if key=VK_RIGHT then moveright := False;
if key=VK_UP then moveup := False;
if key=VK_down then movedown := False;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
//Reset the Fired count
Player.Fired := 0;
Attacker.Fired := 0;
//Increase the time
Inc(Seconds);
end;
end.
[/code]
unit pasMain;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ExtCtrls, DXSounds, DXSprite, DXClass, DXInput, DXDraws, BackGround;
type
TForm1 = class(TDXForm)
DXDraw1: TDXDraw;
DXImageList1: TDXImageList;
DXTimer1: TDXTimer;
DXInput1: TDXInput;
DXSound1: TDXSound;
DXSpriteEngine1: TDXSpriteEngine;
DXWaveList1: TDXWaveList;
Timer1: TTimer;
procedure DXTimer1Timer(Sender: TObject; LagCount: Integer);
procedure DXDraw1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure DXDraw1KeyUp(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure DXDraw1Finalize(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
procedure DXDraw1Initialize(Sender: TObject);
private
procedure StartMain;
{ Private declarations }
public
{ Public declarations }
end;
//This is the player class
TPlayer = class(TImageSprite)
private
Fired: Integer;
public
procedure DoMove(MoveCount: Integer); override;
end;
// This is the attacker class
TAttacker = class(TImageSprite)
private
Fired: Integer;
public
procedure DoMove(MoveCount: Integer); override;
end;
//This is the Enimy class
TEnimy = class(TImageSprite)
private
Movement: Integer;
Speed: Integer;
public
procedure DoMove(MoveCount: Integer); override;
end;
//This is the bullet class
TBullet = class(TImageSprite)
public
procedure DoMove(MoveCount: Integer); override;
procedure DoCollision(Sprite: TSprite; var Done: Boolean);override;
end;
//This is the Bomb class
TBomb = class(TImageSprite)
public
procedure DoMove(MoveCount: Integer); override;
procedure DoCollision(Sprite: TSprite; var Done: Boolean);override;
end;
var
Form1: TForm1;
Player: TPlayer;
Seconds: Integer;
Enimies: Integer;
Bomb : TBomb;
Attacker: TAttacker;
implementation
{$R *.DFM}
{$O+}
var
Explode3x, Explode3y : integer;
Earthx, Earthy : integer;
Explode1x, Explode1y : integer;
Explode2x, Explode2y : integer;
Planetx, Planety : integer;
moveleft, moveright, moveup, movedown : boolean;
procedure TForm1.DXDraw1Initialize(Sender: TObject);
var
i: Integer;
begin
Form1.DoubleBuffered := True;
StartMain;
DXDraw1.Cursor := crNone;
randomize;
Explode3y := DXDraw1.Height - 700;
Explode3x := DXDraw1.Width - 350;
Earthy := DXDraw1.Height - 300;
Earthx := DXDraw1.Width - 300;
Explode1y := DXDraw1.Height -450;
Explode1x := DXDraw1.Width - 900;
Explode2y := DXDraw1.Height - 700;
Explode2x := DXDraw1.Width - 200;
Planetx := DXDraw1.Width - 600;
Planety := DXDraw1.Height -500;
Player := TPlayer.Create(DXSpriteEngine1.Engine);
Player.Image := DXImageList1.Items.Find('Player');
Player.X := 500;
Player.Y := 710;
Player.Width := Player.Image.Width;
Player.Height := Player.Image.Height;
Attacker := TAttacker.Create(DXSpriteEngine1.Engine);
Enimies := 30;
for i := 1 To Enimies do
begin
with TEnimy.Create(DXSpriteEngine1.Engine) do
begin
Image := DXImageList1.Items.Find('EnimyRight');
X := Random(640 * 3) - 640;
Y := Random(450);
Speed := Random(5)+ 3;
Width := Image.Width;
Height := Image.Height;
PixelCheck := True;
AnimLooped := True;
AnimSpeed := 15/1000;
AnimStart := 0;
end;
end;
DXTimer1.Enabled := True;
end;
procedure TForm1.DXDraw1Finalize(Sender: TObject);
begin
DXTimer1.Enabled := False;
end;
procedure TForm1.StartMain;
var
i: integer;
j: integer;
begin
with TBackground.Create(DXSpriteEngine1.Engine) do
begin
SetMapSize(200, 10);
Image:= DXImageList1.Items.Find('Stars');
Y:= 10;
Z:= -22;
FSpeed:= 0.5;
Tile:= TRUE;
for I:= 0 to MapHeight-1 do
for J:= 0 to MapWidth-1 do
begin
Chips[J, I]:= Image.PatternCount-Random(Image.PatternCount div 8);
if Random(100) < 95 then Chips[J, I]:= -1;
end;
end;
with TBackground.Create(DXSpriteEngine1.Engine) do
begin
SetMapSize(200, 10);
Image:= DXImageList1.Items.Find('Stars');
Y:= 30;
Z:= -21;
FSpeed:= 1;
Tile:= TRUE;
for I:= 0 to MapHeight-1 do
for J:= 0 to MapWidth-1 do
begin
Chips[J, I]:= Image.PatternCount-Random(Image.PatternCount div 4);
if Random(100) < 95 then Chips[J, I]:= -1;
end;
end;
with TBackground.Create(DXSpriteEngine1.Engine) do
begin
SetMapSize(200, 10);
Image:= DXImageList1.Items.Find('Stars');
Y:= 40;
Z:= -20;
FSpeed:= 2;
Tile:= TRUE;
for I:= 0 to MapHeight-1 do
for J:= 0 to MapWidth-1 do
begin
Chips[J, I]:= Image.PatternCount-Random(Image.PatternCount div 2);
if Random(100) <95>0) then
X := X - 15;
If moveright and
((X+Form1.DXImageList1.Items.Find('Player').Wid th)<Form1>0) then
Y := Y - 15;
if Movedown and
(y<form1.DXDraw1.Height-65)then
Y:= Y + 15;
MyX := X;
MyY := y;
If isButton1 in Form1.DXInput1.States Then
begin
if Fired <= 5 then //Check if max bullets hasn't been fired yet
begin
Inc(Fired); //Increase number of fired bullets
with TBullet.Create(Form1.DXSpriteEngine1.Engine) do
begin
Image := Form1.DXImageList1.Items.Find('Bullet');
Form1.DXWaveList1.Items.Find('Fire').Play(False);
X := MyX + 25;
Y := MyY;
Width := Image.Width;
Height := Image.Height;
end;
end;
end;
end;
procedure TBullet.DoMove(MoveCount: Integer);
begin
Y := Y - 25;
Collision;
if (Y <0>= Form1.DXDraw1.Height) then
Dead;
end;
procedure TBullet.DoCollision(Sprite: TSprite; var Done: Boolean);
begin
If (Sprite is TEnimy) Then
begin
Sprite.Collisioned := False;
Sprite.Dead;
Enimies := Enimies -1;
Form1.DXWaveList1.Items.Find('hit').Play(False);
Dead;
end;
end;
procedure TBomb.DoMove(MoveCount: integer);
begin
Y := Y + 25;
Collision;
if (Y <= 0) Then
Dead;
end;
procedure TAttacker.DoMove(MoveCount:integer);
begin
if Fired <2> 640 * 2 Then Movement := 1;
if X < -640 Then Movement := 2;
Case Movement of
1:
begin
If Image = Form1.DXImageList1.Items.Find('EnimyRight') Then
Image := Form1.DXImageList1.Items.Find('EnimyLeft');
X := X - Speed // + 10
end;
2:
begin
If Image = Form1.DXImageList1.Items.Find('EnimyLeft') Then
Image := Form1.DXImageList1.Items.Find('EnimyRight');
X := X + Speed // - 10
end;
end;
end;
procedure TForm1.DXDraw1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if key=VK_LEFT then moveleft := True;
if key=VK_RIGHT then moveright := True;
if key=VK_Up then moveup := True;
if key=VK_Down then movedown := True;
if KEY=vk_Escape then application.Terminate;
end;
procedure TForm1.DXDraw1KeyUp(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if key=VK_LEFT then moveleft := False;
if key=VK_RIGHT then moveright := False;
if key=VK_UP then moveup := False;
if key=VK_down then movedown := False;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
//Reset the Fired count
Player.Fired := 0;
Attacker.Fired := 0;
//Increase the time
Inc(Seconds);
end;
end.
[/code]