999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

游戲程序設計教學案例

2009-05-22 03:38:02吳志輝
計算機教育 2009年6期
關鍵詞:引擎游戲

吳志輝

文章編號:1672-5913(2009)06-0074-03

摘要:游戲編寫是游戲程序設計教程中很重要的內容。本文介紹了一個完整的2D游戲—坦克大戰的開發過程,對游戲素材編輯、地圖編輯和游戲主程序的設計做作了完整介紹和代碼實現,使學生能完全掌握并應用到實際其它游戲的開發過程中。

關鍵詞:計算機游戲;程序設計;地圖;游戲引擎

中圖分類號:G642

文獻標識碼:B

1游戲程序設計教程中的關鍵一環

計算機游戲程序設計,在許多的大學本科的教學中,并未正式納入教學內容。由于市場對游戲設計人員的需求較大,薪水又高,出現了專業的游戲程序設計培訓班。但收費偏高。我院根據這種狀況,在學生創新實驗室和第二課堂培訓班,開設了游戲程序設計項目。

其中最重要的一環就是完成一個完整的游戲開發設計。我們精心挑選項目,選擇了既有一定代表性、又有娛樂性、也帶有一些人工智能的中小游戲——坦克大戰。也使學生感受到了面向對象編程的強大功能,所學知識得到了真正的應用。

2相關知識學習

編寫游戲程序,技術上需要具備兩個條件。首先需要一個多媒體驅動開發包,如微軟的DirectX;圖像、動畫、聲音的快速、實時響應,是游戲逼真的前提條件。我們選擇了日本的Hiroyuki Hori編寫的免費開發包DelphiX,它較好的封裝了微軟的DirectX。里面有些錯誤,我們已經更正。其次,需要一個游戲引擎。游戲角色的碰撞是技術上較難的,對角色的生死管理也很重要。好的游戲引擎必須能快速高效的解決這些問題。DelphiX包中有一個簡單的游戲引擎,我們稍加改造,足夠我們編寫簡單的二維游戲程序。對這些知識加以介紹后,就可以進入正式的開發設計階段。

3坦克大戰游戲功能簡介

(1) 關卡地圖為三層地圖,比較形象,可設計多樣的地圖式樣。有專門的地圖編輯器MapEdit.exe。

(2) 游戲有低、中、高三級。難度隨時可調。

每關20輛基本敵方坦克。每過一關,敵方增加1(低)、2(中)或3(高)輛坦克。難度加大時,敵我雙方的坦克速度、炮彈威力、炮彈速度、坦克生命力都有所增加。

(3) 每關地圖有一個敵方Boss,它能爬山涉水,并自動朝我方推進,炮彈也朝我方射擊。

(4) 寶物有16種,持續時間約15秒。如沒有被敵我坦克揀到,自動爆炸消失:

散彈1:一次只能發一發炮彈;

散彈3:一次能發三發炮彈;

散彈5:一次能發射5顆炮彈;

增加子彈速度:一次加50;

減少子彈速度:一次減50;

增加炮彈威力:一次加50;

炮彈的半徑大小有8、16、24三種。炮彈半徑越大,越容易打中物體或坦克;

增加坦克生命力:一次加100;

坦克隱形寶物:坦克不可見,炮彈無法打中它;

坦克無敵模式:帶防護罩,炮彈打中不“掉血”;只有20秒保護期;

定時器:對方坦克不能動彈和發射;

爬山涉水:坦克能過河上山。該特性只在本關有效;

呼喚飛機幫助:揀寶方大批飛機出現,并且狂轟爛炸,對方難逃厄運;

腦黃金:只對敵方有效。被我方炮彈打中后,自動掉頭向我方移動并射擊。

每關的第十分鐘,大批敵方幫助飛機呼嘯而來,請你在此之前消滅敵人,否則大難臨頭。逃過此劫,堅持到第15分鐘,我方飛機呼嘯而來......

(5) 每過一關,我方生命力增加200。

(6) 關卡地圖文件名為Map???.map,最多999關。地圖文件名編號為001~999,中途不能斷號,否則,會從頭開始玩起。

