熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

詳述RPG游戲引擎的設計原理

2013-11-23 19:13:16  來源: Java核心技術 
    角色扮演游戲(RPG)是深受廣大游戲迷們喜愛的一種游戲 它以獨特的互動性和故事性吸引了無數的玩家它向人們提供了超出現實生活的廣闊的虛擬世界使人們能夠嘗試扮演不同的角色去經歷和體驗各種不同的人生旅程或奇幻經歷這些體驗都是在現實生活中無法實現的在玩過許多游戲後許多玩家都不再僅僅滿足於一個游戲玩家的身份而會思考游戲是如何制作的並且打算制作一個自己的游戲網上的各種游戲制作小組更是如雨後春筍般湧現下面我就給大家介紹一下角色扮演游戲引擎的原理與制作希望能對游戲制作愛好者有所幫助

  一 游戲引擎的原理

  說到引擎游戲迷們都很熟悉游戲引擎是一個為運行某一類游戲的機器設計的能夠被機器識別的代碼(指令)集合它象一個發動機控制著游戲的運行一個游戲作品可以分為游戲引擎和游戲資源兩大部分游戲資源包括圖象聲音動畫等部分列一個公式就是游戲=引擎(程序代碼)+資源(圖象聲音動畫等)游戲引擎則是按游戲設計的要求順序的調用這些資源

  二 角色扮演游戲的制作

  一個完整的角色扮演游戲的制作從大的分工來說可以分為策劃程序設計美工音樂制作以及項目管理後期的測試等

  策劃主要任務是設計游戲的劇情類型以及模式等並分析游戲的復雜性有多大內容有多少策劃的進度要多快等因素

  程序設計的任務是用某種編程語言來完成游戲的設計並與策劃配合達到預期的目的

  美工主要是根據游戲的時代背景與主題設計游戲的場景及各種角色的圖象

  音樂制作是根據游戲的劇情和背景制作游戲的音樂與音效

  項目管理主要是控制游戲制作的進程充分利用現有的資源(人員資金設備等)以達到用盡量少的資金實現最大的收益

  後期的測試也是非常重要的一個環節對於一個幾十人花費幾個月甚至是幾年時間制作的游戲測試往往能找到許多問題只有改進程序才能確保游戲的安全發行

  由於文章主要是講解游戲程序的制作的所以策劃美工音樂制作等方面請讀者參考其它文章下面我就講講游戲程序的設計

  (一) 開發工具與主要技術

  .件開發工具

  游戲程序開發工具有很多在不同游戲平台上有不同的開發工具在個人計算機上可以用目前流性的軟件開發工具比如CC++VC++DelphiC++ Builder等由於Windows操作系統的普及和其強大的多媒體功能越來越多的游戲支持Windows操作系統由於VC是微軟的產品用它來編寫Windows程序有強大的程序接口和豐富的開發資源的支持加之VC嚴謹的內存管理在堆棧上良好的分配處理生成代碼的體積小穩定性高的優點所以VC++就成為目前游戲的主流開發工具

  .DirectX組件的知識

  談到Windows系統下的游戲開發我們就要說一下微軟的DirectX SDK

  Windows系統有一個主要優點是應用程序和設備之間的獨立性然而應用程序的設備無關性是通過犧牲部分速度和效率的到的Windows在硬件和軟件間添加了中間抽象層通過這些中間層我們的應用程序才能在不同的硬件上游刃有余但是我們因此而不能完全利用硬件的特征來獲取最大限度的運算和顯示速度這一點在編寫Windows游戲時是致命的DirectX便是為解決這個問題而設計的DirectX由快速的底層庫組成並且沒有給游戲設計添加過多的約束微軟的DirectX軟件開發工具包(SDK)提供了一套優秀的應用程序編程接口(APIs)這個編程接口可以提供給你開發高質量實時的應用程序所需要的各種資源

  DirectX的個組件分別是

  DirectDraw 使用頁面切換的方法實現動畫它不僅可以訪問系統內存還可以訪問顯示內存

  DirectD 提供了D硬件接口

  DirectSound 立體聲和D聲音效果同時管理聲卡的內存

  DirectPlay 支持開發多人網絡游戲並能處理游戲中網絡之間的通信問題

  DirectInput 為大量的設備提供輸入支持

  DirectSetup 自動安裝DirectX驅動程序

  隨著DirectX版本的提高還增加了音樂播放的DirectMusic

  .AlphaBlend 技術

  現在許多游戲為了達到光影或圖象的透明效果都會采用AlphaBlend 技術所謂AlphaBlend技術其實就是按照Alpha混合向量的值來混合源像素和目標像素一般用來處理半透明效果在計算機中的圖象可以用R(紅色)G(綠色)B(藍色)三原色來表示假設一幅圖象是A另一幅透明的圖象是B那麼透過B去看A看上去的圖象C就是B和A的混合圖象設B圖象的透明度為alpha(取值為為完全透明為完全不透明)Alpha混合公式如下

  R(C)=alpha*R(B)+(alpha)*R(A)

  G(C)=alpha*G(B)+(alpha)*G(A)

  B(C)=alpha*B(B)+(alpha)*B(A)

  R(x)G(x)B(x)分別指顏色x的RGB分量原色值從上面的公式可以知道Alpha其實是一個決定混合透明度的數值應用Alpha混合技術可以實現游戲中的許多特效比如火光煙霧陰影動態光源等半透明效果

  .A*算法

  在許多游戲中要用鼠標控制人物運動而且讓人物從目前的位置走到目標位置應該走最短的路徑這就要用到最短路徑搜索算法即A*算法了

  A*算法實際是一種啟發式搜索所謂啟發式搜索就是利用一個估價函數評估每次的的決策的價值決定先嘗試哪一種方案如果一個估價函數可以找出最短的路徑我們稱之為可采納性A*算法是一個可采納的最好優先算法A*算法的估價函數可表示為

  f(n) = g(n) + h(n)

  這裡f(n)是節點n的估價函數g(n)是起點到終點的最短路徑值h(n)是n到目標的最斷路經的啟發值由於A*算法比較復雜限於篇幅在此簡單介紹一下具體理論朋友們可以看人工智能方面的書籍了解詳細的情況

  其它技術還有粒子系統音頻與視頻的調用圖象文件的格式與信息存儲等大家可以在學好DirectX的基礎上逐漸學習更多的技術

  (二)游戲的具體制作

  .地圖編輯器的制作

  RPG游戲往往要有大量的場景場景中根據需要可以有草地湖泊樹木房屋家具等道俱由於一個游戲需要很多場景且地圖越來越大為了節省空間提高圖象文件的可重用性RPG游戲的畫面采用很多重復的單元(可以叫做圖塊)所構成的這就要用到地圖編輯器了我們在制作游戲引擎前要完成地圖編輯器的制作在 RPG游戲裡場景的構成是圖塊排列順序的記錄首先制定一個場景構成文件的格式在這個文件裡記錄構成場景所需要的圖塊的排列順序因為我們已經為每個圖塊建立了索引所以只需要記錄這些索引就可以了一個場景的構成是分成幾層來完成的地面建築和植物家具擺設和在場景中活動的人物或者物體(比如飄揚的旗幟)按照一定的順序把它們依次顯示到屏幕上就形成了一個豐富多采的場景我們可以用數組來表示地圖場景的生成過程

  MapData[X][Y] //地圖數據X表示地圖寬度Y表示地圖高度

  Picture[num] //道具的圖片num表示道具的總數

  void MakeBackGround() //生成場景函數

  {

  int n;

  for( int i=; i<Y; i++) //共Y行

  for( int j=; j<X; j++) //共X列

  {

  n=MapData[ i ][ j ]; //取得該位置的道具編號

  Draw( j* i* Picture[n]); //在此位置(j*i*)畫道具

  }

  }

  .游戲的模塊的劃分

  游戲按功能分為消息處理系統場景顯示及行走系統打斗系統三大主要部分其中又以消息處理系統為核心模塊其余部分緊緊圍繞它運行

  消息處理系統

  消息處理系統是游戲的核心部分游戲用到的消息處理系統先等待消息然後根據收到的消息轉到相應的函數進行處理比如主角碰到敵人後我們就讓程序產生打斗消息消息處理系統收到這個消息後就會馬上轉到打斗模塊中去消息處理的大體框架如下

  //定義程序中要用到的變量

  DWORD Message; //消息變量

  WinMain() //進入程序

  { 初始化主窗口;

  初始化DirectDraw環境並調入程序需要的圖形地圖數據

  while( ) //消息循環

  { switch( Message )

  { case 行走消息: 行走模塊();

  case 打斗消息 打斗模塊();

  case 事件消息 事件模塊();

  }

  }

  }

  場景顯示及行走系統

  作為RPG游戲其所有事件的發生幾乎都是和場景有關例如不同的地方會碰到不同的敵人與不同的人對話得知不同的事情等鑒於這部分的重要性我們可再將它劃分為背景顯示行走 和 事件發生 三個子模塊分別處理各自的功能下面進行具體分析

  (一)背景顯示

  程序運行後先讀取前面地圖編輯器制作的場景所需要的圖塊的排列順序按照排列順序將圖象拼成一個完整的場景一般做法是在內存中開辟一到兩個屏幕緩存區事先把即將顯示的圖象數據准備在緩存區內然後一次性搬家把它們傳送到真正的屏幕緩沖區內

  游戲用到的圖片則事先制作好並存於另外的圖形文件中地圖編輯器制作的場景文件僅僅是對應的數據而不是真正的圖片在游戲中生成場景就是地圖編輯的逆過程一個是根據場景生成數據而另一個是根據數據生成場景

  (二)行走

  要讓主角在場景中行走至少要有上右四個行走方向每個方向幅圖(站立邁左腿邁右腿邁左腿)如圖游戲中一定要將圖片的背景設為透明這樣在畫人物的時候就不會覆蓋上背景色了(這一技術DirectDraw中只要用SetColorKey()函數將原圖片背景色過濾掉就行了)我們讓主角位置不動而使場景移動即采用滾屏技術來實現角色在場景上移動這樣角色一直保持在屏幕的正中間需要做的工作只是根據行走方向和步伐不停變換圖片而已行走時的障礙物判斷也是每一個場景中必定要有的有一些道具如樹木房屋等是不可跨越的對此我主要用一個二維數組來對應一個場景每一個數組值代表場景的一小格(見圖)有障礙的地方該數組的對應值為可通過的地方的值為

  (三)事件發生

  事件發生原理就是把相應事件的序號存儲在地圖的某些格子中當主角一踏入這個格子就會觸發對應事件例如在游戲開始時主角是在他的家裡他要是想出去的話就需要執行場景切換這個處理函數我們假定該事件的編號為那麼在地圖上把家門外路口處的格子值設為這樣主角走到路口時編號為的場景切換函數就會被觸發於是主角便到了下一個場景中程序具體如下:

  void MessageLoop( int Msg ) //消息循環

  {switch( Msg )

  {char AddressName[]; //數組AddressName[]用來存儲主角所在地點的名稱

  case ADDRESS == : // 由ADDRESS的值決定場景值(出門)

  ScreenX=; ScreenY=; //初始化游戲背景位置

  Herox=; Heroy=;//主角坐標

  Move();//主角移動函數

  //以下程序用來顯示主角所在地點

  sprintf(AddressName下一幅游戲場景的名稱);

  PrintText(lpDDSPrimary Address>

  break;}

  }

  三打斗系統

  絕大多數的RPG都是有戰斗存在的因此打斗系統就成為RPG系統中很重要的一環有不少RPG游戲采用回合制打斗方式因為實現起來較為簡單和打斗緊密相關的是升級通常在一場戰斗結束後主角的經驗值都會增加而當經驗值到達一定程度時角色就升級了

  上面我簡要的介紹了角色扮演游戲的制作由於寫這篇文章的目的是讓讀者對角色扮演游戲的制作有一個基本的了解所以讀者朋友們可以研究相關資料


From:http://tw.wingwit.com/Article/program/Java/hx/201311/26462.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.