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

