VAE范例Apple制作過程_第1頁
VAE范例Apple制作過程_第2頁
VAE范例Apple制作過程_第3頁
VAE范例Apple制作過程_第4頁
VAE范例Apple制作過程_第5頁
已閱讀5頁,還剩8頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、VAE范例:Apple 制作過程我的主頁介紹VAE的文章終于寫成幾篇了,我便忍不住要開發(fā)一個完整的小游戲并寫一篇文章來展示展示。所以,這個Apple就新鮮出爐了。關(guān)于Apple的代碼請見。謝謝。事先聲明一下:圖片取自金山打字通2003的“拯救蘋果”。如果金山公司覺得這侵犯了金山公司的利益的話,請告訴我,我會另換圖片。開始制作了!事先作一下準備。說是VAE的范例,當然是先下載VAE,然后把vaeDataFile.pas和vaeBmex.pas扔進去。在準備兩張圖片,一張是Back.bmp,做背景;另一張是Apple.bmp,當然是蘋果啦。我依稀記得在幾千年前開發(fā)Apple的時候,突然心血來潮,使

2、用了Class來編程。所以,大家一定要再建立一個Display.pas來放TApple。哈哈哈上面五個文件都放在同一個文件夾里,然后再文件夾里建立一個新的工程叫Apple.exe,現(xiàn)在正式開工。當把vae的兩個文件加入工程并且新建Display.pas后,Apple.dpr肯定會變成這樣的:program Apple;uses Forms, untApple in 'untApple.pas' frmApple, Display in 'Display.pas', vaeBmex in 'vaeBmex.pas', vaeDataFile in

3、'vaeDataFile.pas'$R *.resbegin Application.Initialize; Application.CreateForm(TfrmApple, frmApple); Application.Run;end.如果不是這樣的話,那就要趕快改一改了。接著,打開Display.pas,開始編寫TApple的代碼。先在interface后加入代碼如下unit Display;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Di

4、alogs, vaeBmex;TApple的功能是控制Apple.exe的行為和顯示方式。在新的游戲開始后,蘋果們會掉下來,并且每個蘋果上面印有一個字母。只有按下相應(yīng)的字母鍵,該蘋果才會消去。如果不行讓10個蘋果掉了下來,游戲就結(jié)束了。所以,玩Apple一定會以失敗告終的。因此,Apple提供了一個最高分記錄,所以,就當超過最高分為勝利吧。哈哈哈Apple.exe一共有五個版面。1:Logo2:開始畫面3:游戲畫面4:結(jié)束畫面5:難度選擇畫面我偷懶了一下,把第1和第4合并了起來。因此,建立五個常數(shù):const MaxLeft=10;/掉了10個蘋果就輸了。 R_Static=0;/開始畫面 R

5、_Running=1;/游戲畫面 R_ShowScore=2;/Logo;結(jié)束畫面 R_Difficulty=4;/難度選擇畫面然后,在implementation上面寫一個空的TApple框架:type TApple=class(TObject) private protected published public end;我們需要3個TBmex,一個用來放置背景圖片,一個用來放置蘋果圖片,還有一個做為游戲畫面的緩沖區(qū)。于是,我就在private里加入了三個變量:FBack:TBmex; FApple:TBmex; FBuffer:TBmex;。在游戲畫面的上方有一段操作說明文字。這段文字是

6、要程序來設(shè)定,而不是TApple來設(shè)定的,所以,我又加入了一個FCaption:String;并在public加入了property Caption:String read FCaption write FCaption;以便讓程序可以修改這段說明文字。程序必須知道當前狀態(tài)(與顯示畫面差不多),才能正確的控制TApple。所以,我又加入了FRunning:Integer;并在public加入了property Running:Integer read FRunning;以便讓程序知道當前狀態(tài),并且防止程序改變當前狀態(tài)使得TApple被破壞。游戲在運行的時候,除了蘋果的位置以外,還依賴于三個參數(shù)

