版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025出租車司機用工合同范本
- 2025商鋪租賃合同簡單的范本
- 全新清算協(xié)議合同-二零二五年度清算與債務(wù)重組3篇
- 2025年度全新合同:人工智能輔助駕駛系統(tǒng)研發(fā)與推廣協(xié)議3篇
- 2025年度環(huán)保設(shè)備安裝與環(huán)保技術(shù)咨詢合同3篇
- 2025年度農(nóng)村房屋改造裝修與農(nóng)村光伏發(fā)電項目合同
- 二零二五年度出國工人勞務(wù)輸出與職業(yè)規(guī)劃合同
- 二零二五年度智能漁業(yè)養(yǎng)魚設(shè)備共享合作協(xié)議3篇
- 2025年度農(nóng)業(yè)科技賒銷合作協(xié)議3篇
- 2025年度水上安全事故處理與救援合作協(xié)議3篇
- 2022浙江卷高考真題讀后續(xù)寫+課件 【知識精講+高效課堂】高三英語寫作專項
- 祭文:侄子侄女祭叔父文
- 一年級科學(xué)上冊教學(xué)工作總結(jié)
- 暨南大學(xué)《馬克思主義基本原理概論》題庫歷年期末考試真題分類匯編及答案
- 有色金屬工業(yè)安裝工程質(zhì)量檢驗評定標準
- 物理學(xué)的起源和發(fā)展課件
- 南京大學(xué)《宏觀經(jīng)濟學(xué)》習(xí)題庫及答案
- (中職)《電子商務(wù)基礎(chǔ)》第1套試卷試題及答案
- 汽車三維建模虛擬仿真實驗
- 無人機智慧旅游解決方案
- 行車起重作業(yè)風(fēng)險分析及管控措施
評論
0/150
提交評論