VAE范例Apple制作过程_第1页
VAE范例Apple制作过程_第2页
VAE范例Apple制作过程_第3页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、VAE 范例: Apple 制作过程我的主页 介绍 VAE 的文章终于写成几篇了,我便忍不住要开发一个完整的小游戏并写一篇文章来展示展示。所以,这个 Apple 就新鲜出炉了。关于Apple代码请见 。谢谢。事先声明一下:图片取自金山打字通2003 的“拯救苹果” 。如果金山公司觉得这侵犯了金山公司的利益的话,请告诉我,我会另换图片。的开始制作了!事先作一下准备。说是VAE 的范例,当然是先下载VAE ,然后把vaeDataFile.pas 和vaeBmex.pas 扔进去。在准备两张图片,一张是Back.bmp ,做背景;另一张是Apple.bmp ,当然是苹果啦。我依稀记得在几千年前开发A

2、pple 的时候,突然心血来潮,使用了Class 来编程。所以,大家一定要再建立一个Display.pas 来放 TApple 。哈哈哈上面五个文件都放在同一个文件夹里,然后再文件夹里建立一个新的工程叫Apple.exe ,现在正式开工。当把vae 的两个文件加入工程并且新建Display.pas 后, Apple.dpr 肯定会变成这样的:program Apple;usesForms,untApple in untApple.pas frmApple,Display in Display.pas,vaeBmex in vaeBmex.pas,vaeDataFile in vaeDataFi

3、le.pas;$R *.resbeginApplication.Initialize;Application.CreateForm(TfrmApple, frmApple);Application.Run;end.如果不是这样的话,那就要赶快改一改了。接着,打开Display.pas,开始编写TApple 的代码。先在 interface 后加入代码如下unit Display;interfaceusesWindows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, vaeBmex;TApp

4、le 的功能是控制Apple.exe 的行为和显示方式。在新的游戏开始后,苹果们会掉下来,并且每个苹果上面印有一个字母。只有按下相应的字母键,该苹果才会消去。如果不行让 10 个苹果掉了下来,游戏就结束了。所以,玩Apple 一定会以失败告终的。因此,Apple提供了一个最高分记录,所以,就当超过最高分为胜利吧。哈哈哈Apple.exe 一共有五个版面。1: Logo2:开始画面3:游戏画面4:结束画面5:难度选择画面我偷懒了一下,把第1 和第 4 合并了起来。因此,建立五个常数:constMaxLeft=10;/ 掉了 10 个苹果就输了。R_Static=0;/ 开始画面R_Running

5、=1;/ 游戏画面R_ShowScore=2;/Logo; 结束画面R_Difficulty=4;/难度选择画面然后,在implementation 上面写一个空的TApple 框架:typeTApple=class(TObject)privateprotectedpublishedpublicend;我们需要3 个 TBmex ,一个用来放置背景图片,一个用来放置苹果图片,还有一个做为游戏画面的缓冲区。 于是,我就在 private 里加入了三个变量: FBack:TBmex; FApple:TBmex;FBuffer:TBmex;。在游戏画面的上方有一段操作说明文字。这段文字是要程序来设定

6、,而不是TApple来设定的,所以,我又加入了一个FCaption:String; 并在 public 加入了 property Caption:String readFCaption write FCaption; 以便让程序可以修改这段说明文字。程序必须知道当前状态(与显示画面差不多),才能正确的控制TApple 。所以,我又加入了 FRunning:Integer; 并在 public 加入了 property Running:Integer read FRunning; 以便让程序知道当前状态,并且防止程序改变当前状态使得TApple 被破坏。游戏在运行的时候,除了苹果的位置以外,还依

7、赖于三个参数: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 中

8、间加入了:TAppleImp=recordX,Y:Integer;Speed:Integer;Used:Boolean;end;并在private 里写道: Apples:array65.90of TAppleImp;FAppleBuilder是时间间隔,所以,要有一个变量来记录时间,于是TimeAB:Integer;就光荣地诞生了。Apple.exe 为了吸引人们去玩,于是有了一个最高分的概念,所以,我挥一挥手,就不知道从哪里来了一个FHighestScore:Integer; 。在结束画面的时候,如果最高分被打破的话,就要先是一句话,所以,我就顺手拿了一个 FMadeHighest:Boo

