用C++實(shí)現(xiàn)跨平臺游戲引擎開發(fā)

字號:

你是否夢想寫一部格斗游戲但卻無從著手呢?是否你只因游戲開發(fā)好玩而對之感興趣?本文我們將分析一個(gè)通用的跨平臺游戲引擎,每個(gè)游戲開發(fā)新手都可以自由地使用它。
    1. 3D游戲引擎的簡短歷史
    在游戲開發(fā)中,從一開始就確定正確的開發(fā)平臺是很重要的。是否你的游戲支持Windows,Linux和OS X?是否你的游戲開發(fā)只使用OpenGL就足夠了?OpenGL是十九世紀(jì)九十年代初期設(shè)計(jì)的,起初只運(yùn)行于價(jià)值約$25,000的Unix CAD工作站上,后來移植到Windows和其它一些低端平臺上。與此同時(shí),隨著游戲工業(yè)的發(fā)展,圖形加速器價(jià)格從$2,000劇跌到你今天看到的價(jià)值約$150的大眾市場價(jià)格。
    確實(shí),許多人都會援引在1996年用OpenGL開發(fā)成功的革命性的游戲Quake,作為以上急速發(fā)展現(xiàn)象的直接的原因。然而,成功的Quake級的游戲開發(fā)標(biāo)準(zhǔn)要求更多:音頻支持,網(wǎng)絡(luò)連接,用戶輸入設(shè)備支持,以及實(shí)時(shí)的管理能力等。既需要實(shí)現(xiàn)跨平臺支持又能使游戲效果激動人心,要實(shí)現(xiàn)這樣的解決方案建立一個(gè)體面的游戲開發(fā)站臺。
    2. 用于C++,Java和其它開發(fā)語言的簡單DirectMedia層
    對,歷史就是這樣有趣,但并不是每一部游戲都要做成Quake的克隆品。一直被業(yè)界許多人吹捧有著許多優(yōu)點(diǎn)的選擇是簡單DirectMedia層(SDML)。這是一套跨平臺的多媒體庫,它提供對于音頻,鍵盤,鼠標(biāo),游戲桿,OpenGL和2D視頻幀緩沖的低級存取。SDML支持幾乎我能想像出的每一個(gè)平臺,包括Linux,Windows,所有的MacOS變異物,WinCE,Dreamcast還有另外一些操作系統(tǒng)。它被廣泛應(yīng)用于開發(fā)MPEG播放器,硬件仿真器,和許多流行的游戲,包括獲獎的運(yùn)行于Linux平臺的Civilization:Call to Power。
    SDML用C寫成,但生來就與C++一起工作,已經(jīng)綁定到了另外許多語言,包括Ada,Eiffel,Java,Lua,ML,Perl,PHP,Pike,Python和Ruby。SDML的應(yīng)用環(huán)境簡直就沒有什么限制,而且它碰巧是我最喜愛的開源飛行模擬器GL-117(見圖1)的開發(fā)引擎。事實(shí)上,513游戲的當(dāng)前開發(fā)已經(jīng)基于SDML引擎而且被注冊到了SDML的主頁。
    3. 通道視覺效果演示程序
    研究游戲引擎的方法是看一些示例程序代碼。簡單地看一下圖2中用SDML實(shí)現(xiàn)的2D通道類型演示圖,你就能發(fā)現(xiàn)你僅用幾行代碼所能完成的工作。你可以使用該實(shí)例作為一個(gè)保護(hù)屏程序,音樂可視化動畫效果,等等。篇幅所限,我已經(jīng)整理了實(shí)際的繪制代碼。請跟隨我的注釋分析下面對SDML的工作原理的描述:
    #include "Tunnel.h"
    // SDL 相關(guān)變量定義
    SDL_Surface *screen,*bBuffer,*Image;
    SDL_Rect rScreen,rBuffer;
    int main (int argc, char **argv)
    {
    int flag = SDL_SWSURFACE;// 請求一個(gè)軟件表面.
    //軟件表面處于系統(tǒng)內(nèi)存中,
    // 一般不如硬件表面速度快
    #ifdef WIN32
    int fullscreen = MessageBox(NULL, "Show Full Screen (y/n):","Screen Setting", MB_YESNO);
    if (fullscreen==IDYES) {
    flag |= SDL_FULLSCREEN; // 如果用戶需要,接管整個(gè)屏幕
    }
    #endif
    Tunnel_Timer(); // 讀取起始的系統(tǒng)時(shí)鐘值
    SDL_Init( SDL_INIT_VIDEO ); // 初始化視頻子系統(tǒng)
    //把屏幕設(shè)置到 320x240,32位顏色
    screen = SDL_SetVideoMode( 320, 240, 32, flag);
    // 如果可用的話,為屏幕表面請求硬件緩沖
    bBuffer = SDL_CreateRGBSurface( SDL_HWSURFACE, screen->w,screen->h,screen->format->BitsPERPixel,
     screen->format->Rmask,
     screen->format->Gmask,
     screen->format->Bmask,
     screen->format->Amask);
    // 這是種子圖像,一旦開始它就會盤旋起來
    Image = SDL_LoadBMP( "tunnel_map.bmp" );
    Image = SDL_ConvertSurface(Image, screen->format, SDL_HWSURFACE);
    rBuffer.x = 0;
    rBuffer.y = 0;
    rBuffer.w = bBuffer->w;
    rBuffer.h = bBuffer->h;
    // 忽視大多數(shù)事件, 包括 鼠標(biāo)動作, 并取消光標(biāo)
    SDL_EventState(SDL_ACTIVEEVENT, SDL_IGNORE);
    SDL_EventState(SDL_MOUSEMOTION, SDL_IGNORE);
    SDL_ShowCursor( SDL_DISABLE );
    Tunnel.Set( 320, 240 ); // 通道將填充整個(gè)的緩沖區(qū)
    Tunnel.Precalc( 16 ); //內(nèi)部的圓圈直徑
    while (SDL_PollEvent(NULL)==0) {
    float fTime = Tunnel_GetTime();
    //在修改前,必須鎖定表面,特別當(dāng)緩沖區(qū)處于圖形硬件內(nèi)存中時(shí)
    SDL_LockSurface(bBuffer);
    SDL_LockSurface(Image);
    Tunnel.Draw(bBuffer, Image, 180*sin(fTime), fTime*100);
    SDL_UnlockSurface(bBuffer); // 在更新以后你可以開鎖
    SDL_UnlockSurface(Image);
    // 把緩沖區(qū)中的數(shù)據(jù)輸出到屏幕繪圖區(qū)域并強(qiáng)迫進(jìn)行重畫
    SDL_BlitSurface( bBuffer, NULL, screen, &rBuffer );
    SDL_UpdateRect( screen, 0, 0, 0, 0 );
    }
    Tunnel.Free();
    }
    4. 對另外一些游戲引擎的探索
    讓我們看一下另外一些開源的游戲引擎。
    a) ALLEGRO(Allegro低級游戲開發(fā)例程)
    Allegro是一個(gè)開源的可移植的庫,主要針對視頻游戲和多媒體編程。Allegro由Shawn Hargreaves(近來稱為Climax)創(chuàng)建,現(xiàn)在成長為一個(gè)能夠跨越許多操作系統(tǒng)如Linux,Windows,MacOS,MS-DOS和許多另外的流行平臺等的游戲系統(tǒng)。
    除了具有一個(gè)高級的2D圖形庫,它能容易地存取鼠標(biāo),鍵盤,游戲桿和高精度定時(shí)器中斷。Allegro并沒有包裝或替換OpenGL,但是通過參觀他們廣闊的開發(fā)站點(diǎn)(http://www.allegro.cc/),你能學(xué)習(xí)怎樣把OpenGL集成到Allegro游戲程序中。
    大約有700種不同的游戲工程,與Allegro一起發(fā)行,其中最為杰出的兩類是街機(jī)游戲和謎題游戲。我特別地喜歡經(jīng)典的街機(jī)游戲Zaxxon(見圖3)的重制品。
    b) Irrlicht:點(diǎn)燃快速實(shí)時(shí)的3D引擎
    這個(gè)Irrlicht 引擎是一個(gè)跨平臺,高性能實(shí)時(shí)引擎,用C++寫成。你可以選擇Direct3D,OpenGL或基于軟件的著色技術(shù)。高端特點(diǎn)包括動態(tài)陰影,粒子系統(tǒng),人物動畫,進(jìn)門和出門技術(shù)和碰撞檢測(見圖4)。Irrlicht支持Windows和Linux并提供到語言Java,Perl,Ruby等的綁定。業(yè)界先驅(qū)Nikolaus Gebhardt在他的朋友的少部分幫助下完成的這個(gè)引擎工。
    c) ClanLib:為多玩家游戲設(shè)計(jì)的引擎
    ClanLib提供了一個(gè)平*立的接口來書寫游戲-它們有一個(gè)共同的到低級庫如DirectX和OpenGL的接口。借助于ClanLib,你只需編寫少量代碼即可在Windows,Linux和OSX系統(tǒng)上開發(fā)游戲程序。ClanLib包括一個(gè)廣泛的聲音庫,2D碰撞檢測,動畫,GUI框架和網(wǎng)絡(luò)庫。圖5顯示了游戲XenoHammer中的一個(gè)場景。