7、:1:剩余量。來記錄在掉幾個蘋果游戲就結(jié)束了。2:當前分數(shù)。3:蘋果生產(chǎn)速度。因此,又有了:FLeft:Integer;FScore:Integer;FAppleBuilder:Integer;與property Left:Integer read FLeft;property Score:Integer read FScore;property AppleBuilder:Integer read FAppleBuilder write FAppleBuilder;在游戲中,我們需要關(guān)于蘋果的一些信息。有字母,位置,有沒有顯示這三個量,因此,我就果斷地在TApple與type中間加入了:TAp

8、pleImp=record X,Y:Integer; Speed:Integer; Used:Boolean; end;并在private里寫道:Apples:array65.90of TAppleImp;FAppleBuilder是時間間隔,所以,要有一個變量來記錄時間,于是TimeAB:Integer;就光榮地誕生了。Apple.exe為了吸引人們?nèi)ネ?,于是有了一個最高分的概念,所以,我揮一揮手,就不知道從哪里來了一個FHighestScore:Integer;。在結(jié)束畫面的時候,如果最高分被打破的話,就要先是一句話,所以,我就順手拿了一個FMadeHighest:Boolean;,并且在

9、顯示之后會自動變?yōu)镕alse。當最高分被打破的時候,Apple就要在硬盤上記錄分數(shù)。于是,TApple就要求程序在Create TApple時輸入分數(shù)文件。于是,為了記錄分數(shù)文件的文件名,F(xiàn)ScoreFile:String;與property ShowScoreCaption:Boolean read FShowScoreCaption write FShowScoreCaption;便呱呱落地了。我上面寫道,我把Logo與結(jié)束畫面合起來。為了區(qū)別,就有了一個變量FShowScoreCaption:Boolean;。為True時就是Logo?,F(xiàn)在,大家所看到的代碼必須是:unit Displa

10、y;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;type TAppleImp=record X,Y:Integer; Speed:Integer; Used:Boolean; end; TApple=class(TObject) private FBack:TBmex; FApple:

11、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; protected published public property Caption:String

12、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;impl

13、ementationend.否則的話,趕快改!我依稀記得在寫完這段聲明之后,一大堆富有建設(shè)性的代碼就跟著涌了出來。TApple的第一件事就是Create與Free。于是,我先機械地在published里寫道:constructor Create(ScoreFile:String);procedure Free;當然,接著就是那些富有建設(shè)性的代碼了。constructor TApple.Create(ScoreFile:String);var SL:TStringList;/用來打開分數(shù)文件begin /建立TBmex FBack:=TBmex.Create; FApple:=TBmex.Cre

14、ate; FBuffer:=TBmex.Create; FBuffer.Canvas.Font.Name:='Arial Black' /接下來的這一行代碼是沒有意義的。我只是忘了刪掉而已,順便保持代碼與文章的一致性。 FRunning:=R_Static; /設(shè)置一些東西 FShowScoreCaption:=False; FMadeHighest:=False; FScoreFile:=ScoreFile; /打開分數(shù)文件 SL:=TStringList.Create; SL.LoadFromFile(FScoreFile); FHighestScore:=StrToInt

15、(SL0); SL.Free;end;Free的代碼我就不介紹了。一定是那些東西。procedure TApple.Free;begin FBack.Free; FApple.Free; FBuffer.Free; inherited Free;/如果你不怕內(nèi)存泄漏的話,這句代碼你可以考慮刪掉。end;接下來,在private里寫一些工具代碼。1:把背景圖復(fù)制到緩沖區(qū)。procedure TApple.DrawBack;begin FBuffer.Draw(FBack,0,0);end;2:打印字符串。字符串是白色的,外面還包圍著一圈黑色。怎么辦呢?procedure TApple.DrawT

16、ext(X,Y:Integer;Caption:String);var C,R:Integer;begin FBuffer.TextOut(X,Y,Caption,clWhite,clBlack);end;有了VAE就是不一樣。哈哈哈3:畫蘋果?,F(xiàn)在不知要復(fù)制圖片,還要畫一個字母: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