9、lean; ,并且在显示之后会自动变为 False。当最高分被打破的时候, Apple 就要在硬盘上记录分数。于是, TApple 就要求 程 序 在Create TApple时 输 入 分 数 文 件 。 于 是 , 为 了 记 录 分 数 文 件 的 文 件 名 ,FScoreFile:String; 与 property ShowScoreCaption:Boolean read FShowScoreCaption write FShowScoreCaption; 便呱呱落地了。我 上 面 写 道 , 我 把 Logo 与 结 束 画 面 合 起 来 。 为 了 区 别 , 就 有 了

10、一 个 变 量 FShowScoreCaption:Boolean; 。为 True 时就是 Logo 。现在,大家所看到的代码必须是:unit Display;interfaceusesWindows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, vaeBmex;constMaxLeft=10;R_Static=0;R_Running=1;R_ShowScore=2;R_Difficulty=4;typeTAppleImp=recordX,Y:Integer;Speed:Integer;

11、Used:Boolean;end;TApple=class(TObject)privateFBack:TBmex;FApple:TBmex;FBuffer:TBmex;FCaption:String;FRunning:Integer;FLeft:Integer;FScore:Integer;FAppleBuilder:Integer;FShowScoreCaption:Boolean;FScoreFile:String;FHighestScore:Integer;FMadeHighest:Boolean;Apples:array65.90of TAppleImp;TimeAB:Integer;

12、protectedpublishedpublicproperty 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 FShowSco

13、reCaption write FShowScoreCaption; end;implementationend.否则的话,赶快改! !我依稀记得在写完这段声明之后,一大堆富有建设性的代码就跟着涌了出来。的第一件事就是Create 与 Free。于是,我先机械地在published 里写道:TAppleconstructor Create(ScoreFile:String);procedure Free;当然,接着就是那些富有建设性的代码了。constructor TApple.Create(ScoreFile:String);var SL:TStringList;/ 用来打开分数文件begi

14、n/建立 TBmexFBack:=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(FScoreFil

15、e);FHighestScore:=StrToInt(SL0);SL.Free;end;Free 的代码我就不介绍了。一定是那些东西。procedure TApple.Free;beginFBack.Free;FApple.Free;FBuffer.Free;inherited Free;/ 如果你不怕内存泄漏的话,这句代码你可以考虑删掉。end;接下来,在private 里写一些工具代码。1:把背景图复制到缓冲区。procedure TApple.DrawBack;beginFBuffer.Draw(FBack,0,0);end;2:打印字符串。字符串是白色的,外面还包围着一圈黑色。怎么办呢

16、?procedure TApple.DrawText(X,Y:Integer;Caption:String);var C,R:Integer;beginFBuffer.TextOut(X,Y ,Caption,clWhite,clBlack);end;有了 VAE 就是不一样。哈哈哈3:画苹果。现在不知要复制图片,还要画一个字母:procedure TApple.DrawApple(X,Y:Integer;C:Char);var W,H:Integer;beginDrawTrans(FBuffer,FApple,X-FApple.Width div 2,Y-FApple.Height div

17、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-Hdiv 2 )了。4:画透明图像。procedure TApple.Dr

18、awTrans(Dst,Src:TBmex;Left,Top:Integer);beginDst.DrawTrans(Src,0,0,Src.Width,Src.Height,Left,Top,0);end;DrawApple 就有用到这个。5:获得空闲的苹果。function TApple.GetUnusedApple:Integer;var I,C:Integer;beginC:=0;for I:=65 to 90 doif ApplesI.Used thenC:=C+1;if C=26 thenresult:=-1elsebeginrepeatI:=Random(26)+65;until

19、 not ApplesI.Used;result:=I;end;end;苹果的字符信息被苹果在数组里的位置隐含了。如果所有的苹果都显示了的话,就返回-1。否则,随机返回一个还没被显示的苹果。以后,就可以在 public 里写代码了。TApple 并不知道程序的窗体的大小, 因此,就有了一个 SetSize,用于传入窗体的大小,并可以用来设置 FBuffer 的大小:procedure TApple.SetSize(Width,Height:Integer);beginFBuffer.Width:=Width;FBuffer.Height:=Height;end;接着,程序必须向TApple 传

20、入两张图片文件,才能将结果正确地显示出来:procedure TApple.SetBack(FileName:String);beginFBack.LoadFromFile(FileName);end;procedure TApple.SetApple(FileName:String);beginFApple.LoadFromFile(FileName);end;接下来,写一个把FBuffer 画到 Form 上面的代码:procedure TApple.PaintToForm(Form:TForm);beginFBuffer.DrawToCanvas(Form.Canvas,0,0);end

21、;接着,写几段打开画面的代码。1: Logo/ 结束画面:procedure TApple.ShowScore;beginFRunning:=R_ShowScore;Draw;end;Draw 例程以后再来。如果想显示 Logo 的话,就先把 ShowScoreCaption 设置为 True,然后再调用 ShowScore。2:难度选择画面:procedure TApple.ShowDifficulty;beginFRunning:=R_Difficulty;Draw;end;3:开始画面:procedure TApple.Reset;beginFRunning:=R_Static;end;

22、4:结束,回到开始画面:procedure TApple.StopGame;var I:Integer;beginfor I:=65 to 90 doApplesI.Used:=False;FRunning:=R_Static;end;先把所有的苹果都隐藏了之后再设置FRunning 。5:游戏画面:procedure TApple.NewGame;var I:Integer;begin/初始化随机数发生器Randomize;/隐藏所有苹果for I:=65 to 90 doApplesI.Used:=False;/当前时间设置为0TimeAB:=0;/打开游戏画面FRunning:=R_Ru

23、nning;/剩余总数设置为MaxLeftFLeft:=MaxLeft;/当前分数设置为0FScore:=0;end;TApple 的最后三段代码,就是富有建设性的代码的核心部分,来了!先写击键后消除苹果的代码:procedure TApple.HitKey(Key:Word);begin/如果按键代表的苹果存在的话if Appleskey.Used thenbegin/增加分数FScore:=FScore+1;/隐藏被击中的苹果ApplesKey.Used:=False;end;end;用位置代替字符的好处就在这里,在检测的时候不需要用循环。然后写游戏过程的代码。这个有点长:procedur

24、e TApple.Run;var NewApple:Integer;I:Integer;SL:TStringList;beginif TimeAB=0 then/ 如果当前时间是0 的话,那么,就必须生产一个苹果。begin/获得空闲的苹果NewApple:=GetUnusedApple;/如果返回的是1,那么,代表所有的苹果都被显示了,不能生产苹果。if NewApple-1 thenbegin/接触苹果的隐藏ApplesNewApple.Used:=True;/设定苹果的高度ApplesNewApple.Y:=-FApple.Height div 2;/设定苹果的速度ApplesNewAp

25、ple.Speed:=Random(3)+1;/设定苹果的位置ApplesNewApple.X:=Random(FBuffer.Width-FApple.Width)+FApple.Width div 2;end;end;TimeAB:=TimeAB+1;/当前时间超过FAppleBuilder 的话,就要重置为0,否则,将永远没有苹果产生。if TimeAB=FAppleBuilder thenTimeAB:=0;/移动苹果for I:=65 to 90 doif ApplesI.Used thenApplesI.Y:=ApplesI.Y+ApplesI.Speed;/如果苹果掉地上了,就要

26、扣FLeft 了。for I:=65 to 90 doif ApplesI.Used thenif ApplesI.Y=FBuffer.Height-FApple.Height div 2 thenbegin/ 隐藏苹果ApplesI.Used:=False;FLeft:=FLeft-1;end;/如果 FLeft 被扣完了的话if FLeft=0 thenbegin/打开结束画面FRunning:=R_ShowScore;/如果分数打破了纪录if FScoreFHighestScore thenbegin/显示相应的语句FMadeHighest:=True;FHighestScore:=FS

