📄 unit1.pas
字号:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
dgcspts, DGCILib, DGC, DGCStar, DGCSnd, dgcslib;
type
TForm1 = class(TForm)
DGCScreen1: TDGCScreen;
DGCImageLib1: TDGCImageLib;
DGCSpriteMgr1: TDGCSpriteMgr;
DGCAudio1: TDGCAudio;
DGCSoundLib1: TDGCSoundLib;
DGCStarField1: TDGCStarField;
procedure DGCScreen1Initialize(Sender: TObject);
procedure DGCScreen1Flip(Sender: TObject);
procedure FormKeyPress(Sender: TObject; var Key: Char);
procedure DGCSpriteMgr1SpriteStopped(Sprite: TDGCSprite;
LimitsSide: TLimitsSide);
private
{ Private declarations }
public
{ Public declarations }
CurrentLevel:Integer;
Lives:Integer;
Score:Longint;
BulletCount:Integer;
LastFireTickCount:longint;
FirstDonut:Integer;
FirstMidDonut:Integer;
FirstSmallDonut:Integer;
FirstBullet:integer;
numofdonuts:Integer;
AlienShip:Integer;
Donutsleft:Integer;
APaused:Boolean;
HyperSpaceTickCount:Longint;
HyperSpaceWait:Integer;
SaucerTickCount:LongInt;
AWaiting:Boolean;
GameEnd:boolean;
ShipAppearCount:Longint;
Procedure SetUpSprites;
Procedure SetUpAnimations;
Procedure NextLevel;
Procedure CheckKeys;
Procedure CheckCollisions;
Procedure CreateAliens;
Procedure ShowFourMidSizedDonuts(NewX,NewY:Integer);
Procedure ShowFourSmallSizedDonuts(NewX,NewY:Integer);
Procedure DrawScore;
Procedure DrawLives;
Procedure EndOfLevel;
Procedure GameOver;
Procedure FindFirstAvailableBullet(NewX,NewY,Adirection:Integer);
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
Procedure Tform1.SetUpAnimations;
begin
//Add the Our animation
DGCSpriteMgr1.Animations.Add('OurShip', True);
with DGCSpriteMgr1.Animations[0] do
begin
SetFrames(0, 1, [170]);
SetFrames(2, 1, [167]);
SetFrames(4, 1, [165]);
SetFrames(6, 1, [162]);
SetFrames(8, 1, [160]);
SetFrames(10, 1, [157]);
SetFrames(12, 1, [155]);
SetFrames(14, 1, [152]);
SetFrames(16, 1, [150]);
SetFrames(18, 1, [187]);
SetFrames(20, 1, [185]);
SetFrames(22, 1, [182]);
SetFrames(24, 1, [180]);
SetFrames(26, 1, [177]);
SetFrames(28, 1, [175]);
SetFrames(30, 1, [172]);
end;
// Add Bullet Animation
DGCSpriteMgr1.Animations.Add('Bullet',false);
With DGCSpriteMgr1.Animations[1] do
SetAlldirections(50,[190]);
//Add the Donut animation
DGCSpriteMgr1.Animations.Add('LargeDonut', True);
with DGCSpriteMgr1.Animations[2] do
SetallDirections(50,[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29]);
//Add the Medium Donut animation
DGCSpriteMgr1.Animations.Add('MidDonut', True);
with DGCSpriteMgr1.Animations[3] do
SetallDirections(50,[30,32,34,36,38,40,42,44,46,48,50,52,54,56,58,60,62,64,66,68]);
//Add the Medium Donut animation
DGCSpriteMgr1.Animations.Add('SmallDonut', True);
with DGCSpriteMgr1.Animations[4] do
SetallDirections(50,[70,72,74,76,78,80,82,84,86,88,90,92,94,96,98,100,102,104,106,108]);
//Add the Saucer animation
DGCSpriteMgr1.Animations.Add('Saucer', True);
with DGCSpriteMgr1.Animations[5] do
SetallDirections(150,[201,202,203,202]);
end;
Procedure Tform1.DrawScore;
var
ScoreStr:String;
i:Integer;
begin
ScoreStr:=Format('%.8d',[Score]);
for i:=1 to 8 do
DGCScreen1.Back.Draw(((DGCSCreen1.Back.Width div 2)- ((8*17)div 2))+(i*17),0,DGCScreen1.Images[191+(ord(Scorestr[i])-48)],True);
end;
Procedure TForm1.SetUpSprites;
begin
ShipappearCount:=GetTickCount;
DGCSpriteMgr1.Sprites.AddThruster(0, 320, 240, 0, 6, 0);
with DGCSpriteMgr1.Sprites[0] as TDGCThruster do
begin
Acceleration := 0.1; //Try making this a smaller value
Decceleration := 0.05; //Try making this a smaller value
Hide;
end;
end;
Procedure Tform1.DrawLives;
var
i:integer;
begin
With DGCScreen1.Back do
begin
for i:= 1 to Lives-1 do
StretchDraw(rect(i*DGCScreen1.Images[170].Width div 2,height - DGCScreen1.Images[170].height,
i*DGCScreen1.Images[170].Width div 2 + (DGCScreen1.Images[170].width div 2),
height - DGCScreen1.Images[170].height + (DGCScreen1.Images[170].Height div 2)),
DGCScreen1.Images[170],true);
end;
end;
procedure TForm1.DGCScreen1Initialize(Sender: TObject);
var
n: Integer;
temp:integer;
begin
ShipAppearCount:=GetTickCount;
SetupAnimations;
CurrentLevel:=0;
AWaiting:=true;
GameEnd:=False;
HyperSpaceTickCount:=0;
APaused:=False;
Lives:=3;
Score:=0;
SaucerTickCount:=GetTickCount;
DGCScreen1.Flip;
end;
Procedure TForm1.CreateAliens;
var
n,i:integer;
begin
firstDonut:=DGCSpriteMgr1.Sprites.Count;
for n:=1 to NumOfDonuts do
begin
i:=DGCSpriteMgr1.Sprites.AddBouncer(0, Random(DGCScreen1.Back.Width),Random(DGCScreen1.Back.Height), Random(32), 1+Random(3), 2);
with DGCSpriteMgr1.Sprites[i] as TDGCBouncer do
Allactions:=Lawrap;
end;
FirstMidDonut:=DGCSpriteMgr1.Sprites.Count;
for n:=1 to NumOfDonuts*4 do
begin
i:=DGCSpriteMgr1.Sprites.AddBouncer(0, Random(DGCScreen1.Back.Width),Random(DGCScreen1.Back.Height), Random(32), 1+Random(3), 3);
with DGCSpriteMgr1.Sprites[i] as TDGCBouncer do
begin
Allactions:=Lawrap;
Hide;
Disable;
end;
end;
firstSmallDonut:=DGCSpriteMgr1.Sprites.Count;
Donutsleft:=Numofdonuts*16;
for n:=1 to NumOfDonuts*16 do
begin
i:=DGCSpriteMgr1.Sprites.AddBouncer(100, Random(DGCScreen1.Back.Width),Random(DGCScreen1.Back.Height), Random(32), 1+Random(4), 4);
with DGCSpriteMgr1.Sprites[i] as TDGCBouncer do
begin
Allactions:=Lawrap;
Hide;
Disable;
end;
end;
Alienship:=DGCSpriteMgr1.Sprites.AddBouncer(400,640,0,8,3,5);
with DGCSpriteMgr1.Sprites[Alienship] as TDGCBouncer do
begin
// will be hidden default
Hide;
Enable;
Allactions:=LaWrap;
// LookAt(DGCSpriteMgr1.Sprites[0].X,DGCSpriteMgr1.Sprites[0].Y);
end;
FirstBullet:=DGCSpriteMgr1.Sprites.Count;
for n:=1 to 20 do
begin
i:=DGCSpriteMgr1.Sprites.AddBouncer(300, Random(DGCScreen1.Back.Width),Random(DGCScreen1.Back.Height), Random(32), 4, 1);
with DGCSpriteMgr1.Sprites[i] as TDGCBouncer do
begin
Allactions:=LaStopOutside;
Hide;
Disable;
end;
end;
end;
Procedure TForm1.NextLevel;
var
n,i:Integer;
begin
DGCStarfield1.Generate;
while DGCSpriteMgr1.Sprites.Count > 0 do
DGCSPriteMgr1.Sprites.Delete(0);
SetUpSprites;
BulletCount:=21;
Randomize;
inc(currentlevel);
Numofdonuts:=Currentlevel;
If Numofdonuts > 6 then
NumofDonuts:=6;
CreateAliens;
DGCScreen1.FlippingEnabled:=True;
end;
Procedure TForm1.EndofLevel;
var
MsgString:string;
i:integer;
begin
For i:=0 to DGCSpriteMgr1.Sprites.Count - 1 do
DGCSpriteMgr1.Sprites[i].Hide;
DGCScreen1.FlippingEnabled:=False;
DGCScreen1.Back.EraseRect(DGCScreen1.Back.clientrect, 0);
with DGCScreen1.Back.Canvas do
begin
msgstring:=Format('LEVEL %0.2d ',[Currentlevel+1]);
Brush.Style:=BsClear;
Font.Size := 30;
Font.Name:='Times New Roman';
Font.Color := rgb(0,128,0);
TextOut(DGCScreen1.Back.Width div 2 - TextWidth(msgstring) div 2,(DGCScreen1.Back.height div 2)-100 , msgstring);
Font.Color := rgb(0,255,0);
TextOut((DGCScreen1.Back.Width div 2- TextWidth(msgstring)div 2)+2,(DGCScreen1.back.height div 2)-99 , msgstring);
msgstring:='Press Enter To Continue - Esc To Exit';
Font.Color := rgb(128,128,128);
TextOut(DGCScreen1.Back.Width div 2 - TextWidth(msgstring) div 2,DGCScreen1.Back.height -100 , msgstring);
Font.Color := rgb(255,255,255);
TextOut((DGCScreen1.Back.Width div 2- TextWidth(msgstring)div 2)+2,DGCScreen1.back.height -99 , msgstring);
Release;
end;
AWaiting:=true;
end;
Procedure TForm1.GameOver;
var
MsgString:string;
i:integer;
begin
For i:=0 to DGCSpriteMgr1.Sprites.Count - 1 do
DGCSpriteMgr1.Sprites[i].Hide;
DGCScreen1.FlippingEnabled:=False;
DGCScreen1.Back.EraseRect(DGCScreen1.Back.clientrect, 0);
with DGCScreen1.Back.Canvas do
begin
msgstring:='GameOver';
Brush.Style:=BsClear;
Font.Size := 24;
Font.Name:='Times New Roman';
Font.Color := rgb(0,128,0);
TextOut(DGCScreen1.Back.Width div 2 - TextWidth(msgstring) div 2,(DGCScreen1.Back.height div 2)-100 , msgstring);
Font.Color := rgb(0,255,0);
TextOut((DGCScreen1.Back.Width div 2- TextWidth(msgstring)div 2)+2,(DGCScreen1.back.height div 2)-99 , msgstring);
msgstring:='Press Enter For New Game - Esc To Exit';
Font.Color := rgb(128,128,128);
TextOut(DGCScreen1.Back.Width div 2 - TextWidth(msgstring) div 2,DGCScreen1.Back.height -100 , msgstring);
Font.Color := rgb(255,255,255);
TextOut((DGCScreen1.Back.Width div 2- TextWidth(msgstring)div 2)+2,DGCScreen1.back.height -99 , msgstring);
Release;
end;
GameEnd:=true;
end;
procedure TForm1.DGCScreen1Flip(Sender: TObject);
begin
if DonutsLeft <=0 then
Awaiting:=true;
if Lives < 1 then
begin
Gameover;
exit;
end;
If (Awaiting) then
EndOfLevel
else
begin
DGCStarField1.Update;
if (GetTickCount - SaucerTickCount >= 60000) and (Not DGCSpriteMgr1.Sprites[alienship].Visible) then
begin
SaucerTickCount :=GettickCount;
with DGCSpriteMgr1.Sprites[AlienShip] do
begin
// should give 0 or screen width
If Not DGCAudio1.Sound[0].Playing then
DGCAudio1.Sound[0].PlayLoop;
X:=random(1)*600;
Y:=random(1)*400;
LookAt(DGCSpriteMgr1.Sprites[0].X,DGCSpriteMgr1.Sprites[0].Y);
Show;
Resume;
end;
end;
DrawLives;
DrawScore;
CheckKeys;
CheckCollisions;
If HyperSpaceTickcount <> 0 then
begin
// Disable Fire While In HyperSpace
BulletCount := 21;
if (GetTickcount - HyperSpaceTickCount) >= (HyperSpaceWait*100) then
begin
HyperSpaceTickCount:=0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -