实例5--打地鼠(界面实现)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实例五打地鼠(界面实现部分)
【程序说明】
打地鼠是一个以前非常流行的游戏,这个游戏的版本也是层出不穷。
虽然游戏界面一直在变换,但是它的核心代码却变化不大。
由于程序的完整代码较长,这里分两个实例来说明这个游戏:界面实现部分和主体部分。
前者主要讲解游戏的界面是如何实现的,后者则阐述游戏的主要设计思想和具体的实现代码。
本例的程序运行结果如图4-1所示。
图5-1 打地鼠
【编程思路】
一个成功的游戏除了要有好的游戏思想之外,还必须有精美的素材。
这些素材包括图像、声音和影象等。
素材的加入可以使游戏更加具有趣味性。
而事实上,这些素材的准备和搭配就往往要占去游戏开发的很大一部分时间。
下面是本例素材的基本实现方法和步骤:
1、用专业的资源制作工具,如图像制作工具,声音制作工具来编辑制作资源文件,将这些文件保存到同一目录下。
2、用记事本新建一个RC文件(在保存时选择文件类型为“所有类型”,文件名中键入*.rc)。
比如本例的这个资源文件的rc文件内容见图5-2。
注意RC文件的格式:名称类型实际文件名称。
特别要注意
图5-2 本例用到的graphics.rc文件
的是要确保实际名称是有效存在的。
而且.资源类型除CURSOR、BITMAP、WA VE、A VI 、ICON等外,还可以字体文件或字符串文件等。
本例也有这方面的涉及。
3、将rc文件编译成res资源文件。
将RC文件和实际资源文件拷到系统盘根目录或Brcc32.exe下(目录为X:\Borland\Delphi7\Bin),执行Delphi提供的:Brcc32 命令:Brcc32 graphics.rc (回车)。
如果编译成功,则会生成一个结尾为res的文件,这个文件就是我们需要的资源文件——graphics.res。
选择菜单Tools|Image Editor,然后在Image Editor中选择File|Open,选中graphics.rc就可以查看这个文件的内容,如图5-3所示。
图5-3 graphics.res内容
4、将生成的graphics.res资源文件拷贝到你所编程序的路径下,在单元文件{$R *DFM}后或主程序的{$R *.RES}后加上一句{$Rgraphics.res},则将res文件加入去,编译后资源文件即已包含在可执行文件中了。
若有多个资源文件,也按上法依次加入。
5、最后是资源文件在Delphi中的调用方法。
具体可参考下面的代码。
【编程步骤】.
1.首先,按【编程思路】的方法设计游戏素材。
然后,选择File|New|Application,新建一个应用程序。
2.主窗口设计。
首先向Form上添加2个Timer、1个PopupMenu,然后对这些控件进行布局,2个Timer的Name分别是ScoreTimer和RatTimer,Enabled分别为False和True,Interval分别为1000和40,如图4-2所示。
这个窗口是作为主窗口的(图5-1的下半部分)。
图5-3 主窗口的控件和窗口布局
3.控制窗口设计。
选择File|New||Form,然后向Form上添加7个Image和1个ImageList,如图5-4所示。
双击ImageList1,然后按Add载入10个数字位图,如图5-5所示。
图5-4 控制窗口
图5-5 ImageList1的内容
4.编写代码。
打地鼠游戏分为两个部分来说明。
本部分的代码大都是面向界面的,而且由于篇幅有限,只介绍主要的代码。
完整代码可以参考光盘内容。
(1)在程序运行后,要进行一些必要的设置:初始数据的设置,素材的载入和具体的位置,计时设置,等。
这些都是通过下列代码来实现。
在这段代码中,有不少自定义的函数,这在代码中说明。
procedure TMainForm.FormCreate(Sender: TObject);
var
myRgn : HRGN;
round : integer;
btnOrder : MenuButtonOrder;
begin
{程序运行的初始设置}
GameRunning := FALSE;
GamePause := FALSE;
InitData; //初始数字的设置
HandStatus := Hand_Up; //锤子松开
{设置素材的位置和显示}
BackGroundBitmap := TBitmap.Create;
BackGroundBitmap.LoadFromResourceName(hInstance, 'BACKGROUND');
BufferBitmap := TBitmap.Create;
BufferBitmap.Width := BackGroundBitmap.Width;
BufferBitmap.Height := BackGroundBitmap.Height;
MainForm.ClientWidth := BackGroundBitmap.Width;
MainForm.ClientHeight := BackGroundBitmap.Height;
OKUPButtonBitmap:= TBitmap.Create;
OKUPButtonBitmap.LoadFromResourceName(hInstance, 'OKUP');
OKDOWNButtonBitmap:= TBitmap.Create;
OKDOWNButtonBitmap.LoadFromResourceName(hInstance, 'OKDOWN');
CtrlBitmap := TBitmap.Create;
CtrlBitmap.LoadFromResourceName(hInstance, 'CONTROL');
for btnOrder := btnOrderNEW to btnOrderABOUT do
begin
MenuButtonBitmap[btnOrder, btnUP] := TBitmap.Create;
MenuButtonBitmap[btnOrder,btnUP].LoadFromResourceName(hInstance,
MenuButtonImageName[btnOrder, btnUP]);
MenuButtonBitmap[btnOrder, btnOVER] := TBitmap.Create;
MenuButtonBitmap[btnOrder, btnOVER].LoadFromResourceName(hInstance,
MenuButtonImageName[btnOrder, btnOVER]);
MenuButtonBitmap[btnOrder, btnDown] := TBitmap.Create;
MenuButtonBitmap[btnOrder, btnDown].LoadFromResourceName(hInstance,
MenuButtonImageName[btnOrder, btnDOWN]);
end;
{图像窗口的实现}
round := 128;
MainForm.Brush.Style:=bsClear;
myRgn := 0;
GetWindowRgn(MainForm.Handle, myRgn);
DeleteObject(myRgn);
myRgn:= CreateroundRectRgn(0,0,MainForm.Width,MainForm.Height, round, round);
SetWindowRgn(MainForm.Handle, myRgn, TRUE);
SpriteBitmap := TBitmap.Create;
SpriteBitmap.LoadFromResourceName(hInstance, 'SPRITE');
MaskBitmap := TBitmap.Create;
MaskBitmap.LoadFromResourceName(hInstance, 'MASK');
BitBlt(BufferBitmap.Canvas.Handle, 0, 0, BufferBitmap.Width, BufferBitmap.Height,
BackGroundBitmap.Canvas.Handle, 0, 0, SRCCOPY);
RatTimer.Enabled := FALSE;
LeftTime := 59;
Score := 0;
Left := (Screen.Width - Width) div 2;
Top := (Screen.Height - Height) div 2;
end;
(2)当主窗口显示之后,控制窗口也同样显示在主窗口的上面,这是下面的代码实现的。
注意在MainForm的implementation后加入uses Ctrl。
procedure TMainForm.FormShow(Sender: TObject);
begin
//游戏上半部分界面的显示位置
CtrlForm.Left := MainForm.Left + 69;
CtrlForm.Top := MainForm.Top - 100;
CtrlForm.Show;
end;
(3)下面是控制窗口出现的代码,其目的同样也是为了加载素材和进行一些基本设置。
procedure TCtrlForm.FormCreate(Sender: TObject);
var
offset : cardinal;
i : integer;
begin
{控制窗口出现的一些基本设置}
CtrlForm.ClientWidth := CtrlBitmap.Width;
CtrlForm.ClientHeight := CtrlBitmap.Height;
CtrlForm.Canvas.Draw(0, 0, CtrlBitmap);
MenuImage.Width := 12;
MenuImage.Height := 12;
MenuImage.Top := 2;
MenuImage.Left := 2;
MinImage.Width := 12;
MinImage.Height := 12;
MinImage.Top := 2;
MinImage.Left := CtrlForm.ClientWidth - 14;
MinUPBitmap := TBitmap.Create;
MinUPBitmap.LoadFromResourceName(hInstance, 'MINUP');
MinDOWNBitmap := TBitmap.Create;
MinDOWNBitmap.LoadFromResourceName(hInstance, 'MINDOWN');
MenuBitmap := TBitmap.Create;
MenuBitmap.LoadFromResourceName(hInstance, 'MENU');
MinImage.Picture.Bitmap := MinUPBitmap;
MenuImage.Picture.Bitmap := MenuBitmap;
offset := Cardinal(@NewBtnImage);
i := 0;
while offset <= Cardinal(@AboutBtnImage) do
begin
PTImage(offset)^.Tag := i;
PTImage(offset)^.Width := 30;
PTImage(offset)^.Height := 25;
PTImage(offset)^.Top := 75;
PTImage(offset)^.Left := 25+i*55;
PTImage(offset)^.Picture.Bitmap := MenuButtonBitmap[MenuButtonOrder(i), btnUP];
i := i + 1;
offset := offset + sizeof(PTImage);
end;
bLeftBtnDown := FALSE;
bCloseImageClick := FALSE;
end;
5.这几段代码只是本例完整代码的一小部分,本例的完整代码请参考光盘内容。
【程序小结】
本例主要实现了游戏的资源设计和加载部分,比较系统地论述了资源文件在Delphi中的引入方法,包括了素材的准备和加载、界面显示和设计、计时器的设置等。
资源文件是游戏美丽的装饰,是一个游戏必不可少的。
资源文件的好坏其实也直接决定着一个商品游戏的推出能是否成功,成为一个游戏设计中的重要一环。