




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、VAE范例:Apple 制作过程我的主页介绍VAE的文章终于写成几篇了,我便忍不住要开发一个完整的小游戏并写一篇文章来展示展示。所以,这个Apple就新鲜出炉了。关于Apple的代码请见。谢谢。事先声明一下:图片取自金山打字通2003的“拯救苹果”。如果金山公司觉得这侵犯了金山公司的利益的话,请告诉我,我会另换图片。开始制作了!上面五个文件都放在同一个文件夹里,然后再文件夹里建立一个新的工程叫Apple.exe,现在正式开工。当把vae的两个文件加入工程并且新建Display.pas后,Apple.dpr肯定会变成这样的:program Apple;uses Forms, untApple i
2、n 'untApple.pas' frmApple, Display in 'Display.pas', vaeBmex in 'vaeBmex.pas', vaeDataFile in 'vaeDataFile.pas'$R *.resbegin Application.Initialize; Application.CreateForm(TfrmApple, frmApple); Application.Run;end.如果不是这样的话,那就要赶快改一改了。接着,打开Display.pas,开始编写TApple的代码。先在in
3、terface后加入代码如下unit Display;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, vaeBmex;TApple的功能是控制Apple.exe的行为和显示方式。在新的游戏开始后,苹果们会掉下来,并且每个苹果上面印有一个字母。只有按下相应的字母键,该苹果才会消去。如果不行让10个苹果掉了下来,游戏就结束了。所以,玩Apple一定会以失败告终的。因此,Apple提供了一个最高分记录,所以,就当超过最高分为胜利吧。哈哈哈Apple.ex
4、e一共有五个版面。1:Logo2:开始画面3:游戏画面4:结束画面5:难度选择画面我偷懒了一下,把第1和第4合并了起来。因此,建立五个常数:const MaxLeft=10;/掉了10个苹果就输了。 R_Static=0;/开始画面 R_Running=1;/游戏画面 R_ShowScore=2;/Logo;结束画面 R_Difficulty=4;/难度选择画面然后,在implementation上面写一个空的TApple框架:type TApple=class(TObject) private protected published public end;我们需要3个TBmex,一个用来放置
5、背景图片,一个用来放置苹果图片,还有一个做为游戏画面的缓冲区。于是,我就在private里加入了三个变量:FBack:TBmex; FApple:TBmex; FBuffer:TBmex;。在游戏画面的上方有一段操作说明文字。这段文字是要程序来设定,而不是TApple来设定的,所以,我又加入了一个FCaption:String;并在public加入了property Caption:String read FCaption write FCaption;以便让程序可以修改这段说明文字。程序必须知道当前状态(与显示画面差不多),才能正确的控制TApple。所以,我又加入了FRunning:Int
6、eger;并在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 AppleBu
7、ilder:Integer read FAppleBuilder write FAppleBuilder;在游戏中,我们需要关于苹果的一些信息。有字母,位置,有没有显示这三个量,因此,我就果断地在TApple与type中间加入了:TAppleImp=record X,Y:Integer; Speed:Integer; Used:Boolean; end;并在private里写道:Apples:array65.90of TAppleImp;FAppleBuilder是时间间隔,所以,要有一个变量来记录时间,于是TimeAB:Integer;就光荣地诞生了。Apple.exe为了吸引人们去玩,于是
8、有了一个最高分的概念,所以,我挥一挥手,就不知道从哪里来了一个FHighestScore:Integer;。在结束画面的时候,如果最高分被打破的话,就要先是一句话,所以,我就顺手拿了一个FMadeHighest:Boolean;,并且在显示之后会自动变为False。当最高分被打破的时候,Apple就要在硬盘上记录分数。于是,TApple就要求程序在Create TApple时输入分数文件。于是,为了记录分数文件的文件名,FScoreFile:String;与property ShowScoreCaption:Boolean read FShowScoreCaption write FShowS
9、coreCaption;便呱呱落地了。我上面写道,我把Logo与结束画面合起来。为了区别,就有了一个变量FShowScoreCaption:Boolean;。为True时就是Logo。现在,大家所看到的代码必须是:unit Display;interfaceuses 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;t
10、ype 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; FM
11、adeHighest:Boolean; Apples:array65.90of 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 FAppleB
12、uilder write FAppleBuilder; property ShowScoreCaption:Boolean read FShowScoreCaption write FShowScoreCaption; end;implementationend.否则的话,赶快改!我依稀记得在写完这段声明之后,一大堆富有建设性的代码就跟着涌了出来。TApple的第一件事就是Create与Free。于是,我先机械地在published里写道:constructor Create(ScoreFile:String);procedure Free;当然,接着就是那些富有建设性的代码了。constru
13、ctor TApple.Create(ScoreFile:String);var SL:TStringList;/用来打开分数文件begin /建立TBmex FBack:=TBmex.Create; FApple:=TBmex.Create; FBuffer:=TBmex.Create; /接下来的这一行代码是没有意义的。我只是忘了删掉而已,顺便保持代码与文章的一致性。 FRunning:=R_Static; /设置一些东西 FShowScoreCaption:=False; FMadeHighest:=False; FScoreFile:=ScoreFile; /打开分数文件 SL:=TS
14、tringList.Create; SL.LoadFromFile(FScoreFile); FHighestScore:=StrToInt(SL0); 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
15、(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,FA
16、pple,X-FApple.Width div 2,Y-FApple.Height div 2); 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:In
17、teger;var I,C:Integer;begin C:=0; for I:=65 to 90 do if ApplesI.Used then C:=C+1; if C=26 then result:=-1 else begin repeat I:=Random(26)+65; until not ApplesI.Used; result:=I; end;end;苹果的字符信息被苹果在数组里的位置隐含了。如果所有的苹果都显示了的话,就返回-1。否则,随机返回一个还没被显示的苹果。以后,就可以在public里写代码了。TApple并不知道程序的窗体的大小,因此,就有了一个SetSize,用于
18、传入窗体的大小,并可以用来设置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
19、.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。
20、2:难度选择画面:procedure TApple.ShowDifficulty;begin FRunning:=R_Difficulty; Draw;end;3:开始画面:procedure TApple.Reset;begin FRunning:=R_Static;end;4:结束,回到开始画面:procedure TApple.StopGame;var I:Integer;begin for I:=65 to 90 do ApplesI.Used:=False; FRunning:=R_Static;end;先把所有的苹果都隐藏了之后再设置FRunning。5:游戏画面:procedur
21、e TApple.NewGame;var I:Integer;begin /初始化随机数发生器 Randomize; /隐藏所有苹果 for I:=65 to 90 do ApplesI.Used:=False; /当前时间设置为0 TimeAB:=0; /打开游戏画面 FRunning:=R_Running; /剩余总数设置为MaxLeft FLeft:=MaxLeft; /当前分数设置为0 FScore:=0;end;TApple的最后三段代码,就是富有建设性的代码的核心部分,来了!先写击键后消除苹果的代码:procedure TApple.HitKey(Key:Word);begin /
22、如果按键代表的苹果存在的话 if Appleskey.Used then begin /增加分数 FScore:=FScore+1; /隐藏被击中的苹果 ApplesKey.Used:=False; end;end;用位置代替字符的好处就在这里,在检测的时候不需要用循环。然后写游戏过程的代码。这个有点长:procedure TApple.Run;var NewApple:Integer; I:Integer; SL:TStringList;begin if TimeAB=0 then/如果当前时间是0的话,那么,就必须生产一个苹果。 begin /获得空闲的苹果 NewApple:=GetUn
23、usedApple; /如果返回的是 1,那么,代表所有的苹果都被显示了,不能生产苹果。 if NewApple>-1 then begin /接触苹果的隐藏 ApplesNewApple.Used:=True; /设定苹果的高度 ApplesNewApple.Y:=-FApple.Height div 2; /设定苹果的速度 ApplesNewApple.Speed:=Random(3)+1; /设定苹果的位置 ApplesNewApple.X:=Random(FBuffer.Width-FApple.Width)+FApple.Width div 2; end; end;
24、TimeAB:=TimeAB+1; /当前时间超过FAppleBuilder的话,就要重置为0,否则,将永远没有苹果产生。 if TimeAB=FAppleBuilder then TimeAB:=0; /移动苹果 for I:=65 to 90 do if ApplesI.Used then ApplesI.Y:=ApplesI.Y+ApplesI.Speed; /如果苹果掉地上了,就要扣FLeft了。 for I:=65 to 90 do if ApplesI.Used then if ApplesI.Y>=FBuffer.Height-FApple.Height div 2 the
25、n begin /隐藏苹果 ApplesI.Used:=False; FLeft:=FLeft-1; end; /如果FLeft被扣完了的话 if FLeft=0 then begin /打开结束画面 FRunning:=R_ShowScore; /如果分数打破了纪录 if FScore>FHighestScore then begin /显示相应的语句 FMadeHighest:=True; FHighestScore:=FScore; /更改分数文件的内容 SL:=TStringList.Create; SL.Text:=IntToStr(FScore); SL.SaveToFile
26、(FScoreFile); SL.Free; end; end; /刷新 Draw;end;最后,就是显示代码了:procedure TApple.Draw;var I:Integer; T:String;begin DrawBack; case FRunning of R_ShowScore:/显示一些字符串。 begin if FShowScoreCaption then begin T:='Welcome to the Apple!' T:='Vczh''s first cartoon-style game.' T:='Develo
27、per:Vczh' T:='Pictures from KingSoft' T:='Press any key to start.' end else begin T:='You are lost!Your score is '+IntToStr(FScore)+'.' if FMadeHighest then begin T:='You made the highest score!' FMadeHighest:=False; end; end; exit; end; R_Difficulty: begi
28、n DrawText(200,150,'1:Easy'); DrawText(200,170,'2:Normal'); DrawText(200,190,'3:Hard'); DrawText(200,210,'4:Impossible'); DrawText(200,230,'F3:Back'); end; else begin/游戏画面或者开始画面 /显示没有被隐藏的苹果 for I:=65 to 90 do if ApplesI.Used then DrawApple(ApplesI.X,ApplesI.Y,
29、Chr(I); /显示标题 DrawText(2,2,FCaption); /显示最高分 DrawText(2,22,'Higest Score:'+IntToStr(FHighestScore); /如果游戏正在进行的话 if FRunning=R_Running then begin /显示剩余量和分数 DrawText(2,42,'Left:'+IntToStr(FLeft); DrawText(2,62,'Score:'+IntToStr(FScore); end; end; end; end;TApple大功告成!不过,不要高兴得太早,
30、程序部分还没有写。程序部分倒是简单,只要响应键盘就行了。先来几个变量: Apple:TApple;/辛辛苦苦建立起来的TApple如果没有使用的话,那就是浪费了。 AppPath:String;/程序所在的位置,学了VB6的App.Path。OnCreate事件procedure TfrmApple.FormCreate(Sender: TObject);begin /获得程序的位置 AppPath:=ExtractFilePath(ParamStr(0); /新建TApple并设置 Apple:=TApple.Create(AppPath+'Score.txt'); Appl
31、e.SetSize(ClientWidth,ClientHeight); Apple.SetBack(AppPath+'Back.bmp'); Apple.SetApple(AppPath+'Apple.bmp'); Apple.Caption:='F2:New Game; F3:Stop; F4:Pause; Esc:Exit.' /使窗体居中 Left:=(Screen.Width-Width)div 2; Top:=(Screen.Height-Height)div 2; /用ShowScore显示Logo画面 Apple.ShowScor
32、eCaption:=True; Apple.ShowScore; Apple.Draw;end;OnDestory事件procedure TfrmApple.FormDestroy(Sender: TObject);begin Apple.Free;end;OnPaint事件procedure TfrmApple.FormPaint(Sender: TObject);begin Apple.PaintToForm(self);end;OnKeyUp事件procedure TfrmApple.FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);begin if Apple.Running=R_ShowScore then begin /如果显示Logo或分数的话,就回到开始画面 Apple.ShowScoreCaption:=False; Apple.StopGame; Apple.Draw; FormPaint(self); end else case key of VK_ESCAPE:Close;/ESC退出 49,50,51
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年教育信息化背景下教师信息技术与课程融合研究报告
- 新媒体环境下2025年新闻传播真实性与公信力新闻媒体社会责任履行策略研究报告
- 2025中联重科股份有限公司招聘280人笔试参考题库附带答案详解析
- 领导者的行为模式与团队表现的关系试题及答案
- S7-200 plc考试试题及答案
- 餐饮行业厨师长及团队聘用合同
- 2025金融服务租赁合同范本
- 特色美食餐厅转让及经营管理系统合同
- 实习与实践教学对培养应用型人才的促进作用
- 材料员岗位聘用与职业能力培养服务合同
- 2020年《科学通史》期末复习完整考试题库208题(含答案)
- MOOC 国情分析与商业设计-暨南大学 中国大学慕课答案
- 外科手术护士术前准备
- (完整版)保证药品信息来源合法、真实、安全的管理措施、情况说明及相关证明
- TBNCY002-2023 西双版纳红茶 晒红茶
- 2017-2022年近六年浙江高考英语普通高等学校招生全国统一考试(浙江卷)
- 护理健康教育的重要性
- 管理理论论文(5篇)
- 妊娠纹的预防与治疗
- 生物技术制药-基因工程病毒疫苗
- 表观遗传学与肿瘤课件
评论
0/150
提交评论