(7) 操作:

F1:幫助;F11音樂;F12:炮聲;F3:暫停/繼續;鼠標右鍵:游戲難度選擇。

玩家一: 玩家二:暫無

空格:開炮, ←↑↓→移動方向

4素材庫程序編寫

在2D平面游戲中,地圖畫面由小塊圖片拼寫出來。游戲角色也一樣,動畫效果只不過是不斷改變圖形罷了。所以第一個任務就是要建立地圖素材庫。對每種地形設置它的圖片、生命力、是否阻礙坦克或炮彈通過等。圖1是圖庫編輯器TileEdit.exe的一個運行界面。

為方便管理,我們分類建立地形,如云層、土地、房屋、樹林等等。每類含有多個不同形狀的地藐對象TTiles;如“水域”類,可以包含“海洋”、“湖泊”等。而每個地藐可以由數量不等的小圖片組合而成。最小的小圖片單元就是TTile對象(以后簡稱貼圖)。這兩個對象我們用Object Pascal語言(Delphi)實現。 素材管理程序代碼2900多行(自編源代碼)。

圖庫(素材庫)編輯器是游戲程序開發的第一步,許多商業游戲并不提供圖庫編輯器。使玩家感到有所失望。提供圖庫編輯器無疑增加了游戲的吸引力,因為玩家可以重新設計整個游戲,也許坦克大戰變成了潛艇大戰。

5游戲地圖編輯程序編寫

一些商業游戲提供了地圖編輯器,如“星際爭霸”、“英雄無敵”等。圖2是教程中設計的三層地圖編輯器運行界面。

地圖設計是決定游戲可玩性的重要因素之一。當今2D游戲,普遍采用多層地圖,這樣可以產生比較逼真的畫面。游戲程序顯示畫面時,首先顯示最低層的圖層,再依次顯示高層畫面;這樣就有立體感了。

地圖由層(TLayer)組成,每層地圖又由許多基本的單元格(TCell)組成,單元格的圖像來源于素材庫。首先要完成這兩個基本對象的編寫。最后編寫地圖編輯程序,它實現地圖數據的載入、顯示、修改、保存等基本功能。總代碼約3400多行。

6游戲主程序編寫

準備工作一切就序!開始編寫游戲主程序。設計的思路是:先把游戲關卡對應地圖裝入畫面,再按游戲規則產生敵我雙方坦克。敵方坦克隨機移動和發射炮彈,除非它吃了“腦黃金”。我方坦克受玩家控制運動方向和發射炮彈。運動速度和發射炮彈的數量受游戲參數限制。當我方坦克全部死亡,游戲結束。敵方每隔一定時間產生新坦克,直到規定的坦克數量。敵方坦克全部被消滅后,游戲結束,進入下一關。

學生難以理解的是,這么許多的游戲角色(也稱“精靈”),程序如何管理它們,而這些精靈在不斷的產生、不斷地碰撞、不斷地消亡。所以,必須有一個統一的管理機制。必須建立一個最基本的“精靈”類TSprite。該對象是系統中的一個核心類。看它的定義:

TSpriteEngine = class; //==預先聲明“精靈引擎”類

TSprite = class

private

FEngine: TSpriteEngine; //==被“精靈引擎”管理

FParent: TSprite; //==用來判斷其父類(產生者:如坦克死 亡,對應子彈也消失)

FList: TList; //==角色列表(被精靈引擎管理:保存的 是地址!)

FDeaded: Boolean; //== 是否死亡

FDrawList: TList; //== 需要繪制的角色列表

FCollisioned: Boolean; //== 是否需要碰撞檢測

FMoved: Boolean; //== 能否移動

FVisible: Boolean; //== 是否可見

FX: Double; //== 平面坐標位置

FY: Double;

FZ: Integer; //==深度坐標,越小越在低層

FWidth: Integer; //==角色尺寸:寬和高

FHeight: Integer;

procedure Add(Sprite: TSprite); //==增加角色到列表FList中

procedure Remove(Sprite: TSprite); //==移走角色

