⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 unit1.pas

📁 Directx游戏制作开发包DGCBETA6
💻 PAS
📖 第 1 页 / 共 2 页
字号:
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 + -