为游戏画面的缓冲区。于是,我就在private里加入了三个变量:FBack:TBmex; FApple:TBmex; FBuffer:TBmex;。
在游戏画面的上方有一段操作说明文字。这段文字是要程序来设定,而不是TApple来设定的,所以,我又加入了一个FCaption:String;并在public加入了property Caption:String read FCaption write FCaption;以便让程序可以修改这段说明文字。
程序必须知道当前状态(与显示画面差不多),才能正确的控制TApple。所以,我又加入了FRunning:Integer;并在public加入了property Running:Integer read FRunning;以便让程序知道当前状态,并且防止程序改变当前状态使得TApple被破坏。
游戏在运行的时候,除了苹果的位置以外,还依赖于三个参数:1:剩余量。来记录在掉几个苹果游戏就结束了。2:当前分数。3:苹果生产速度。因此,又有了: FLeft:Integer; FScore:Integer; FAppleBuilder:Integer; 与
property Left:Integer read FLeft; property Score:Integer read FScore;
property AppleBuilder:Integer read FAppleBuilder write FAppleBuilder;
在游戏中,我们需要关于苹果的一些信息。有字母,位置,有没有显示这三个量,因此,我就果断地在TApple与type中间加入了: TAppleImp=record X,Y:Integer;
Speed:Integer; Used:Boolean; end;
并在private里写道:Apples:array[65..90]of TAppleImp;
FAppleBuilder是时间间隔,所以,要有一个变量来记录时间,于是TimeAB:Integer;就光荣地诞生了。
Apple.exe为了吸引人们去玩,于是有了一个最高分的概念,所以,我挥一挥手,就不知道从哪里来了一个FHighestScore:Integer;。在结束画面的时候,如果最高分被打破的话,就要先是一句话,所以,我就顺手拿了一个FMadeHighest:Boolean;,并且在显示之后会自动变为False。当最高分被打破的时候,Apple就要在硬盘上记录分数。于是,TApple就要求程序在Create TApple时输入分数文件。于是,为了记录分数文件的文件名,FScoreFile:String;与property ShowScoreCaption:Boolean read FShowScoreCaption write FShowScoreCaption;便呱呱落地了。
我上面写道,我把Logo与结束画面合起来。为了区别,就有了一个变量FShowScoreCaption:Boolean;。为True时就是Logo。
现在,大家所看到的代码必须是: unit Display; interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, vaeBmex;
const
MaxLeft=10; R_Static=0; R_Running=1; R_ShowScore=2; R_Difficulty=4; type
TAppleImp=record X,Y:Integer; Speed:Integer; Used:Boolean; end;
TApple=class(TObject) private
FBack:TBmex; FApple:TBmex; FBuffer:TBmex; FCaption:String; FRunning:Integer;
FLeft:Integer; FScore:Integer;
FAppleBuilder:Integer;
FShowScoreCaption:Boolean;
FScoreFile:String;
FHighestScore:Integer;
FMadeHighest:Boolean;
Apples:array[65..90]of TAppleImp; TimeAB:Integer; protected published
public
property Caption:String read FCaption write FCaption; property Running:Integer read FRunning; property Left:Integer read FLeft; property Score:Integer read FScore;
property AppleBuilder:Integer read FAppleBuilder write FAppleBuilder;
property ShowScoreCaption:Boolean read FShowScoreCaption write FShowScoreCaption; end;
implementation end.
否则的话,赶快改!!!
我依稀记得在写完这段声明之后,一大堆富有建设性的代码就跟着涌了出来。TApple的第一件事就是Create与Free。于是,我先机械地在published里写道:
constructor Create(ScoreFile:String); procedure Free;
当然,接着就是那些富有建设性的代码了。 constructor TApple.Create(ScoreFile:String); var SL:TStringList;//用来打开分数文件 begin
//建立TBmex
FBack:=TBmex.Create; FApple:=TBmex.Create;
FBuffer:=TBmex.Create;
FBuffer.Canvas.Font.Name:='Arial Black';
//接下来的这一行代码是没有意义的。我只是忘了删掉而已,顺便保持代码与文章的一致性。
FRunning:=R_Static; //设置一些东西
FShowScoreCaption:=False; FMadeHighest:=False; FScoreFile:=ScoreFile; //打开分数文件
SL:=TStringList.Create;
SL.LoadFromFile(FScoreFile); FHighestScore:=StrToInt(SL[0]);
SL.Free; end;
Free的代码我就不介绍了。一定是那些东西。 procedure TApple.Free; begin
FBack.Free; FApple.Free;
FBuffer.Free;
inherited Free;//如果你不怕内存泄漏的话,这句代码你可以考虑删掉。 end;
接下来,在private里写一些工具代码。 1:把背景图复制到缓冲区。 procedure TApple.DrawBack; begin
FBuffer.Draw(FBack,0,0);
end;
2:打印字符串。字符串是白色的,外面还包围着一圈黑色。怎么办呢? procedure TApple.DrawText(X,Y:Integer;Caption:String);
var C,R:Integer;
begin
FBuffer.TextOut(X,Y,Caption,clWhite,clBlack); end;
有了VAE就是不一样。哈哈哈……
3:画苹果。现在不知要复制图片,还要画一个字母: procedure TApple.DrawApple(X,Y:Integer;C:Char); var W,H:Integer; begin
DrawTrans(FBuffer,FApple,X-FApple.Width div 2,Y-FApple.Height div 2); FBuffer.Canvas.Brush.Style:=bsClear; FBuffer.Canvas.Font.Size:=24; FBuffer.Canvas.Font.Color:=clWhite; W:=FBuffer.Canvas.TextWidth(C);
H:=FBuffer.Canvas.TextHeight(C); FBuffer.Canvas.TextOut(X-W div 2,Y-H div 2,C);
end;
X,Y代表的是中心位置。为了使字符被画在中间,字符的位置自然就是(X-W div 2,Y-H div 2)了。
4:画透明图像。
procedure TApple.DrawTrans(Dst,Src:TBmex;Left,Top:Integer); begin
Dst.DrawTrans(Src,0,0,Src.Width,Src.Height,Left,Top,0); end;
DrawApple就有用到这个。 5:获得空闲的苹果。
function TApple.GetUnusedApple:Integer; var I,C:Integer; begin C:=0;
for I:=65 to 90 do
if Apples[I].Used then C:=C+1; if C=26 then result:=-1 else begin
repeat
I:=Random(26)+65; until not Apples[I].Used; result:=I;
end; end;
苹果的字符信息被苹果在数组里的位置隐含了。如果所有的苹果都显示了的话,就返
回-1。否则,随机返回一个还没被显示的苹果。
以后,就可以在public里写代码了。
TApple并不知道程序的窗体的大小,因此,就有了一个SetSize,用于传入窗体的大小,并可以用来设置FBuffer的大小:
procedure TApple.SetSize(Width,Height:Integer); begin
FBuffer.Width:=Width;
FBuffer.Height:=Height; end;
接着,程序必须向TApple传入两张图片文件,才能将结果正确地显示出来: procedure TApple.SetBack(FileName:String); begin
FBack.LoadFromFile(FileName); end;
procedure TApple.SetApple(FileName:String); begin
FApple.LoadFromFile(FileName); end;
接下来,写一个把FBuffer画到Form上面的代码: procedure TApple.PaintToForm(Form:TForm); begin
FBuffer.DrawToCanvas(Form.Canvas,0,0); end;
接着,写几段打开画面的代码。 1:Logo/结束画面: procedure TApple.ShowScore; begin
FRunning:=R_ShowScore; Draw;
end;
Draw例程以后再来。如果想显示Logo的话,就先把ShowScoreCaption设置为True,然后再调用ShowScore。
2:难度选择画面:
procedure TApple.ShowDifficulty; begin
FRunning:=R_Difficulty; Draw; end;
3:开始画面: procedure TApple.Reset; begin
FRunning:=R_Static; end;
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库游戏编程文章搜集资料(7)在线全文阅读。
相关推荐: