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中的引入方法,包括了素材的准備和加載、界面顯示和設計、計時器的設置等。與前面一個游戲相比較,這個程序的資源調用方法又略微不同。這一點在游戲設計和代碼編寫的時候一定要仔細加以區別。