亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        游戲程序設(shè)計(jì)教學(xué)案例

        2009-05-22 03:38:02吳志輝
        計(jì)算機(jī)教育 2009年6期
        關(guān)鍵詞:編輯器敵方炮彈

        吳志輝

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

        摘要:游戲編寫(xiě)是游戲程序設(shè)計(jì)教程中很重要的內(nèi)容。本文介紹了一個(gè)完整的2D游戲—坦克大戰(zhàn)的開(kāi)發(fā)過(guò)程,對(duì)游戲素材編輯、地圖編輯和游戲主程序的設(shè)計(jì)做作了完整介紹和代碼實(shí)現(xiàn),使學(xué)生能完全掌握并應(yīng)用到實(shí)際其它游戲的開(kāi)發(fā)過(guò)程中。

        關(guān)鍵詞:計(jì)算機(jī)游戲;程序設(shè)計(jì);地圖;游戲引擎

        中圖分類(lèi)號(hào):G642

        文獻(xiàn)標(biāo)識(shí)碼:B

        1游戲程序設(shè)計(jì)教程中的關(guān)鍵一環(huán)

        計(jì)算機(jī)游戲程序設(shè)計(jì),在許多的大學(xué)本科的教學(xué)中,并未正式納入教學(xué)內(nèi)容。由于市場(chǎng)對(duì)游戲設(shè)計(jì)人員的需求較大,薪水又高,出現(xiàn)了專(zhuān)業(yè)的游戲程序設(shè)計(jì)培訓(xùn)班。但收費(fèi)偏高。我院根據(jù)這種狀況,在學(xué)生創(chuàng)新實(shí)驗(yàn)室和第二課堂培訓(xùn)班,開(kāi)設(shè)了游戲程序設(shè)計(jì)項(xiàng)目。

        其中最重要的一環(huán)就是完成一個(gè)完整的游戲開(kāi)發(fā)設(shè)計(jì)。我們精心挑選項(xiàng)目,選擇了既有一定代表性、又有娛樂(lè)性、也帶有一些人工智能的中小游戲——坦克大戰(zhàn)。也使學(xué)生感受到了面向?qū)ο缶幊痰膹?qiáng)大功能,所學(xué)知識(shí)得到了真正的應(yīng)用。

        2相關(guān)知識(shí)學(xué)習(xí)

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

        3坦克大戰(zhàn)游戲功能簡(jiǎn)介

        (1) 關(guān)卡地圖為三層地圖,比較形象,可設(shè)計(jì)多樣的地圖式樣。有專(zhuān)門(mén)的地圖編輯器MapEdit.exe。

        (2) 游戲有低、中、高三級(jí)。難度隨時(shí)可調(diào)。

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

        (3) 每關(guān)地圖有一個(gè)敵方Boss,它能爬山涉水,并自動(dòng)朝我方推進(jìn),炮彈也朝我方射擊。

        (4) 寶物有16種,持續(xù)時(shí)間約15秒。如沒(méi)有被敵我坦克揀到,自動(dòng)爆炸消失:

        散彈1:一次只能發(fā)一發(fā)炮彈;

        散彈3:一次能發(fā)三發(fā)炮彈;

        散彈5:一次能發(fā)射5顆炮彈;

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

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

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

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

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

        坦克隱形寶物:坦克不可見(jiàn),炮彈無(wú)法打中它;

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

        定時(shí)器:對(duì)方坦克不能動(dòng)彈和發(fā)射;

        爬山涉水:坦克能過(guò)河上山。該特性只在本關(guān)有效;

        呼喚飛機(jī)幫助:揀寶方大批飛機(jī)出現(xiàn),并且狂轟爛炸,對(duì)方難逃厄運(yùn);

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

        每關(guān)的第十分鐘,大批敵方幫助飛機(jī)呼嘯而來(lái),請(qǐng)你在此之前消滅敵人,否則大難臨頭。逃過(guò)此劫,堅(jiān)持到第15分鐘,我方飛機(jī)呼嘯而來(lái)......

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

        (6) 關(guān)卡地圖文件名為Map???.map,最多999關(guān)。地圖文件名編號(hào)為001~999,中途不能斷號(hào),否則,會(huì)從頭開(kāi)始玩起。

        (7) 操作:

        F1:幫助;F11音樂(lè);F12:炮聲;F3:暫停/繼續(xù);鼠標(biāo)右鍵:游戲難度選擇。

        玩家一: 玩家二:暫無(wú)

        空格:開(kāi)炮, ←↑↓→移動(dòng)方向

        4素材庫(kù)程序編寫(xiě)

        在2D平面游戲中,地圖畫(huà)面由小塊圖片拼寫(xiě)出來(lái)。游戲角色也一樣,動(dòng)畫(huà)效果只不過(guò)是不斷改變圖形罷了。所以第一個(gè)任務(wù)就是要建立地圖素材庫(kù)。對(duì)每種地形設(shè)置它的圖片、生命力、是否阻礙坦克或炮彈通過(guò)等。圖1是圖庫(kù)編輯器TileEdit.exe的一個(gè)運(yùn)行界面。

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

        圖庫(kù)(素材庫(kù))編輯器是游戲程序開(kāi)發(fā)的第一步,許多商業(yè)游戲并不提供圖庫(kù)編輯器。使玩家感到有所失望。提供圖庫(kù)編輯器無(wú)疑增加了游戲的吸引力,因?yàn)橥婕铱梢灾匦略O(shè)計(jì)整個(gè)游戲,也許坦克大戰(zhàn)變成了潛艇大戰(zhàn)。

        5游戲地圖編輯程序編寫(xiě)

        一些商業(yè)游戲提供了地圖編輯器,如“星際爭(zhēng)霸”、“英雄無(wú)敵”等。圖2是教程中設(shè)計(jì)的三層地圖編輯器運(yùn)行界面。

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

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

        6游戲主程序編寫(xiě)

        準(zhǔn)備工作一切就序!開(kāi)始編寫(xiě)游戲主程序。設(shè)計(jì)的思路是:先把游戲關(guān)卡對(duì)應(yīng)地圖裝入畫(huà)面,再按游戲規(guī)則產(chǎn)生敵我雙方坦克。敵方坦克隨機(jī)移動(dòng)和發(fā)射炮彈,除非它吃了“腦黃金”。我方坦克受玩家控制運(yùn)動(dòng)方向和發(fā)射炮彈。運(yùn)動(dòng)速度和發(fā)射炮彈的數(shù)量受游戲參數(shù)限制。當(dāng)我方坦克全部死亡,游戲結(jié)束。敵方每隔一定時(shí)間產(chǎn)生新坦克,直到規(guī)定的坦克數(shù)量。敵方坦克全部被消滅后,游戲結(jié)束,進(jìn)入下一關(guān)。

        學(xué)生難以理解的是,這么許多的游戲角色(也稱(chēng)“精靈”),程序如何管理它們,而這些精靈在不斷的產(chǎn)生、不斷地碰撞、不斷地消亡。所以,必須有一個(gè)統(tǒng)一的管理機(jī)制。必須建立一個(gè)最基本的“精靈”類(lèi)TSprite。該對(duì)象是系統(tǒng)中的一個(gè)核心類(lèi)??此亩x:

        TSpriteEngine = class; //==預(yù)先聲明“精靈引擎”類(lèi)

        TSprite = class

        private

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

        FParent: TSprite; //==用來(lái)判斷其父類(lèi)(產(chǎn)生者:如坦克死 亡,對(duì)應(yīng)子彈也消失)

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

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

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

        FCollisioned: Boolean; //== 是否需要碰撞檢測(cè)

        FMoved: Boolean; //== 能否移動(dòng)

        FVisible: Boolean; //== 是否可見(jiàn)

        FX: Double; //== 平面坐標(biāo)位置

        FY: Double;

        FZ: Integer; //==深度坐標(biāo),越小越在低層

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

        FHeight: Integer;

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

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

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

        procedure Collision2; //==碰撞檢測(cè)

        procedure Draw; //==繪制角色

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

        function GetCount: Integer; //==角色列表中角色數(shù)量

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

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

        function GetWorldY: Double;

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

        protected

        //==注意:所有virtual方法必須在子類(lèi)中實(shí)現(xiàn)==//

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

        //==碰撞事件處理

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

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

        functionGetBoundsRect: TRect; virtual;

        functionTestCollision(Sprite: TSprite): Boolean; virtual;

        //==碰撞測(cè)試

        public//==公布方法

        constructor Create(AParent: TSprite); virtual;

        destructor Destroy; override;

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

        function Collision: Integer; //==獲取發(fā)生的碰撞次數(shù)

        procedure Dead; //==死亡登記

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

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

        property Death:Boolean Read FDeaded;//== 我們自己新發(fā)布的數(shù) 據(jù),方便編程判斷

        end;

        Tsprite實(shí)現(xiàn)了角色的移動(dòng)和碰撞檢測(cè),并指定被哪個(gè)引擎管理。游戲中所有的角色都是從TSprite類(lèi)繼承下來(lái)的! 游戲中共有13個(gè)類(lèi),要一一實(shí)現(xiàn),不要怕麻煩。它們是:

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

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

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

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

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

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

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

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

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

        TScrollBackground = class(TBackgroundSprite) //背景1

        TScrollBackground2 = class(TBackgroundSprite) //背景2

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

        TBullet = class(TImageSprite) //子彈基類(lèi)

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

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

        private

        FAllCount: Integer; //==角色數(shù)量

        FCollisionCount: Integer; //==碰撞次數(shù)

        FCollisionDone: Boolean; //==碰撞檢測(cè)完畢標(biāo)志

        FCollisionRect: TRect; //==碰撞區(qū)域

        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很簡(jiǎn)單,主要提供了一個(gè)死亡管理。角色死亡后,把自己加入到TspriteEngine的死亡列表即可;游戲程序中,必須不斷調(diào)用TspriteEngine的Dead方法來(lái)釋放死亡角色占用的資源。

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

        準(zhǔn)備就緒,剩下的任務(wù)就是編寫(xiě)主控制程序了:根據(jù)當(dāng)前關(guān)卡,裝入相應(yīng)地圖(產(chǎn)生地圖精靈),并建立敵我雙方的坦克;由游戲定時(shí)器驅(qū)動(dòng)游戲運(yùn)行;由游戲“精靈引擎”驅(qū)動(dòng)角色運(yùn)動(dòng)和死亡管理。整個(gè)主程序約5200多行。

        整個(gè)系統(tǒng)除出部分公用代碼,大約有1萬(wàn)多行自編源代碼,比較適合培訓(xùn)設(shè)計(jì)。當(dāng)學(xué)生弄清原理后,就完全可以隨心所欲的修改程序,感到非常滿(mǎn)足和自信。

        參考文獻(xiàn):

        [1] 陳寬達(dá). Delphi深度歷險(xiǎn)[M]. 北京:科學(xué)出版社,2001.7.

        [2] 耿衛(wèi)東,陳為. 計(jì)算機(jī)游戲程序設(shè)計(jì)[M]. 北京:電子工業(yè)出版社,2005-3.

        猜你喜歡
        編輯器敵方炮彈
        少林韋陀十八手
        少林與太極(2022年6期)2022-09-14 08:59:42
        4打5,敵方還剩幾個(gè)人?
        裝填炮彈
        你距離微信創(chuàng)作達(dá)人還有多遠(yuǎn)?
        “炮彈”表妹
        水果大作戰(zhàn)
        車(chē)輛段收發(fā)車(chē)運(yùn)行圖編輯器的設(shè)計(jì)與實(shí)現(xiàn)
        人工智能有助于處置敵方炸彈
        跑偏的炮彈
        騎炮彈飛行
        亚洲色大成网站www永久网站| 国产99久久精品一区| 日韩精品综合在线视频| 一区二区三区蜜桃av| 日本边添边摸边做边爱喷水| 男人激烈吮乳吃奶视频免费| 国产精品乱一区二区三区| 国产一区二区三区视频大全| 中文字幕乱码人妻在线| 妺妺窝人体色www在线| 欧美性受xxxx狂喷水| av无码精品一区二区三区四区| 国产AV无码专区亚洲AWWW| 亚洲天堂av路线一免费观看| 丰满少妇人妻久久精品| 国产欧美日韩一区二区三区| 久久婷婷国产剧情内射白浆| 亚洲无码中文字幕日韩无码| 视频一区二区三区国产| 老鲁夜夜老鲁| 亚洲av无码久久精品蜜桃| 日韩永久免费无码AV电影| 精品人妻一区二区久久| 亚洲av毛片在线免费看| 潮喷大喷水系列无码久久精品| 婷婷丁香五月中文字幕| 日韩人妻无码中文字幕一区| 丝袜美腿在线播放一区二区| 国产av无码专区亚洲av男同| 激情第一区仑乱| 久久国产精99精产国高潮| 在线播放偷拍一区二区| 蜜桃尤物在线视频免费看| 午夜福利一区二区三区在线观看| 国产精品亚洲五月天高清| 97中文字幕一区二区| 国产亚洲精品av一区| 中文字幕无码毛片免费看| 人妻在线中文字幕| 亚洲在线一区二区三区| 校园春色人妻激情高清中文字幕|