天天看點

遊戲程式設計之九 設計工具之遊戲引擎

設計工具之遊戲引擎

小謝

  早想寫一點遊戲設計的文章與大家交流,一是經驗的問題,二是公司正在緊張的遊戲制作期,實在抽不出多少時間,一直沒有動手,今天忽然頭腦發熱,寫了一段,以後準備陸續寫一些遊戲創意,策劃,制作,流程管理,和制作工具等方面的文章供大家參考. 

  我們的遊戲設計經驗主要是冒險遊戲和角色扮演遊戲,但我們設計遊戲工具時盡量适應其餘題材,不過是否可行未經檢驗. 

  寫這篇文章的意圖一是想為遊戲界做點事,抛磚引玉吧,另外是公司正在尋找志同道合的戰友,我寫一點文章交一交朋友,許多東西僅僅是我們的經驗,不一定很好.參考而已吧。 

遊戲設計工具包括遊戲編輯工具和遊戲引擎兩塊; 

  編輯工具:互動編輯遊戲資料,生成遊戲引擎所需的資料檔案,包括以下幾個功能塊: 

    圖像編輯,場景編輯,物品編輯,動畫編輯,人物編輯,事件編輯等,具體介紹在以後的文章介紹. 

    先從遊戲引擎說起. 

    語言:VC5.0 

       作業系統:WIN95 

       圖像引擎:DIRECT X 5.0 

       支援遊戲風格:各種類型和視角以及多層次的冒險遊戲和角色扮演遊戲 

    整個遊戲引擎包括以下功能塊: 

  資源管理:圖像庫CIMGLIB,聲音庫CSOUNDLIB,通過編輯工具形成的資源檔案來定義,每種資源包括定義管理和一些操作接口.圖像庫圖像包括多種格式(BMP,GIF.AVI,FLC等)以及他形成的記憶體格式定義,子圖定義(每一張圖檔包括許多小圖,需定義它的小圖位置,當然可以自動生成),遊戲需要的特殊定義,比如行走,身體性質,中心定位點,觸發區,可以根據自己的要求擴充各種性質定義. 

  圖像最好允許圖像組合定義.聲音庫包括WAV和 MID的定義和再現. 

    資源由IMGLIB.DAT和SOUNGIMG.DAT定義,調試版本中最好不要将資源打包,而是指向正常的檔案名,發行版本中再打包,這樣修改和不同從業人員協調容易一些,否則最好有一個自己的資料總管.我們在調試版本中資料檔案采用文本描述格式.許多資料可以手工編寫而不需要專門的編輯工具. 

    資源管理對象還包括記憶體管理,比如設定時間閥釋放長期不用的資源. 

    聲音管理:CSOUND,包括Creat(),Sound(char *fileName...),SetPos(),等,DirectSound有一些函數,我們要做的是封裝簡化,減少對外的接口. 

  視窗系統:接管标準視窗系統,一個完善的遊戲引擎最好有一個自己的界面系統,至于簡單還是複雜根據自己情況具體分析,一個具備基本功能的界面系統1000行程式就可以對付下來,需要視窗系統的原因是一般的圖像引擎不支援标準視窗,二是可以便于移植到别的作業系統.在我們的遊戲引擎中,遊戲隻是視窗系統的一種特殊控件(CWINGMCTR),是以可以實作多視窗遊戲等特殊要求. 

    CWINGMCTR是一種特殊控件,通過他來控制遊戲.包括控制和顯示. 

  圖像引擎:所使用的圖像引擎的管理,我們使用的是DirectX, 

包括Creat(),CreatSurface(),OutToScr(),Bilt()等對外接口;他不是遊戲的重點,我們盡量将圖像引擎細節封裝起來. 

  圖像管理:這是處理圖像的中心,一般處理遊戲顯示喜歡以某種圖像引擎為中心來設計,我覺得最好設計自己的對象來封裝别人的圖像引擎,這樣不會因某引擎而受限制,移植也比較容易,我們雖然使用的DIRECT X,但實際上對外的接口是一種CPICPAGE的界面,他不但包括DIRECT X 的surface,也包括标準的位圖,AVI界面,GIF動畫界面,以及自定義的格式,他将各種類型的圖像統一起來,對外使用統一操作,比如DRAWTEXT,BILT,LINE等标準圖形圖像操作,以及擴充的ALPHA通道,透明度等操作.為了減少記憶體的需求,特别是16M高彩,不要将全部圖像使用DIRECT X的表面,對一些重新整理不多的圖像,比如背景,可以使用标準256色位圖,甚至一種GIF表面,需要時再解壓,我們還使用一種單色位圖用來從背景中摳圖,比如一所場景中一棵巨大的樹,隻要不是動畫,我們可以用單色摳圖的形式從背景中扣除來作為另外一層,這樣我們可以大大降低圖像的記憶體需求.是以采用全部手繪( 

或3D場景), 而不是小圖拼貼的場景成為可能.通過各種手段可以節約60%的記憶體需求. 

    CPICPAGE可以通過TimeTrace()以及多線程來改寫内容,比如AVI的改變. 

  遊戲控制:這部分包括顯示和控制,由CGAME->CGAMEPAGE->CGMOBJ對象組成,CGAME是總控對象,包括許多CGAMEPAGE遊戲頁,CGAMEPAGE是一個具有連續場景的遊戲片斷,有點類似于遊戲的一關,CGAMEPAGE由一系列CGMOBJ組成,CGMOBJ是遊戲的基本對象,由他繼承出地圖,物體,物品,人物,武器,動畫,觸發器,多媒體按鈕等特殊遊戲對象,這是一個根據遊戲要求不斷豐富和改寫的部分,對外的接口是:SendDraw(),Draw(),TimeTrace(),AcceptMsg(),SendNetMsg(),AcceptNetMsg()等,他是通過CWINGMCTR來調用,每種對象有許多控制參數,對象之間允許通訊,以及有自己的生長死亡發展的控制,盡量做到對象與外界減少直接接口,通過消息實作交流. 

    對象分為兩類:景色對象和活動對象, 