17、.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:TBme

18、x;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 ApplesI.Used then C:=C+1; if C=26 then result:=-1 else begin repeat I:=Random(26)+65; until not Appl

19、esI.Used; result:=I; end;end;蘋果的字符信息被蘋果在數(shù)組里的位置隱含了。如果所有的蘋果都顯示了的話,就返回-1。否則,隨機返回一個還沒被顯示的蘋果。以后,就可以在public里寫代碼了。TApple并不知道程序的窗體的大小,因此,就有了一個SetSize,用于傳入窗體的大小,并可以用來設(shè)置FBuffer的大?。簆rocedure TApple.SetSize(Width,Height:Integer);begin FBuffer.Width:=Width; FBuffer.Height:=Height;end;接著,程序必須向TApple傳入兩張圖片文件,才能將結(jié)果

20、正確地顯示出來: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;接著,寫幾段打開畫面的代

21、碼。1:Logo/結(jié)束畫面:procedure TApple.ShowScore;begin FRunning:=R_ShowScore; Draw;end;Draw例程以后再來。如果想顯示Logo的話,就先把ShowScoreCaption設(shè)置為True,然后再調(diào)用ShowScore。2:難度選擇畫面:procedure TApple.ShowDifficulty;begin FRunning:=R_Difficulty; Draw;end;3:開始畫面:procedure TApple.Reset;begin FRunning:=R_Static;end;4:結(jié)束,回到開始畫面:proce

22、dure TApple.StopGame;var I:Integer;begin for I:=65 to 90 do ApplesI.Used:=False; FRunning:=R_Static;end;先把所有的蘋果都隱藏了之后再設(shè)置FRunning。5:游戲畫面:procedure TApple.NewGame;var I:Integer;begin /初始化隨機數(shù)發(fā)生器 Randomize; /隱藏所有蘋果 for I:=65 to 90 do ApplesI.Used:=False; /當前時間設(shè)置為0 TimeAB:=0; /打開游戲畫面 FRunning:=R_Running;

23、 /剩余總數(shù)設(shè)置為MaxLeft FLeft:=MaxLeft; /當前分數(shù)設(shè)置為0 FScore:=0;end;TApple的最后三段代碼,就是富有建設(shè)性的代碼的核心部分,來了!先寫擊鍵后消除蘋果的代碼:procedure TApple.HitKey(Key:Word);begin /如果按鍵代表的蘋果存在的話 if Appleskey.Used then begin /增加分數(shù) FScore:=FScore+1; /隱藏被擊中的蘋果 ApplesKey.Used:=False; end;end;用位置代替字符的好處就在這里,在檢測的時候不需要用循環(huán)。然后寫游戲過程的代碼。這個有點長:pro

24、cedure TApple.Run;var NewApple:Integer; I:Integer; SL:TStringList;begin if TimeAB=0 then/如果當前時間是0的話,那么,就必須生產(chǎn)一個蘋果。 begin /獲得空閑的蘋果 NewApple:=GetUnusedApple; /如果返回的是 1,那么,代表所有的蘋果都被顯示了,不能生產(chǎn)蘋果。 if NewApple>-1 then begin /接觸蘋果的隱藏 ApplesNewApple.Used:=True; /設(shè)定蘋果的高度 ApplesNewApple.Y:=-FApple.Height

25、 div 2; /設(shè)定蘋果的速度 ApplesNewApple.Speed:=Random(3)+1; /設(shè)定蘋果的位置 ApplesNewApple.X:=Random(FBuffer.Width-FApple.Width)+FApple.Width div 2; end; end; TimeAB:=TimeAB+1; /當前時間超過FAppleBuilder的話,就要重置為0,否則,將永遠沒有蘋果產(chǎn)生。 if TimeAB=FAppleBuilder then TimeAB:=0; /移動蘋果 for I:=65 to 90 do if ApplesI.Used then ApplesI.

