• 
    

    
    

      99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看 ?

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

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

      吳志輝

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

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

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

      中圖分類號:G642

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

      (7) 操作:

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

      玩家一: 玩家二:暫無

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

      4素材庫程序編寫

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

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

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

      5游戲地圖編輯程序編寫

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

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

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

      6游戲主程序編寫

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

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

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

      TSprite = class

      private

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

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

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

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

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

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

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

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

      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; //==碰撞檢測

      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方法必須在子類中實現(xiàn)==//

      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; //==獲取發(fā)生的碰撞次數(shù)

      procedure Dead; //==死亡登記

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

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

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

      end;

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

      TTank = class(TImageSprite) //==坦克基類,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) //===寶物對象===//

      TScrollBackground = class(TBackgroundSprite) //背景1

      TScrollBackground2 = class(TBackgroundSprite) //背景2

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

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

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

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

      private

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

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

      FCollisionDone: Boolean; //==碰撞檢測完畢標(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很簡單,主要提供了一個死亡管理。角色死亡后,把自己加入到TspriteEngine的死亡列表即可;游戲程序中,必須不斷調(diào)用TspriteEngine的Dead方法來釋放死亡角色占用的資源。

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

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

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

      參考文獻(xiàn):

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

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

      猜你喜歡
      編輯器敵方炮彈
      少林韋陀十八手
      少林與太極(2022年6期)2022-09-14 08:59:42
      4打5,敵方還剩幾個人?
      裝填炮彈
      你距離微信創(chuàng)作達(dá)人還有多遠(yuǎn)?
      “炮彈”表妹
      水果大作戰(zhàn)
      車輛段收發(fā)車運(yùn)行圖編輯器的設(shè)計與實現(xiàn)
      人工智能有助于處置敵方炸彈
      無人機(jī)(2017年10期)2017-07-06 03:04:40
      跑偏的炮彈
      騎炮彈飛行
      丰宁| 四平市| 宣化县| 嵩明县| 密云县| 河源市| 富阳市| 苏尼特左旗| 山阳县| 方正县| 南宫市| 长顺县| 台东县| 岳普湖县| 辉南县| 新营市| 甘泉县| 玉门市| 巴南区| 砀山县| 托克托县| 墨江| 通山县| 武义县| 冕宁县| 扎兰屯市| 云龙县| 郎溪县| 大竹县| 芦溪县| 石景山区| 遂昌县| 五大连池市| 景宁| 弥渡县| 大埔区| 阿拉尔市| 中西区| 三都| 开阳县| 清水县|