設計工具之遊戲引擎 小謝 早想寫一點遊戲設計的文章與你們交流,一是經驗的問題,二是公司正在緊張的遊戲製做期,實在抽不出多少時間,一直沒有動手,今天突然頭腦發熱,寫了一段,之後準備陸續寫一些遊戲創意,策劃,製做,流程管理,和製做工具等方面的文章供你們參考. 咱們的遊戲設計經驗主要是冒險遊戲和角色扮演遊戲,但咱們設計遊戲工具時儘可能適應其他題材,不過是否可行未經檢驗. 寫這篇文章的意圖一是想爲遊戲界作點事,拋磚引玉吧,另外是公司正在尋找志同道合的戰友,我寫一點文章交一交朋友,許多東西僅僅是咱們的經驗,不必定很好.參考而已吧。 遊戲設計工具包括遊戲編輯工具和遊戲引擎兩塊; 編輯工具:交互編輯遊戲數據,生成遊戲引擎所需的數據文件,包括如下幾個功能塊: 圖像編輯,場景編輯,物品編輯,動畫編輯,人物編輯,事件編輯等,具體介紹在之後的文章介紹. 先從遊戲引擎提及. 語言: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類遊戲.未來咱們要作的是一套能夠交互設計各類遊戲的開發平臺,固然不是<<遊戲工廠>>似的玩具.