景色對象定義了組成場景的元素,包括背景和前景兩層,可以是由整個圖檔組成或由RPG常用的圖檔拼貼法的組成,它的特點隻作為背景或前景,活動物是在他們的之間活動,一般定義後不做改變,也不做控制,由于支援圖像界面多格式,是以我們可以友善地使用AVI或GIF動畫作為背景來增加場景的效果和真實性.景色還包括了行走性質定義,我們采用的是8x8為一單元,每個單元定義了一種性質,比如平地,草地,障礙物等. 

活動對象是在背景和前景之間活動,他們之間有互相的位置關系,前後關系随着位置改變會不斷改變,是以他在所屬的CGAMEPAGE中次序是動态的.對象的關系一般是由Y軸定義,由于要支援斜視角和複雜的地形結構,光靠Y軸是不夠的,我們引入了地基線的概念,通過在地基線之上還是之下來判斷前後關系,地基線的定義在圖像定義中描述.活動對象有複雜的參數,可以接受外界消息,可以有自己的各種反應.我們在引擎中使用了一種描述語言來描述他們的反應,比如對滑鼠擊打,人物經過等産生參數改變,發聲,對話等的回應.描述語言将作為專門的一章來介紹. 

    遊戲顯示過程是這樣的,在每次重新整理期時視窗的遊戲控件調用他所屬的遊戲頁CGAMEPAGE->SendDraw();遊戲頁将要顯示的對象按前後次序送往視窗,同時注明此對象是否改變,視窗分析改寫的區域,調用每個對象的Draw()接口來重新整理活動的區域,為了增加速度,并不是顯示所有的區域,而是隻改寫活動區域,是以我們設計了一個CCLIP的對象來管理重新整理定義,它的原理是将表面分為16*16的單元,最終顯示時計算出優化後的多個剪切區域.整個視窗系統和每個遊戲控件擁有自己的CCLIP對象.另外一項增加速度的方案是遊戲控件擁有一個比顯示窗大兩倍的顯示頁,這樣場景滾動時隻要将顯示位置改變即可,不用重新整理所有區域. 

  遊戲控制的過程是這樣的:AcceptMsg()來接受各種消息調用腳本來改變自己參數和狀态并影響别的對象,另外每次時鐘來時,調用每個對象的TimeTrace()來改變狀态,比如動畫改變,運動軌迹改變,觀察周圍的對象做出反應等. 

  系統控制子產品:對系統的參數做出反應.不同的題材控制不一樣,比如即時戰略等.隻要改寫這部分以及擴充遊戲對象,引擎便能支援不同的題材.至于人工智能,智能行走,隻是對象的方法,比較簡單,隻是需要時間. 

  遊戲控制部分比較複雜,每一種遊戲對象都有許多控制的細節,在這篇文章裡不做具體描述,以後再說吧. 

  最後一個是網絡子產品:我們正在開發的是國内第一個圖形化MUD遊戲,網絡是它的核心部分,介紹網絡的内容很多,需專門文章.我們使用的不是DirectPlay,使用的是WinSoct,考慮的是UNIX作為伺服器的需求.網絡要解決的難點是安全,同步和資料壓縮,這裡要用到許多技巧. 

    遊戲是通過資料檔案來定義: 

  資料檔案格式:資料檔案包括資源定義檔案和遊戲定義,界面定義檔案,檔案的資料格式我們采用的是文本形式,類似于WEB的文本,這樣的好處一是版本更新容易處理,二是可以減少前期對編輯工具的功能要求,因為我們可以用文字編輯器處理大部分資料,然後有時間再設計一個強大的工具比較現實,當然,最終提供給使用者的是處理後的資料檔案.他中間有一個轉換子產品. 

    遊戲的運作流程描述(不是真正的過程,按DOS格式描述): 

       CreatGameWindow();//初始化window視窗 

       CreatDraw(hWnd); //初始化圖像引擎 

       CreatSound();//初始化聲音引擎 

       CreatAvi()//初始化AVI引擎 

       CreatNet();//初始化網絡引擎 

LoadGameData();//讀取遊戲定義資料,包括資源定義檔案和遊戲定義,界面定義 

       While(1) 

      { 

             WINTraceMsg();//處理系統消息,比如滑鼠,鍵盤等 

             GameTimeTarce();//處理活動的遊戲頁的時間反應 

             WinPaint();//重新整理遊戲顯示 

       OutToScr(); 

      } 

  我們這裡介紹的是單線程結構,許多部分可以用多線來加快遊戲速度,但結構是一樣的,就不多介紹了. 

  遊戲引擎的系統分析是遊戲設計技術方面的成功關鍵,是最容易走彎路的部分,希望我們的文章能給大家一點啟發,由于今天的遊戲趨向于多類型綜合,設計引擎時一定不要拘泥于某一單項題材,我們在策劃這套引擎時要求他支援的遊戲非常廣,甚至支援多媒體設計,這套引擎隻要擴充或改寫參數管理以及遊戲對象,便能支援各種風格的2D類遊戲.将來我們要做的是一套可以互動設計各種遊戲的開發平台,當然不是<<遊戲工廠>>似的玩具. 

繼續閱讀