27、core;/更改分数文件的内容SL:=TStringList.Create;SL.Text:=IntToStr(FScore);SL.SaveToFile(FScoreFile);SL.Free;end;end;/刷新Draw;end;最后,就是显示代码了:procedure TApple.Draw;var I:Integer;T:String;beginDrawBack;case FRunning ofR_ShowScore:/ 显示一些字符串。beginFBuffer.Canvas.Font.Size:=12;FBuffer.Canvas.Brush.Style:=bsClear;if F

28、ShowScoreCaption thenbeginT:=Welcome to the Apple!;DrawText(FBuffer.Width-FBuffer.Canvas.TextWidth(T)div 2,130,T);T:=Vczhs first cartoon-style game.;DrawText(FBuffer.Width-FBuffer.Canvas.TextWidth(T)div 2,150,T);T:=Developer:Vczh;DrawText(FBuffer.Width-FBuffer.Canvas.TextWidth(T)div 2,170,T);T:=Web

29、Site:;DrawText(FBuffer.Width-FBuffer.Canvas.TextWidth(T)div 2,190,T);T:=Pictures from KingSoft;DrawText(FBuffer.Width-FBuffer.Canvas.TextWidth(T)div 2,210,T);T:=Press any key to start.;DrawText(FBuffer.Width-FBuffer.Canvas.TextWidth(T)div 2,230,T);endelsebeginT:=You are lost!Your score is +IntToStr(

30、FScore)+.; DrawText(FBuffer.Width-FBuffer.Canvas.TextWidth(T)div 2,170,T); if FMadeHighest thenbeginT:=You made the highest score!;DrawText(FBuffer.Width-FBuffer.Canvas.TextWidth(T)div 2,190,T);FMadeHighest:=False;end;end;exit;end;R_Difficulty:beginDrawText(200,150,1:Easy);DrawText(200,170,2:Normal)

31、;DrawText(200,190,3:Hard);DrawText(200,210,4:Impossible);DrawText(200,230,F3:Back);end;elsebegin/游戏画面或者开始画面/显示没有被隐藏的苹果for I:=65 to 90 doif ApplesI.Used thenDrawApple(ApplesI.X,ApplesI.Y,Chr(I);FBuffer.Canvas.Font.Size:=12;FBuffer.Canvas.Brush.Style:=bsClear;/显示标题DrawText(2,2,FCaption);/显示最高分DrawText

32、(2,22,Higest Score:+IntToStr(FHighestScore);/如果游戏正在进行的话if FRunning=R_Running thenbegin/ 显示剩余量和分数DrawText(2,42,Left:+IntToStr(FLeft);DrawText(2,62,Score:+IntToStr(FScore);end;end;end;end;TApple大功告成!不过,不要高兴得太早,程序部分还没有写。程序部分倒是简单,只要响应键盘就行了。先来几个变量:Apple:TApple;/ 辛辛苦苦建立起来的TAppleAppPath:String;/ 程序所在的位置,学了

33、VB6如果没有使用的话,那就是浪费了。的 App.Path。OnCreate 事件procedure TfrmApple.FormCreate(Sender: TObject);begin/获得程序的位置AppPath:=ExtractFilePath(ParamStr(0);/新建 TApple 并设置Apple:=TApple.Create(AppPath+Score.txt);Apple.SetSize(ClientWidth,ClientHeight);Apple.SetBack(AppPath+Back.bmp);Apple.SetApple(AppPath+Apple.bmp);A

34、pple.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.ShowScoreCaption:=True;Apple.ShowScore;Apple.Draw;end;OnDestory 事件procedure TfrmApple.FormDestroy(Sender: TObject);beginApple.Free;end;OnPaint 事件procedure TfrmApple.FormPaint(Sender: TObject);beginApple.PaintToForm(self);end;OnKeyUp 事件procedure TfrmApple.FormKeyUp(Sender: TObject; var Key: Word;Shift: TShiftState);beginif Apple.Running=R_ShowScore thenbegin/如果显示L

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论