procedure AddDrawList(Sprite: TSprite); //==增加角色到繪制角色列 表FDrawList中

procedure Collision2; //==碰撞檢測

procedure Draw; //==繪制角色

function GetClientRect: TRect; //==得到角色大小

function GetCount: Integer; //==角色列表中角色數量

function GetItem(Index: Integer): TSprite; //==用索引取得角色

function GetWorldX: Double; //==獲取角色在地圖世界中的位置

function GetWorldY: Double;

procedure SetZ(Value: Integer); //==設置角色在地圖層中的“深度”

protected

//==注意:所有virtual方法必須在子類中實現==//

procedure DoCollision(Sprite: TSprite; var Done: Boolean); virtual;

//==碰撞事件處理

procedure DoDraw; virtual; //==顯示事件處理

procedure DoMove(MoveCount: Integer); virtual;//==移動事件處理

functionGetBoundsRect: TRect; virtual;

functionTestCollision(Sprite: TSprite): Boolean; virtual;

//==碰撞測試

public//==公布方法

constructor Create(AParent: TSprite); virtual;

destructor Destroy; override;

procedure Clear; //== 釋放列表資源

function Collision: Integer; //==獲取發生的碰撞次數

procedure Dead; //==死亡登記

procedure Move(MoveCount: Integer); //==移動所有角色

function GetSpriteAt(X, Y: Integer): TSprite; //==取得某位置處的 角色

property Death:Boolean Read FDeaded;//== 我們自己新發布的數 據,方便編程判斷

end;

Tsprite實現了角色的移動和碰撞檢測,并指定被哪個引擎管理。游戲中所有的角色都是從TSprite類繼承下來的! 游戲中共有13個類,要一一實現,不要怕麻煩。它們是:

TTank = class(TImageSprite) //==坦克基類,TimageSprite繼承自Tsprite

TEnemyBoss = class(TTank) //===敵方BOSS==//

TEnemyTank = class(TTank) //===敵方坦克

TMyTank = class(TTank) //===我方坦克

THelpPlane = class(TTank)//===支援飛機==//

TExplosion = class(TImageSprite) //===爆炸==//

TExplosionBig = class(TImageSprite) //===大爆炸==//

TExplosionRed = class(TImageSprite) //===紅色爆炸==//

TGemSprite = class(TImageSprite) //===寶物對象===//

TScrollBackground = class(TBackgroundSprite) //背景1

TScrollBackground2 = class(TBackgroundSprite) //背景2

TTerrSprite = class(TImageSprite) //===地圖對象===//

TBullet = class(TImageSprite) //子彈基類

還有一個非常重要的對象就是精靈引擎TspriteEngine;看它的功能定義:

TSpriteEngine = class(TSprite) //==注意:從Tsprite繼承!

private

FAllCount: Integer; //==角色數量

FCollisionCount: Integer; //==碰撞次數

FCollisionDone: Boolean; //==碰撞檢測完畢標志

FCollisionRect: TRect; //==碰撞區域

FCollisionSprite: TSprite; //==碰撞角色

FDeadList: TList; //==死亡角色列表

FDrawCount: Integer; //==繪制角色列表

FSurface: TDirectDrawSurface; //==繪制表面

FSurfaceRect: TRect;

procedure SetSurface(Value: TDirectDrawSurface);

public

constructor Create(AParent: TSprite); override;

destructor Destroy; override;

procedure Dead;

procedure Draw;

property AllCount: Integer read FAllCount;

property DrawCount: Integer read FDrawCount;

property Surface: TDirectDrawSurface read FSurface write SetSurface;

property SurfaceRect: TRect read FSurfaceRect;

end;

TSpriteEngine很簡單,主要提供了一個死亡管理。角色死亡后,把自己加入到TspriteEngine的死亡列表即可;游戲程序中,必須不斷調用TspriteEngine的Dead方法來釋放死亡角色占用的資源。

Tsprite的子類根據游戲規則,都增加了一些功能。真正有意思的代碼在炮彈類Tbullet的碰撞處理代碼中。坦克得分、生命力變化都在代碼中處理。