26、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 then begin /隱藏蘋果 ApplesI.Used:=False; FLeft:=FLeft-1; end; /如果FLeft被扣完了的話 if FLeft=0 then begin /打開結(jié)束畫面 FRunning:=R_ShowScore; /如果分數(shù)打破了紀錄 if FScore>FHighest

27、Score then begin /顯示相應(yīng)的語句 FMadeHighest:=True; FHighestScore:=FScore; /更改分數(shù)文件的內(nèi)容 SL:=TStringList.Create; SL.Text:=IntToStr(FScore); SL.SaveToFile(FScoreFile); SL.Free; end; end; /刷新 Draw;end;最后,就是顯示代碼了:procedure TApple.Draw;var I:Integer; T:String;begin DrawBack; case FRunning of R_ShowScore:/顯示一些字符串

28、。 begin FBuffer.Canvas.Font.Size:=12; FBuffer.Canvas.Brush.Style:=bsClear; if FShowScoreCaption then begin T:='Welcome to the Apple!' DrawText(FBuffer.Width-FBuffer.Canvas.TextWidth(T)div 2,130,T); T:='Vczh''s first cartoon-style game.' DrawText(FBuffer.Width-FBuffer.Canvas.T

29、extWidth(T)div 2,150,T); T:='Developer:Vczh' DrawText(FBuffer.Width-FBuffer.Canvas.TextWidth(T)div 2,170,T); T:='Web 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,

30、T); T:='Press any key to start.' DrawText(FBuffer.Width-FBuffer.Canvas.TextWidth(T)div 2,230,T); end else begin T:='You are lost!Your score is '+IntToStr(FScore)+'.' DrawText(FBuffer.Width-FBuffer.Canvas.TextWidth(T)div 2,170,T); if FMadeHighest then begin T:='You made th

31、e highest score!' DrawText(FBuffer.Width-FBuffer.Canvas.TextWidth(T)div 2,190,T); FMadeHighest:=False; end; end; exit; end; R_Difficulty: begin DrawText(200,150,'1:Easy'); DrawText(200,170,'2:Normal'); DrawText(200,190,'3:Hard'); DrawText(200,210,'4:Impossible');

32、DrawText(200,230,'F3:Back'); end; else begin/游戲畫面或者開始畫面 /顯示沒有被隱藏的蘋果 for I:=65 to 90 do if ApplesI.Used then DrawApple(ApplesI.X,ApplesI.Y,Chr(I); FBuffer.Canvas.Font.Size:=12; FBuffer.Canvas.Brush.Style:=bsClear; /顯示標題 DrawText(2,2,FCaption); /顯示最高分 DrawText(2,22,'Higest Score:'+IntT

33、oStr(FHighestScore); /如果游戲正在進行的話 if FRunning=R_Running then begin /顯示剩余量和分數(shù) DrawText(2,42,'Left:'+IntToStr(FLeft); DrawText(2,62,'Score:'+IntToStr(FScore); end; end; end; end;TApple大功告成!不過,不要高興得太早,程序部分還沒有寫。程序部分倒是簡單,只要響應(yīng)鍵盤就行了。先來幾個變量: Apple:TApple;/辛辛苦苦建立起來的TApple如果沒有使用的話,那就是浪費了。 AppPa

34、th:String;/程序所在的位置,學(xué)了VB6的App.Path。OnCreate事件procedure TfrmApple.FormCreate(Sender: TObject);begin /獲得程序的位置 AppPath:=ExtractFilePath(ParamStr(0); /新建TApple并設(shè)置 Apple:=TApple.Create(AppPath+'Score.txt'); Apple.SetSize(ClientWidth,ClientHeight); Apple.SetBack(AppPath+'Back.bmp'); Apple.S

35、etApple(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.ShowScoreCaption:=True; Apple.ShowScore; Apple.Draw;end;OnDestory事件procedure TfrmApple.FormDest

36、roy(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或分數(shù)的話,就回到開始畫面 Apple.ShowScoreCa

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論