1、实例六 打地鼠(主体部分)【程序说明】在实例五中,只给出了几段用于素材加载和界面显示的代码。在本例中将继续给出打地鼠的主体部分代码。程序运行后,鼠标单击左上角的老鼠图标,会弹出一个控制菜单。按下右上角的倒三角图标就会退出程序。本例的程序运行结果如图 6-1 所示。图 6-1 打地鼠(主体部分)【编程思路】在实例五中,已经比较详细地说明了界面的实现过程。在本例中,则主要介绍程序的具体实现过程。在程序的实现过程中,主要可以分为下面几个部分:1、 用定时器实现老鼠的出现和隐没在本例中,首先构造一些函数用于实现存放老鼠出现和隐没位置,然后通过定时器来加载这些数据。2、 锤子不同状态的变化在本例中,锤子
2、有三种不同的状态:松开、敲击和击中。这三种状态与鼠标的 OnMouseDown 事件和OnMouseDown 事件对应着。3、 菜单以及相应图标事件的处理主要用于实现游戏的重新开始、暂停、恢复或退出等事件,而图标对应的事件则除了实现一定的游戏功能外,还要对图标自身的更换处理。游戏的主体部分详细代码和说明见【编程步骤】部分。由于篇幅有限,完整的代码可以参考光中的内容。这里只给出代码的主要部分。【编程步骤】.1用定时器实现老鼠的出现和隐没在实现这个功能时,首先要构造一些函数 LoadRatSpr、LoadRat、InitData、DrawRats、PopupRats 和UpdateRats 等,用
3、于存放鼠标位置和绘制鼠标。procedure LoadRatSpr(i, ox, oy, x, y, w, h : integer);begin老鼠变换的坐标值RatSpri.ox :=ox;RatSpri.oy :=oy;RatSpri.x :=x;RatSpri.y :=y;RatSpri.w :=w;RatSpri.h :=h;end;procedure LoadRat(row, col, x, y : integer);begin老鼠出现的坐标值Ratrow, col.x := x;Ratrow, col.y := y;Ratrow, col.pos := 0;Ratrow, col.
4、speed := 0;end;procedure InitData;begin老鼠出现的位置LoadRat(0, 0, 187, 48);LoadRat(1, 0, 127, 79);LoadRat(2, 0, 75, 116);LoadRat(0, 1, 247, 58);LoadRat(1, 1, 189, 90);LoadRat(2, 1, 146, 126);LoadRat(0, 2, 304, 66);LoadRat(1, 2, 262, 98);LoadRat(2, 2, 222, 134);LoadRatSpr(1, $00, $00, $5E, $36, $3C, $39);L
5、oadRatSpr(2, $01, $02, $61, $02, $38, $36);LoadRatSpr(3, $01, $0a, $D8, $4E, $38, $2E);LoadRatSpr(4, $02, $0E, $D7, $24, $38, $2A);LoadRatSpr(5, $02, $16, $D8, $00, $38, $22);LoadRatSpr(6, $02, $1A, $D7, $82, $35, $1E);LoadRatSpr(7, $02, $1A, $A0, $85, $35, $1E);LoadRatSpr(8, $02, $1A, $9F, $68, $35
6、, $1E);LoadRatSpr(9, $02, $1A, $9F, $4B, $35, $1E);LoadRatSpr(10, $02, $1A, $9E, $2D, $35, $1E);LoadRatSpr(11, $02, $1D, $9E, $12, $35, $1B);LoadRatSpr(12, $02, $2A, $9E, $01, $35, $0E);LoadRatSpr(13, $01, $21, $5E, $70, $3D, $25);LoadRatSpr(14, $01, $21, $5D, $94, $3D, $1A);LoadRatSpr(15, $00, $00,
7、 $00, $00, $00, $00);end;procedure DrawRats(x, y, c : integer);begin绘制老鼠if c 0 thenbeginBitBlt(BufferBitmap.Canvas.Handle, x+RatSprc.ox, y+RatSprc.oy, RatSprc.w, RatSprc.h,MaskBitmap.Canvas.Handle, RatSprc.x, RatSprc.y, SRCAND);BitBlt(BufferBitmap.Canvas.Handle, x+RatSprc.ox, y+RatSprc.oy, RatSprc.w
8、, RatSprc.h,SpriteBitmap.Canvas.Handle, RatSprc.x, RatSprc.y, SRCINVERT);end;end;procedure PopupRats;var i, j : integer;begin老鼠随机出现if Frames mod 5 = 0 thenbegini := random(3);j := random(3);if Rati,j.pos = 0 thenbeginRati,j.pos := 12;Rati,j.speed := random(1)+1;end;end;end;procedure UpdateRats(row,
9、col : integer);begin老鼠位置的更新if (Ratrow, col.pos 0) thenbeginif (Frames mod Ratrow, col.speed = 0) thenRatrow, col.pos := Ratrow, col.pos - 1;endelseif Ratrow,col.pos 12 thenbeginif (Frames mod Ratrow, col.speed = 0) then Ratrow, col.pos := Ratrow, col.pos + 1;if Ratrow, col.pos = 15 then Ratrow, col.
10、pos := 0;end;end;在构造了这些函数之后,就可以在定时器 RatTimer 的 OnTimer 事件中加入下列代码,实现鼠标的显示和隐没。procedure TMainForm.RatTimerTimer(Sender: TObject);var row, col : integer;begin老鼠的显示和隐没Frames := Frames + 1;FormPaint(Self);PopupRats;for row := 0 to 2 dobeginfor col := 0 to 2 dobeginUpdateRats(row, col);end;end;if LeftTime
11、 0) and (sp Ratrow, col.x + RatSprsp.ox + d) and(X Ratrow, col.y + RatSprsp.oy ) and(Y Ratrow, col.y + RatSprsp.oy + RatSprsp.h ) thenbeginRatrow, col.pos := 13;Ratrow, col.speed := 5;if Button = mbLeft thenbeginHandStatus := Hand_Hit; /锤子击中老鼠PlaySound(HIT, hInstance, SND_RESOURCE or SND_ASYNC);end;
12、end;end;end;FormPaint(self);end;end;procedure TMainForm.FormMouseUp(Sender: TObject; Button: TMouseButton;Shift: TShiftState; X, Y: Integer);begin窗口 OnMouseUp 事件if (GameRunning = FALSE) or (GamePause = TRUE) thenexit;if Button = mbLeft thenHandStatus := Hand_Up; /锤子松开FormPaint(self);end;3、弹出式菜单的功能主要
13、是用来控制游戏的,下面只给出“开始新游戏”的代码。其余的可以参考光盘内容。procedure TMainForm.NewClick(Sender: TObject);begin开始游戏的一些必要设置LeftTime := 59;RatTimer.Enabled := TRUE;ScoreTimer.Enabled := TRUE;GameRunning := TRUE;GamePause := FALSE;Cursor := -1;Frames := 0;InitData;Randomize;FormPaint(self);end;4由于篇幅原因,这里给出的代码只是本例的一部分,完整的代码还请参考光盘内容。这里就不详细列出了。【程序小结】本例是打地鼠的主体部分的主要代码,这个部分可以分为【编程思路】中的三个模块来实现。每个模块的实现代码都比较长,从这里也可以看出,一个游戏的规划和设计是非常重要的,最好能有一个书面的游戏设计书或设计规划之类的参考对象。否则,到了游戏的后期代码编制阶段,常常会出现顾此失彼的想象。在参考对象中,要对各个模块有比较详细的部署。这样编制出来的游戏才不会虎头蛇尾。更多 Delphi 精品学习代码:http:/