準備就緒,剩下的任務就是編寫主控制程序了:根據當前關卡,裝入相應地圖(產生地圖精靈),并建立敵我雙方的坦克;由游戲定時器驅動游戲運行;由游戲“精靈引擎”驅動角色運動和死亡管理。整個主程序約5200多行。

整個系統除出部分公用代碼,大約有1萬多行自編源代碼,比較適合培訓設計。當學生弄清原理后,就完全可以隨心所欲的修改程序,感到非常滿足和自信。

參考文獻:

[1] 陳寬達. Delphi深度歷險[M]. 北京:科學出版社,2001.7.

[2] 耿衛東,陳為. 計算機游戲程序設計[M]. 北京:電子工業出版社,2005-3.

猜你喜歡
引擎游戲
藍谷: “涉藍”新引擎
商周刊(2017年22期)2017-11-09 05:08:31
數獨游戲
瘋狂的游戲
飛碟探索(2016年11期)2016-11-14 19:34:47
爆笑游戲
第八章直接逃出游戲
小學科學(2015年7期)2015-07-29 22:29:00
無形的引擎
河南電力(2015年5期)2015-06-08 06:01:46
基于Cocos2d引擎的PuzzleGame開發
One Engine Left只剩下一個引擎
主站蜘蛛池模板: 青草免费在线观看| 欧美日韩导航| 久久国产精品波多野结衣| 精品国产一区二区三区在线观看| 亚洲人成网站色7799在线播放| 日韩 欧美 国产 精品 综合| 99久久精品国产自免费| 日韩一区二区三免费高清 | 日韩中文无码av超清| 亚洲精品福利视频| 欧美成在线视频| 都市激情亚洲综合久久| 99视频免费观看| 亚洲三级影院| 日韩无码白| 乱码国产乱码精品精在线播放| AV片亚洲国产男人的天堂| 91精品小视频| 亚洲国产欧美自拍| 精品免费在线视频| 国产精品私拍99pans大尺度| 在线观看亚洲人成网站| 视频一区视频二区中文精品| 免费欧美一级| 全部免费特黄特色大片视频| 亚洲丝袜中文字幕| 国产91熟女高潮一区二区| 永久免费av网站可以直接看的 | 亚洲三级电影在线播放| 亚洲区欧美区| 国产成人亚洲综合A∨在线播放 | 精品中文字幕一区在线| 久久国产亚洲偷自| 99re视频在线| 88av在线看| 免费国产不卡午夜福在线观看| 日本www在线视频| 精品91在线| 国产亚洲日韩av在线| 一区二区三区在线不卡免费| 国内精品手机在线观看视频| 91青青在线视频| 成人国产小视频| 呦女亚洲一区精品| 免费啪啪网址| 久久99精品久久久久纯品| 国产网站免费观看| yy6080理论大片一级久久| 国产精品蜜芽在线观看| 亚洲AV无码乱码在线观看裸奔| 国产99免费视频| 日本精品一在线观看视频| 国产成+人+综合+亚洲欧美| 亚洲永久精品ww47国产| 高清不卡毛片| 97国产在线观看| 欧美第二区| 4虎影视国产在线观看精品| 国产成年女人特黄特色毛片免| 福利一区三区| 国产成人欧美| 99久久精彩视频| 丁香六月综合网| 久久久噜噜噜久久中文字幕色伊伊| 欧美在线精品怡红院| 久草视频一区| 一本大道无码高清| 国产成人超碰无码| 日韩AV无码免费一二三区| 丁香六月激情综合| 亚洲欧美日韩成人在线| 欧美特黄一级大黄录像| 国产精彩视频在线观看| 永久免费AⅤ无码网站在线观看| 国产精品护士| 又黄又湿又爽的视频| 青青久视频| 国产熟睡乱子伦视频网站| 久久亚洲精少妇毛片午夜无码 | 亚洲美女高潮久久久久久久| 亚洲国产日韩在线成人蜜芽| 久久亚洲国产最新网站|