Delphi掃雷游戲一般都是由主體界面和游戲控制兩部分代碼組成,今天來說游戲的主界面部分如何實現。這個游戲同樣也涉及到資源文件的制作和載入。也正是這些素材的加入,才使本例的掃雷游戲在界面上要比Windows系統自帶的掃雷游戲更能吸引游戲者的目光。下面是素材的准備和加載過程:
1、用圖像制作工具,聲音制作工具來編輯制作資源文件,將這些素材文件保存到同一目錄下。
2、按照前面介紹的方法用記事本新建一個graphic.rc文件,後面會有源碼包供下載。
3、按照前面介紹的方法用brcc32命令將graphic.rc文件編譯成同名的RES資源文件。選擇菜單Tools|Image Editor,然後在Image Editor中選擇File|Open,選中graphics.rc就可以查看這個文件的內容,graphics.res內容會附有源碼包。
4、將生成的graphics.res資源文件拷貝到你所編程序的路徑下,在單元文件{$R *DFM}後或主程序的{$R *.RES}後加上一句{$Rgraphics.res},則將res文件加入去,編譯後資源文件即已包含在可執行文件中了。若有多個資源文件,也按上法依次加入。
5、最後是資源文件在Delphi中的調用方法。
編寫代碼。
(1)在MainForm的OnCreate事件中添加下列代碼,實現對資源文件從RES中的載入,同時實現界面對象的布局。
procedure TMainForm.FormCreate(Sender: TObject);
var loop : BombStatus;
begin
{程序運行時的一些基本初始化設置}
bGameOver := FALSE;
bGameRunning := FALSE;
Timer.Enabled := FALSE;
BombStatusBitmapName[bsNormal] := 113;
BombStatusBitmapName[bsMaskAsBomb] := 112;
BombStatusBitmapName[bsNumber0] := 102;
BombStatusBitmapName[bsNumber1] := 103;
BombStatusBitmapName[bsNumber2] := 104;
BombStatusBitmapName[bsNumber3] := 105;
BombStatusBitmapName[bsNumber4] := 106;
BombStatusBitmapName[bsNumber5] := 107;
BombStatusBitmapName[bsNumber6] := 108;
BombStatusBitmapName[bsNumber7] := 109;
BombStatusBitmapName[bsNumber8] := 110;
BombStatusBitmapName[bsExploded] := 111;
BombStatusBitmapName[bsWrong] := 115;
BombStatusBitmapName[bsShow] := 114; SetWindowLong(Handle,GWL_STYLE, GetWindowLong(Handle,GWL_STYLE) and
not WS_CAPTION);
BackGroundBitmap := TBitmap.Create;
BackGroundBitmap.LoadFromResourceID(hInstance, 121);
ClientWidth := BackGroundBitmap.Width;
ClIEntHeight := BackGroundBitmap.Height;
CloseImage.Left := 383;
CloseImage.Top := 1;
{“開始”圖象的位置}
StartBtnImage.Left := 298;
StartBtnImage.Top := 172;
StartBtnImage.Picture.Bitmap.LoadFromResourceID(hInstance, 127);
StartBtnImage.Width := StartBtnImage.Picture.Bitmap.Width;
StartBtnImage.Height := StartBtnImage.Picture.Bitmap.Height;
Hour := 0;
Minute := 0;
Second := 0;
//根據設置的游戲級別來設置雷的數目
If RadioButton1.Checked Then
BombNumber :=Easy_TotalBombNumber;
If RadioButton2.Checked Then
BombNumber :=Middle_TotalBombNumber;
If RadioButton3.Checked Then
BombNumber :=High_TotalBombNumber;
InitBomb;
Image.Left := 24;
Image.Top := 53;
Image.Width := 224;
Image.Height := 224;
//加載位圖文件
for loop := bsNormal to bsShow do
begin
BombStatusBitmap[loop] := TBitmap.Create;
BombStatusBitmap[loop].LoadFromResourceID(hInstance, BombStatusBitmapName[loop]);
end;
end;
(2)為了將掃雷時間和剩余的雷數顯示在相應的位置,本例構造了DrawTimeAndBombNumber函數。這個函數的代碼如下:
procedure TMainForm.DrawTimeAndBombNumber;
var
s1, s2, s3, s : string;
x, y : integer;
begin
s1 := IntToStr(Second);
if Second < 10 then
begin
S1[2] := s1[1];
S1[1] := '0';
end;
s2 := IntToStr(Minute);
if Minute < 10 then
begin
S2[2] := s2[1];
S2[1] := '0';
end;
s3 := IntToStr(Hour);
if Hour < 10 then
begin
S3[2] := s3[1];
S3[1] := '0';
end;
if BombNumber < 0 then BombNumber := 0;
s := IntToStr(BombNumber);
if BombNumber < 10 then
begin
s[2] := s[1];
s[1] := '0';
end;
x := 283;
y := 75;
with ImageLedLNum do //顯示所用時間
begin
Draw(Canvas, x, y, 10);
Draw(Canvas, x+10, y, StrToInt(s2[1]));
Draw(Canvas, x+10+18, y, StrToInt(s2[2]));
Draw(Canvas, x+10+18+18, y, 11);
Draw(Canvas, x+10+18+18+10, y, StrToInt(s1[1]));
Draw(Canvas, x+10+18+18+18+10, y, StrToInt(s1[2]));
end;
x := 303;
y := 132;
with ImageLedLNum do //顯示剩余雷數
begin
Draw(Canvas, x+10, y, StrToInt(s[1]));
Draw(Canvas, x+10+18, y, StrToInt(s[2]));
end;
end;
(3)下面是MainForm的OnPaint事件代碼,主要是用來繪制界面背景、顯示時間和剩余雷數的數字以及排布雷區。
procedure TMainForm.FormPaint(Sender: TObject); begin // Canvas.Draw(0,0,BackGroundBitmap); // 繪制背景 DrawTimeAndBombNumber; //顯示時間和剩余雷數的數字 ShowBomb; //排布雷區(代碼略,參考光盤) end;
本例主要實現了游戲的資源設計和加載部分,比較系統地論述了資源文件在Delphi中的引入方法,包括了素材的准備和加載、界面顯示和設計、計時器的設置等。與前面一個游戲相比較,這個程序的資源調用方法又略微不同。這一點在游戲設計和代碼編寫的時候一定要仔細加以區別。