用C++实现跨平台游戏引擎开发
游戲開(kāi)發(fā)系列
用C++實(shí)現(xiàn)跨平臺(tái)游戲引擎開(kāi)發(fā)
你是否夢(mèng)想寫(xiě)一部格斗游戲但卻無(wú)從著手呢?是否你只因游戲開(kāi)發(fā)好玩而對(duì)之感興趣?本文我們將分析一個(gè)通用的跨平臺(tái)游戲引擎,每個(gè)游戲開(kāi)發(fā)新手都可以自由地使用它。
1. 3D游戲引擎的簡(jiǎn)短歷史
在游戲開(kāi)發(fā)中,從一開(kāi)始就確定正確的開(kāi)發(fā)平臺(tái)是很重要的。是否你的游戲支持Windows,Linux和OS X?是否你的游戲開(kāi)發(fā)只使用OpenGL就足夠了?OpenGL是十九世紀(jì)九十年代初期設(shè)計(jì)的,起初只運(yùn)行于價(jià)值約$25,000的Unix CAD工作站上,后來(lái)移植到Windows和其它一些低端平臺(tái)上。與此同時(shí),隨著游戲工業(yè)的發(fā)展,圖形加速器價(jià)格從$2,000劇跌到你今天看到的價(jià)值約 $150的大眾市場(chǎng)價(jià)格。
確實(shí),許多人都會(huì)援引在1996年用OpenGL開(kāi)發(fā)成功的革命性的游戲Quake,作為以上急速發(fā)展 現(xiàn)象的直接的原因。然而,成功的Quake級(jí)的游戲開(kāi)發(fā)標(biāo)準(zhǔn)要求更多:世界級(jí)音頻支持,網(wǎng)絡(luò)連接,用戶輸入設(shè)備支持,以及實(shí)時(shí)的管理能力等。既需要實(shí)現(xiàn)跨 平臺(tái)支持又能使游戲效果激動(dòng)人心,要實(shí)現(xiàn)這樣的解決方案最好建立一個(gè)體面的游戲開(kāi)發(fā)站臺(tái)。
2. 用于C++,Java和其它開(kāi)發(fā)語(yǔ)言的簡(jiǎn)單DirectMedia層
對(duì),歷史就是這樣有趣,但并不是每一部游戲都要做成Quake的克隆品。一直被業(yè)界許多人吹捧有著許多優(yōu)點(diǎn)的選擇是簡(jiǎn)單DirectMedia層(SDML)。這是一套跨平臺(tái)的多媒體庫(kù), 它提供對(duì)于音頻,鍵盤(pán),鼠標(biāo),游戲桿,OpenGL和2D視頻幀緩沖的低級(jí)存取。SDML支持幾乎我能想像出的每一個(gè)平臺(tái),包括Linux, Windows,所有的MacOS變異物,WinCE,Dreamcast還有另外一些操作系統(tǒng)。它被廣泛應(yīng)用于開(kāi)發(fā)MPEG播放器,硬件仿真器,和許多 流行的游戲,包括獲獎(jiǎng)的運(yùn)行于Linux平臺(tái)的Civilization:Call to Power。
SDML用C寫(xiě)成,但生來(lái)就與C++一起工作,已經(jīng)綁定到了另外許多語(yǔ)言,包括Ada,Eiffel,Java,Lua,ML,Perl,PHP,Pike,Python和Ruby。SDML的應(yīng)用環(huán)境簡(jiǎn)直就沒(méi)有什么限制,而且它碰巧是我最喜愛(ài)的開(kāi)源飛行模擬器GL-117(見(jiàn)圖1)的開(kāi)發(fā)引擎。事實(shí)上,513游戲的當(dāng)前開(kāi)發(fā)已經(jīng)基于SDML引擎而且被注冊(cè)到了SDML的主頁(yè)。
圖1.GL-117中的一個(gè)視圖 |
3. 通道視覺(jué)效果演示程序
研究游戲引擎的最好方法是看一些示例程序代碼。簡(jiǎn)單地看一下圖2中用SDML實(shí)現(xiàn)的2D通道類(lèi)型演示圖,你就能發(fā)現(xiàn)你僅用幾行代碼所能完成的工作。你可 以使用該實(shí)例作為一個(gè)保護(hù)屏程序,音樂(lè)可視化動(dòng)畫(huà)效果,等等。篇幅所限,我已經(jīng)整理了實(shí)際的繪制代碼。請(qǐng)跟隨我的注釋分析下面對(duì)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;// 請(qǐng)求一個(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); // 如果可用的話,為屏幕表面請(qǐng)求硬件緩沖 bBuffer = SDL_CreateRGBSurface( SDL_HWSURFACE, screen->w,screen->h,screen->format->BitsPerPixel, screen->format->Rmask, screen->format->Gmask, screen->format->Bmask, screen->format->Amask); // 這是種子圖像,一旦開(kāi)始它就會(huì)盤(pán)旋起來(lái) 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)動(dòng)作, 并取消光標(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); // 在更新以后你可以開(kāi)鎖 SDL_UnlockSurface(Image); // 把緩沖區(qū)中的數(shù)據(jù)輸出到屏幕繪圖區(qū)域并強(qiáng)迫進(jìn)行重畫(huà) SDL_BlitSurface( bBuffer, NULL, screen, &rBuffer ); SDL_UpdateRect( screen, 0, 0, 0, 0 ); } Tunnel.Free(); } |
圖 2. 演示旋轉(zhuǎn)和扭曲的2D通道 |
4. 對(duì)另外一些游戲引擎的探索
讓我們看一下另外一些開(kāi)源的游戲引擎。
a) ALLEGRO(Allegro低級(jí)游戲開(kāi)發(fā)例程)
Allegro是一個(gè)開(kāi)源的可移植的庫(kù),主要針對(duì)視頻游戲和多媒體編程。Allegro由Shawn Hargreaves(近來(lái)稱為Climax)創(chuàng)建,現(xiàn)在成長(zhǎng)為一個(gè)能夠跨越許多操作系統(tǒng)如Linux,Windows,MacOS,MS-DOS和許多 另外的流行平臺(tái)等的游戲系統(tǒng)。
除了具有一個(gè)高級(jí)的2D圖形庫(kù),它能容易地存取鼠標(biāo),鍵盤(pán),游戲桿和高精度定時(shí)器中斷。Allegro 并沒(méi)有包裝或替換OpenGL,但是通過(guò)參觀他們廣闊的開(kāi)發(fā)站點(diǎn)(http://www.allegro.cc/),你能學(xué)習(xí)怎樣把OpenGL集成到 Allegro游戲程序中。
大約有700種不同的游戲工程,與Allegro一起發(fā)行,其中最為杰出的兩類(lèi)是街機(jī)游戲和謎題游戲。我特別地喜歡經(jīng)典的街機(jī)游戲Zaxxon(見(jiàn)圖3)的重制品。
圖3.酷斃的Zaxxon的重制品 |
b) Irrlicht:點(diǎn)燃快速實(shí)時(shí)的3D引擎
這個(gè)Irrlicht 引擎是一個(gè)跨平臺(tái),高性能實(shí)時(shí)引擎,用C++寫(xiě)成。你可以選擇Direct3D,OpenGL 或基于軟件的著色技術(shù)。高端特點(diǎn)包括動(dòng)態(tài)陰影,粒子系統(tǒng),人物動(dòng)畫(huà),進(jìn)門(mén)和出門(mén)技術(shù)和碰撞檢測(cè)(見(jiàn)圖4)。Irrlicht支持Windows和 Linux并提供到語(yǔ)言Java,Perl,Ruby等的綁定。業(yè)界先驅(qū)Nikolaus Gebhardt在他的朋友的少部分幫助下完成的這個(gè)引擎工。
圖4.在Irrlicht中的一個(gè)十分逼真的場(chǎng)景 |
c) ClanLib:為多玩家游戲設(shè)計(jì)的引擎
ClanLib提供了一個(gè)平臺(tái)獨(dú)立的接口來(lái)書(shū)寫(xiě)游戲-它們有一個(gè)共同的到低級(jí)庫(kù)如DirectX和OpenGL的接口。借助于ClanLib,你只需編 寫(xiě)少量代碼即可在Windows,Linux和OSX系統(tǒng)上開(kāi)發(fā)游戲程序。ClanLib包括一個(gè)廣泛的聲音庫(kù),2D碰撞檢測(cè),動(dòng)畫(huà),GUI框架和網(wǎng)絡(luò)庫(kù)。圖5顯示了游戲XenoHammer中的一個(gè)場(chǎng)景。
圖5.XenoHammer屏幕快照 |
發(fā)表于 @ 2006年02月22日 12:05 PM | 評(píng)論 (2)
用C++實(shí)現(xiàn)跨平臺(tái)游戲開(kāi)發(fā)之Allegro引擎
要:本文重點(diǎn)討論開(kāi)源游戲開(kāi)發(fā)庫(kù)Allegro(Allegro低級(jí)游戲例程),同時(shí)涉及到一些深度技術(shù)并提供了一個(gè)簡(jiǎn)單的示例程序,幫你進(jìn)一步確定它是否是適合你的開(kāi)發(fā)平臺(tái)。
border="0" marginwidth="0" marginheight="0" src="http://219.239.88.50/adsunion/get/;pl=pl-20-pip-software;tp=if;sk=0;ck=0;/?" noresize="65535" frameborder="0" height="1" scrolling="no" width="1"> 一、 一個(gè)適于多環(huán)境的引擎
Allegro最開(kāi)始被研發(fā)于八十年代后期古老的Atari ST平臺(tái)上,隨后被快速地移植到流行的DJGPP環(huán)境(一個(gè)在九十年代早期流行的32位的MS-DOS擴(kuò)展程序)。此后,Allegro被移植到最為流行的Windows C++開(kāi)發(fā)環(huán)境中,包括VS,MinGW,Cygwin和Borland C++。另外的支持它的平臺(tái)包括Linux,BeOS,QNX,Mac OSX以及幾乎任何其它帶有X11庫(kù)的Unix平臺(tái)上。
Allegro能著色到各種類(lèi)型的位圖和硬件加速的環(huán)境中,例如DirectX,XWindows,SVGAlib,FreeBE/AF, CGDirectDisplay,QuickDraw,等等。Allegro并不想提供它自己的3D環(huán)境或模擬器,但是OpenGL可以被容易地集成,這 是通過(guò)使用AllegroGL庫(kù)-它提供了一個(gè)類(lèi)似于GLUT的接口(包括擴(kuò)展管理)-實(shí)現(xiàn)的。
二、 性能概要
在進(jìn)一步使用API開(kāi)發(fā)前,讓我們看一下Allegro提供的總體功能:
·具體到像素級(jí)的繪圖函數(shù),包括平坦陰影,gouraud陰影,紋理貼圖,z緩沖的多邊形和圓繪制,填充,貝塞爾樣條曲線,圖案填充,精靈,blitting(位圖復(fù)制),位圖計(jì)算縮放和旋轉(zhuǎn),半透明/光效果以及比例字體支持的文本輸出
·FLI/FLC(在計(jì)算機(jī)生成的動(dòng)畫(huà)方面,這種格式比MPEG有更高的壓縮性能)動(dòng)畫(huà)播放器
·播放后臺(tái)MIDI音樂(lè),可達(dá)64種同時(shí)的聲音效果,并能錄制樣本波形和MIDI輸入(聲音平臺(tái)支持,包括WaveOut,DirectSound,OSS,ESD,CoreAudio和QuickTime,等等)
·容易地存取鼠標(biāo),鍵盤(pán),游戲桿等設(shè)備,還支持高分辨率定時(shí)器中斷,包括一個(gè)DOS版本的垂直折回中斷模擬器
·讀/寫(xiě)LZSS壓縮文件的例程
·數(shù)學(xué)函數(shù),包括定點(diǎn)算術(shù),表查找和3D矢量/矩陣/四元數(shù)操作
·GUI對(duì)話框管理器和文件選擇器
·內(nèi)建地支持16位和UTF-8格式的Unicode字符
三、 使用引擎
使用Allegro進(jìn)行開(kāi)發(fā),就象在許多其它游戲場(chǎng)合下一樣,游戲的總體結(jié)構(gòu)都包括游戲開(kāi)始前的初始化,游戲循環(huán)以及游戲完成后的清理。初始化意味著既 包含Allegro啟動(dòng)代碼也包含在開(kāi)始的位置實(shí)現(xiàn)基本地裝載或生成你的游戲級(jí)別。在創(chuàng)建你的初始化代碼時(shí),啟動(dòng)Allegro基本上沒(méi)有什么代價(jià)付出 (見(jiàn)圖1).
如果你需要很多屏幕相關(guān)的真實(shí)性能,建議你首先禮貌地用get_gfx_mode_list()函數(shù)查詢一下最大可用方式:
| #include <allegro.h> //必須放于系統(tǒng)頭文件的引用之后 set_color_depth(32); // 缺省情況下使用8位顏色 if (set_gfx_mode(GFX_AUTODETECT, 640, 480, 0, 0) != 0) { abort_on_error("Couldn’t set a 32 bit color resolution"); } |
set_gfx_mode()的最后兩個(gè)參數(shù)用于指定虛擬緩沖區(qū)的大小-我們的圖形屏幕存儲(chǔ)于其中。這可以使創(chuàng)建一個(gè)卷邊游戲-其中地形是連續(xù)移動(dòng)的-變得容易。例如,你可能要使虛擬緩沖區(qū),比方說(shuō),寬出20%以留出足夠的空間來(lái)平滑卷動(dòng)新的精靈和地形。
四、 一個(gè)完整的Allegro實(shí)例
本教程將使用Kee-Yip Chan的SnookerClone演示程序,它是基于James Lohr的另一個(gè)具有相同名字的演示程序。圖1顯示了演示程序的基本屏幕快照。
圖1.Kee-Yip Chan的"SnookerClone"演示程序 |
這個(gè)工程向你展示了許多不同的Allegro技術(shù),包括動(dòng)畫(huà),鍵盤(pán)輸入和鼠標(biāo)輸入,碰撞和游戲物理知識(shí)(例如重力)。它利用了三個(gè)主要的元素:一個(gè)有8 個(gè)扶手的旋轉(zhuǎn)的車(chē)輪,一個(gè)用箭頭鍵來(lái)控制的大紅球,還有一些從頂部往下墜落的藍(lán)球。車(chē)輪以接觸方式推動(dòng)紅球,而當(dāng)紅球碰上藍(lán)球時(shí),它們之間相互影響。
下列是完整的Allegro演示程序的代碼:
| 1 #include <allegro.h> 2 vector<Point> g_points; //aka球上點(diǎn)的列表 3 vector<Joint> g_joints; //物理對(duì)象列表,如車(chē)輪和緩沖器 4 kVec g_accControl; 6 int main(void) 7 { 8 allegro_init(); // 初始化allegro. 9 install_keyboard(); // 啟動(dòng)鍵盤(pán). 10 install_mouse(); // 啟動(dòng)鼠標(biāo). 11 install_timer(); //過(guò)程show_mouse()所需要; 13 // 創(chuàng)建一個(gè)800x600的非全屏窗口. 14 set_gfx_mode(GFX_AUTODETECT_WINDOWED, 800, 600, 0, 0); 16 set_window_title("Kee-Yip Chan’s Snooker Clone"); 17 text_mode(-1); // 文本將被畫(huà)在透明的背景之上 19 BITMAP* buffer = create_bitmap(SCREEN_W, SCREEN_H); //創(chuàng)建一張位圖用于雙緩沖. 21 // 初始化數(shù)據(jù). 22 create_joints(g_joints); //注冊(cè)車(chē)輪、地板和緩沖器的硬編碼的屏幕位置 25 // 創(chuàng)建頂點(diǎn)以組成aka球: 玩家所用球和三個(gè)藍(lán)球 26 // 的位置, 速度, 大小和質(zhì)量. 27 g_points.push_back(Point(kVec(100, 300),kVec(0, 0),16, 10)); // 玩家. 28 g_points.push_back(Point(kVec(50, 40), kVec(0, 0),12, 5)); // 中等的球. 29 g_points.push_back(Point(kVec(80, 40), kVec(0, 0) 12, 5)); //中等的球. 30 g_points.push_back(Point(kVec(110, 40),kVec(0, 0),6, 1)); // 小球. 32 //主循環(huán),在按ESC鍵后退出 33 while(!key[KEY_ESC]) { //檢查輸入. 34 if(key[KEY_UP]) 35 g_accControl.y = -0.07; //Jet pack.向上加速 36 if(key[KEY_LEFT]) 37 g_accControl.x = -0.07; //左走.向左加速 38 if(key[KEY_RIGHT]) 39 g_accControl.x = 0.07; //右走.向右加速 41 static bool leftMousePressed = false, rightMousePressed = false; 42 if(mouse_b & 1) { //鼠標(biāo)左鍵按下 43 if(!leftMousePressed){ 44 leftMousePressed = true; // 創(chuàng)建一個(gè)新球. 45 g_points.push_back(Point(kVec(mouse_x, mouse_y),kVec(0, 0), 12, 5)); 46 } 47 } 48 if(!(mouse_b & 1)) 49 //保證不重復(fù)鼠標(biāo)按鍵 50 //否則,就會(huì)出現(xiàn)許多的新球 51 leftMousePressed = false; 52 if(mouse_b & 2) { //鼠標(biāo)右鍵按下 53 if(!rightMousePressed){ 54 rightMousePressed = true; // 創(chuàng)建一個(gè)新球 55 g_points.push_back(Point(kVec(mouse_x, mouse_y),kVec(0, 0), 6, 1)); 56 } 57 } 58 if(!(mouse_b & 2)) 59 //保證不重復(fù)鼠標(biāo)按鍵 60 //否則,就會(huì)出現(xiàn)許多的新球. 61 rightMousePressed = false; 63 doPhysics(); 65 // 著色:如果我們能再次使用緩沖區(qū),則清除它; //否則,舊圖像將滯留顯示 66 //用白色進(jìn)行清除. 67 clear_to_color(buffer, makecol(255, 255, 255)); 68 for(unsigned i = 0; i < g_points.size(); i++) { //畫(huà)點(diǎn). 69 //畫(huà)一個(gè)實(shí)心球 70 circlefill(buffer, //畫(huà)向緩沖區(qū) 71 g_points[i].position.x,g_points[i].position.y,// aka 球的中心點(diǎn)的位置 72 g_points[i].size, // 半徑. 73 (i == 0) ? makecol(255, 0, 0) : makecol(0, 0, 255)); //紅色如果是玩家;否則為藍(lán)色 75 // 畫(huà)一個(gè)輪廓球. 76 circle(buffer, //畫(huà)向緩沖區(qū) 77 g_points[i].position.x,g_points[i].position.y, // aka 球的中心點(diǎn)的位置. 78 g_points[i].size, // 半徑. 79 makecol(0, 0, 0)); //紅色如果是玩家;否則為藍(lán)色. 81 } 83 // 畫(huà)接合點(diǎn) 84 for (unsigned i = 0; i < g_joints.size(); i++) 85 line(buffer, //畫(huà)向緩沖區(qū) 86 g_joints[i].p1.x, g_joints[i].p1.y, // 點(diǎn) 1. 87 g_joints[i].p2.x, g_joints[i].p2.y, // 點(diǎn) 2. 88 makecol(0, 0, 0)); // 黑顏色. 89 ); 91 // 打印指令. 92 textout(buffer, font, "Left Mouse Button - new big ball Right Mouse Button - new small ball", 93 125, 1, makecol(0, 0, 0)); 95 textout(buffer, font, "Arrow Keys - move red ball", 96 300, 592, makecol(0, 0, 0)); 98 show_mouse(buffer); // 畫(huà)鼠標(biāo)光標(biāo). 100 draw_sprite(screen, buffer, 0, 0);// 把緩沖區(qū)中的數(shù)據(jù)畫(huà)向屏幕. 101 } // while循環(huán)結(jié)束 103 return 0; 105 }END_OF_MAIN(); |
33-101行包括了典型的游戲編程循環(huán)模式。游戲繼續(xù)進(jìn)行直到玩家按下ESC鍵退出為止。34-39行支持同時(shí)進(jìn)行的鍵盤(pán)輸入,因?yàn)槟憧梢园聪孪蛏虾拖蜃蠹^鍵來(lái)獲取粗略的斜向運(yùn)動(dòng)。
在41-61行,鼠標(biāo)動(dòng)作被捕獲到全局變量mouse_b(用于按鈕),mouse_x和mouse_y。如果你一直在使用一滾輪鼠標(biāo),你還可以使用變量mouse_z。我們對(duì)反向彈跳邏輯進(jìn)行了一點(diǎn)硬編碼以確保每次鼠標(biāo)按下事件只有一個(gè)球下落。
第63行調(diào)用doPhysics(),其目的是旋轉(zhuǎn)車(chē)輪的線段,更新球位置,檢測(cè)球碰撞和適當(dāng)?shù)馗淖兯鼈兊姆较蚴噶俊_@個(gè)模塊(350行的數(shù)學(xué)代碼)有點(diǎn)深入了些,但它確實(shí)是一個(gè)一流的實(shí)現(xiàn),值得你深入研究。
余下的代碼,65-101行,開(kāi)始著色,在典型的示例程序中這屬于常規(guī)實(shí)現(xiàn)部分。這里的著色用典型的雙緩沖區(qū)技術(shù),下一次屏幕變化被計(jì)算出來(lái)并進(jìn)行脫屏 繪制并在最的一毫秒進(jìn)行緩沖交換(第100行)。這確保了視覺(jué)的連續(xù)性又減少了煩人的閃爍-對(duì)象看上去是隨機(jī)地繪制的。在著色代碼部分,對(duì)line()和 circlefill()的調(diào)用是相當(dāng)直接的:circlefill()以x,y,半徑和填充顏色作為參數(shù)。
textout_ex ()函數(shù)的功能稍強(qiáng)于textout()(示于92-96行),允許你指定前景和背景顏色。Allegro提供例程以直接從GRX格式.fnt文件, 8x8或8x16 BIOS格式.fnt文件,位圖圖象以及數(shù)據(jù)文件格式中裝入字體。作為選擇,你能導(dǎo)入一種大范圍的Unicode字體,這可以通過(guò)寫(xiě)一個(gè).txt腳本-它 為每一范圍的字符指定相應(yīng)的不同的源文件-來(lái)實(shí)現(xiàn)。如果你想要支持TrueType,那么你需要AllegroTTF或相同功能的插件。
最后,在第100行的draw_sprite()實(shí)現(xiàn)一個(gè)覆蓋性復(fù)制新生成的位圖到第14行創(chuàng)建的屏幕對(duì)象上。覆蓋性復(fù)制意指只有非透明的顏色像素被復(fù)制。在本例中,我確信它已被退化成一個(gè)"blit"(塊復(fù)制)轉(zhuǎn)儲(chǔ)。
五、 Allegro的音頻
這個(gè)snooker演示程序只涉及到了一些最基本的圖形和I/O函數(shù),但是并沒(méi)有用到Allegro的音頻開(kāi)發(fā)包。該包中的MIDI混頻,音響效果和錄 音API,其效果達(dá)到或超過(guò)幾乎每一個(gè)我所見(jiàn)過(guò)的專業(yè)的聲音庫(kù)。Allegro音頻應(yīng)用軟件大量存在,包括WinCab-一個(gè)MP3和OGG Vorbis音樂(lè)唱片機(jī),還有LouTronic Rhythm Box-一個(gè)鼓聲生成合成器,它具有可全面融合到一起的snare鼓,低音鼓和hi hat的效果。下面我們簡(jiǎn)單地回顧Allegro音頻API的一小部分。
每一個(gè)使用音頻的程序都應(yīng)該調(diào)用reserve_voices()來(lái)指定數(shù)字和MIDI聲音驅(qū)動(dòng)程序分別使用的聲音的數(shù)目。接下去,你能控制這些音頻軌道的混合.
你可以非常容易地象下面這樣插入一個(gè)音軌:
| MIDI *midFile = load_midi("myfile.mid’); play_midi(midFile, TRUE);//連續(xù)循環(huán) |
對(duì)于更復(fù)雜的需要,你可以安裝三個(gè)鉤子函數(shù)之一,它們可以使你攔截MIDI玩家事件。如果被設(shè)置為非NULL,這些例程將在每次MIDI消息,元事件和系統(tǒng)獨(dú)占的數(shù)據(jù)塊中被分別調(diào)用。
Allegro的數(shù)字音頻系統(tǒng)被設(shè)計(jì)為從最基本的配置到可高度擴(kuò)展的。你能容易安裝讀取器和寫(xiě)入器來(lái)處理新的或者不同的音頻文件類(lèi)型, 例如:
| register_sample_file_type("mp3",load_mp3,NULL);//安裝MP3讀取器 |
當(dāng)正播放數(shù)字音頻時(shí),你可以隨時(shí)編輯它。下列代碼改變將在播放一個(gè)樣本參數(shù)時(shí)改變?cè)摌颖?用于操作循環(huán)播放的聲音):
| void adjust_sample(const SAMPLE *spl, int vol, int pan, int freq, int loop); |
你能改變音量,平移音頻數(shù)據(jù)并清除循環(huán)標(biāo)志,在下次執(zhí)行到循環(huán)末尾時(shí),這將停止該樣本。如果在播放相同樣本的好幾個(gè)副本,這會(huì)調(diào)整它遇到的第一個(gè)副本。如果該樣本沒(méi)有播放,對(duì)它沒(méi)有任何影響。
發(fā)表于 @ 2006年02月22日 12:03 PM | 評(píng)論 (0)
用C++實(shí)現(xiàn)跨平臺(tái)游戲開(kāi)發(fā)之Irrlicht引擎
Irrlicht引擎是一個(gè)用C++書(shū)寫(xiě)的高性能實(shí)時(shí)的3D引擎,可以應(yīng)用于C++程序或者.NET語(yǔ)言中。通過(guò)使用Direct3D(Windows平臺(tái)),OpenGL 1.2或它自己的軟件著色程序,可以實(shí)現(xiàn)該引擎的完全跨平臺(tái)。盡管是開(kāi)源的,該Irrlicht庫(kù)提供了可以在商業(yè)級(jí)的3D引擎上具有的藝術(shù)特性,例如動(dòng)態(tài)的陰影,粒子系統(tǒng),角色動(dòng)畫(huà),室內(nèi)和室外技術(shù)以及碰撞檢測(cè)等(見(jiàn)圖1)。
圖1.Irrlicht 3D引擎 |
Irrlicht是一個(gè)德國(guó)神話故事中的一種動(dòng)物的名字,它能夠發(fā)光和飛翔,可以在大部分的沼澤地附近發(fā)現(xiàn)它。單詞"Irrlicht"是兩個(gè)德國(guó)單詞("irr"意思是瘋狂的;而"Licht"意思是光)的組合。在英語(yǔ)中,它被譯為"鬼火"。
Irrlicht十分幸運(yùn)地為一個(gè)巨大的活躍的開(kāi)發(fā)團(tuán)隊(duì)以大量的工程所支持。然而,因?yàn)镮rrlicht主要由游戲名家Nikolaus Gebhardt所設(shè)計(jì),所以該游戲在設(shè)計(jì)上十分連貫。你可以在網(wǎng)上到處發(fā)現(xiàn)有Irrlicht的增強(qiáng)程序,如可選用的地形生成器,入口生成器,輸出器, world層生成器,相關(guān)教程和編輯器等。而且,它獨(dú)立地創(chuàng)建了到Java,Perl,Ruby,BASIC,Python,LUA甚至更多種語(yǔ)言的綁 定。而最為重要的是,它是完全自由的。
二、 Irrlicht特性
在深入分析API之前,請(qǐng)讓我更具體地介紹一下Irrlicht提供給了3D游戲開(kāi)發(fā)者哪些功能:
·一個(gè)可以運(yùn)行于Linux以及Windows 98,ME,NT,2000和XP(MacOS在計(jì)劃之中)等操作系統(tǒng)之上的引擎
·針對(duì)Direct3D 8生成器或Direct3D 9生成器(可選)提供了Anti-aliasing支持
·可換膚的GUI環(huán)境(包括一個(gè)很酷的具有金屬質(zhì)地的帶陰影的皮膚),給一些老式的對(duì)話框加上漂亮的外觀
·場(chǎng)景管理系統(tǒng),它允許無(wú)縫的室內(nèi)/室外過(guò)渡
·角色動(dòng)畫(huà)系統(tǒng),帶有骨骼和變形目標(biāo)動(dòng)畫(huà)功能
·一個(gè)特殊的效果系統(tǒng),包括粒子效果(雨,煙,火,雪,等等),告示板,燈光貼圖,環(huán)境,地圖,模板緩沖區(qū)陰影,霧,紋理動(dòng)畫(huà),視差貼圖,凹凸貼圖,還有更多
·內(nèi)建的材質(zhì)支持,包括支持Pixel and Vertex Shaders版本1.1到3.0,ARB Fragment and Vertex程序以及HLSL(GLSL正在計(jì)劃中)
·.NET語(yǔ)言綁定,這使得引擎可用于所有的.NET語(yǔ)言例如C#,Visual Basic.NET以及Delphi.NET
·一內(nèi)建的平臺(tái)獨(dú)立的軟件生成器,特性有:z-緩沖,Gouraud陰影,alpha混合和透明性,還有快速的2D繪圖(見(jiàn)圖2)
·你久已期待的2D繪圖功能,例如alpha混合,基于關(guān)鍵色的位圖復(fù)制,字體繪制,以及混合3D與2D圖形
·能直接導(dǎo)入常見(jiàn)的建模文件格式:Maya,3DStudio Max,COLLADA,DeleD,Milkshape,Quake 3 levels,Quake2 models,DirectX,Pulsar,My3DTools,FSRad以及Cartography Shop
·能直接從BMP,PNG,Photoshop,JPEG,Targa和PCX導(dǎo)入紋理
·快速而易用的碰撞檢測(cè)與響應(yīng)
·為快速的3D運(yùn)算和容器模板庫(kù)進(jìn)行了優(yōu)化處理
·直接讀取檔案(可能是壓縮的,如.zip文件)
·集成了快速的XML分析器
·為實(shí)現(xiàn)容易的本地化開(kāi)發(fā)提供Unicode支持
圖2:基于Irrlicht的游戲Yet Another Space Shooter(YASS),這里顯示的是一個(gè)靜態(tài)游戲幀中的令人吃驚的著色效果 |
三、 在Irrlicht中的特殊效果
在本文的例子中,我將向你展示怎樣使用模板緩沖區(qū)影子技術(shù),還有粒子系統(tǒng),告示板,動(dòng)態(tài)光以及水表面場(chǎng)景結(jié)點(diǎn)等技術(shù)。參見(jiàn)圖3。
圖3.結(jié)合動(dòng)態(tài)的光和水進(jìn)行的場(chǎng)景著色 |
Irrlicht引擎自動(dòng)地檢查是否你的硬件支持模板緩沖;而如果不支持,則不啟動(dòng)陰影。在這個(gè)演示程序中,在方法createDevice()中的 ’shadows’標(biāo)志被置位,以產(chǎn)生從一個(gè)動(dòng)畫(huà)角色投下的動(dòng)態(tài)影子。如果這個(gè)實(shí)例程序在你的PC上運(yùn)行太慢,可以把這個(gè)標(biāo)志設(shè)置為false或者干脆再 買(mǎi)一塊更好些的圖形加速卡。
為能夠使用Irrlicht.DLL文件,你需要鏈接到Irrlicht.lib庫(kù)文件。你可以在工程設(shè) 置對(duì)話框中設(shè)置這個(gè)選項(xiàng);但是為了容易實(shí)現(xiàn),你可以使用一個(gè)pragma預(yù)編譯注釋命令。方法createDevice()負(fù)責(zé)實(shí)例化根對(duì)象-它使用引擎 完成一切事情。參數(shù)如下:
·deviceType:設(shè)備類(lèi)型。當(dāng)前你可選取Null設(shè)備以及軟設(shè)備,如DirectX8,DirectX9或OpenGL。
·windowSize:要?jiǎng)?chuàng)建的窗口的大小或全屏幕模式。這個(gè)例子中使用512x384。
·bits:每像素位數(shù)(當(dāng)在全屏幕情況時(shí))。僅允許值為16或者32。
·fullscreen:指定是否你想使設(shè)備運(yùn)行于全屏幕方式。
·stencilbuffer:指定是否你想使用模板緩沖區(qū)以用于繪制陰影。
·vsync:指定是否你想啟動(dòng)vsync(僅在全屏幕情況),可選。
·eventReceiver:一個(gè)接收事件的對(duì)象,可選。
為適合于本實(shí)例環(huán)境,你將裝載一個(gè)3D Studio Max文件(一幢房子)。該房子看起來(lái)并沒(méi)有什么特別的,但是Irrlicht引擎能為你創(chuàng)建一個(gè)相當(dāng)酷的紋理貼圖。只需使用造型操縱器并為之創(chuàng)建一個(gè)planar紋理貼圖即可:
| #include <irrlicht.h> #include <iostream> using namespace irr; #pragma comment(lib, "Irrlicht.lib") int main() { //讓我們假定用戶在本例中使用OpenGL //當(dāng)然,也可以指定DirectX 8, 9, 等等. video::E_DRIVER_TYPE driverType = video::EDT_OPENGL; //創(chuàng)建設(shè)備,如果創(chuàng)建失敗立即退出。 IrrlichtDevice *device = createDevice(driverType, core::dimension2d(640, 480), 16, false, true); if (device == 0) return 1; video::IVideoDriver* driver = device->getVideoDriver(); scene::ISceneManager* smgr = device->getSceneManager(); |
我對(duì)從這個(gè)導(dǎo)入文件產(chǎn)生的發(fā)射光線顏色的效果并不滿意。下列代碼顯示怎樣實(shí)現(xiàn)這些步驟:
| scene::IAnimatedMesh* mesh = smgr->getMesh("room.3ds"); smgr->getMeshManipulator()->makePlanarTextureMapping( mesh->getMesh(0), 0.008f); scene::ISceneNode* node = 0; node = smgr->addAnimatedMeshSceneNode(mesh); node->setMaterialTexture(0, driver->getTexture("wall.jpg")); node->getMaterial(0).EmissiveColor.set(0,0,0,0); |
四、 水動(dòng)畫(huà)
你將添加的第一個(gè)特殊的效果是水動(dòng)畫(huà)。為此,WaterSurfaceSceneNode導(dǎo)入一個(gè)造型文件并使之象水表面一樣地波動(dòng)。如果你讓這個(gè)場(chǎng)景結(jié)點(diǎn)使用一種相當(dāng)好的材質(zhì)如MT_REFLECTION_2_LAYER,那么它看起來(lái)相當(dāng)酷:
| mesh = smgr->addHillPlaneMesh("myHill", core::dimension2d(20,20), core::dimension2d(40,40), 0, 0, core::dimension2d(0,0), core::dimension2d(10,10)); node = smgr->addWaterSurfaceSceneNode(mesh->getMesh(0),3,300,30); node->setPosition(core::vector3df(0,7,0)); node->setMaterialTexture(0,driver->getTexture("water.jpg")); node->setMaterialTexture(1,driver->getTexture("stones.jpg")); node->setMaterialType(video::EMT_REFLECTION_2_LAYER); |
作為輸入造型,你可以創(chuàng)建一個(gè)陡峭的平面造型,但是你也可以為此使用任何其它的造型。你甚至能重用room.3ds輸入文件(它看上去確實(shí)很奇怪)。該實(shí)例還用一個(gè)普通的石頭紋理模型來(lái)繪制所有另外的表面。
五、透明的告示板和燈光
第二個(gè)特殊的效果是很基本的但是非常有用:一個(gè)透明的告示板,伴之有一個(gè)動(dòng)態(tài)的燈光。為產(chǎn)生這種效果,你只需要產(chǎn)生一個(gè)燈光場(chǎng)景結(jié)點(diǎn),并讓它四處飛行;而且,為了讓它看起來(lái)更酷一些,可以把一個(gè)告示板場(chǎng)景結(jié)點(diǎn)依附到它上面:
| //創(chuàng)建燈光 node = smgr->addLightSceneNode(0, core::vector3df(0,0,0), video::SColorf(1.0f, 0.6f, 0.7f, 1.0f), 600.0f); scene::ISceneNodeAnimator* anim = 0; anim = smgr->createFlyCircleAnimator(core::vector3df(0,150,0),250.0f); node->addAnimator(anim); anim->drop(); // 把告示板依附到燈光 node = smgr->addBillboardSceneNode(node, core::dimension2d(50, 50)); node->setMaterialFlag(video::EMF_LIGHTING, false); node->setMaterialType(video::EMT_TRANSPARENT_ADD_COLOR); node->setMaterialTexture(0,driver->getTexture("particlewhite.bmp")); |
六、 粒子系統(tǒng)
下面介紹的這個(gè)特別效果更有趣:一個(gè)粒子系統(tǒng)。在Irrlicht引擎中,粒子系統(tǒng)既是組件化的,也是可擴(kuò)展的,但是仍然易于使用。你只需要簡(jiǎn)單地把粒 子發(fā)射器放到一個(gè)粒子系統(tǒng)場(chǎng)景結(jié)點(diǎn),這樣以來(lái)粒子看上去沒(méi)有產(chǎn)生源。這些發(fā)射器可以據(jù)需要進(jìn)行靈活配置,并經(jīng)常帶有許多參數(shù),如粒子方向,粒子數(shù)量,以及 粒子顏色等。
當(dāng)然,發(fā)射器類(lèi)型有區(qū)別(例如,一個(gè)點(diǎn)發(fā)射器能夠使粒子從一個(gè)固定的點(diǎn)上發(fā)出粒子)。如果該引擎提供的粒子發(fā)射器還 不能滿足你的要求,你可以容易地創(chuàng)建你自己的發(fā)射器。這只需簡(jiǎn)單地從IParticleEmitter接口派生一個(gè)新類(lèi)并使用setEmitter()方 法把它依附到粒子系統(tǒng)上去即可。
下一個(gè)實(shí)例將創(chuàng)建一個(gè)盒子粒子發(fā)射器。你可能已經(jīng)猜出,它從一個(gè)跳躍的盒中隨機(jī)生成粒子。由參數(shù)來(lái)定義盒子,粒子的方向,每秒產(chǎn)生粒子的最小和最大數(shù)目,顏色以及粒子的最小和最大生命周期。
一個(gè)完全由發(fā)射器組成的粒子系統(tǒng)將是令人生厭的,因?yàn)槿狈φ鎸?shí)感。因此,Irrlicht支持粒子影響器-它負(fù)責(zé)在粒子到處飛揚(yáng)時(shí)予以修整。一旦添加到 粒子系統(tǒng)上,它們就能模仿另外的更真實(shí)的效果,象重力或風(fēng)。在本例中的粒子影響器只是簡(jiǎn)單地修改粒子的顏色來(lái)產(chǎn)生一種淡出效果。
可能 你已經(jīng)猜出,粒子影響器是通過(guò)派生IParticleAffector接口實(shí)現(xiàn)的,然后通過(guò)使用addAffector()方法把它添加到粒子系統(tǒng)上去。 在你為該粒子系統(tǒng)設(shè)置了一種好看的材質(zhì)后,你就有了一個(gè)看上去相當(dāng)酷的野外宿營(yíng)火的效果。通過(guò)調(diào)整材質(zhì),紋理,粒子發(fā)射器,還有影響器參數(shù),你能容易地創(chuàng) 建煙霧,下雨,爆炸,下雪等效果:
| scene::IParticleSystemSceneNode* ps = 0; ps = smgr->addParticleSystemSceneNode(false); ps->setPosition(core::vector3df(-70,60,40)); ps->setScale(core::vector3df(2,2,2)); ps->setParticleSize(core::dimension2d(20.0f, 10.0f)); scene::IParticleEmitter* em = ps->createBoxEmitter( core::aabbox3d(-7,0,-7,7,1,7), core::vector3df(0.0f,0.03f,0.0f), 80,100, video::SColor(0,255,255,255), video::SColor(0,255,255,255), 800,2000); ps->setEmitter(em); em->drop(); scene::IParticleAffector* paf =ps->createFadeOutParticleAffector(); ps->addAffector(paf); paf->drop(); ps->setMaterialFlag(video::EMF_LIGHTING, false); ps->setMaterialTexture(0, driver->getTexture,"particle.bmp")); ps->setMaterialType(video::EMT_TRANSPARENT_VERTEX_ALPHA); |
七、 影子投射
最后但也不容忽視一個(gè)問(wèn)題是,你需要為一個(gè)動(dòng)畫(huà)角色產(chǎn)生一個(gè)動(dòng)態(tài)的影子。為此,你裝載一個(gè)Quake2.md2模型文件并把它放到你的world上去。 為了創(chuàng)建影子,你只需要調(diào)用方法addShadowVolumeSceneNode()。你可能通過(guò)調(diào)用ISceneManager:: setShadowColor()來(lái)控制影子的顏色;注意,這僅是全局可調(diào)整的,并影響所有的影子。好,下面就是你的產(chǎn)生動(dòng)態(tài)影子效果的代碼:
| mesh = smgr->getMesh("../../media/faerie.md2"); scene::IAnimatedMeshSceneNode* anode = 0; anode = smgr->addAnimatedMeshSceneNode(mesh); anode->setPosition(core::vector3df(-50,45,-60)); anode->setMD2Animation(scene::EMAT_STAND); anode->setMaterialTexture(0, driver->getTexture("../../media/Faerie5.BMP")); anode->addShadowVolumeSceneNode(); smgr->setShadowColor(video::SColor(220,0,0,0)); |
八、 游戲循環(huán)
最后,你能進(jìn)入由device->run()方法控制的游戲循環(huán)。該循環(huán)將不斷運(yùn)行,直到通過(guò)獲取一個(gè)關(guān)閉窗口事件(例如在Windows操作系 統(tǒng)下的ALT-F4擊鍵)來(lái)退出設(shè)備。你必須在一個(gè)beginScene()和endScene()命令對(duì)之間繪制每樣?xùn)|西。beginScene()用 指定的一種顏色清屏,如果需要的話,可以同時(shí)清除深度緩沖區(qū)。然后你就可以讓場(chǎng)景管理器和GUI環(huán)境來(lái)繪制它們的內(nèi)容。隨著調(diào)用endScene(),每 一樣?xùn)|西都被繪制到屏幕上去。在本例中,你還可以動(dòng)態(tài)地在標(biāo)題欄上顯示幀每秒(FPS)數(shù),這對(duì)于嚴(yán)肅的游戲開(kāi)發(fā)者是十分重要的事情:
| scene::ICameraSceneNode* camera = smgr->addCameraSceneNodeFPS(); camera->setPosition(core::vector3df(-50,50,-150)); int lastFPS = -1; while(device->run()) { driver->beginScene(true, true, 0); smgr->drawAll(); driver->endScene(); int fps = driver->getFPS(); if (lastFPS != fps) { core::stringw str = L"Campfire FX example ["; str += driver->getName(); str += "] FPS:"; str += fps; device->setWindowCaption(str.c_str()); lastFPS = fps; } } device->drop(); |
結(jié)束循環(huán)后,你必須刪除先前用createDevice()方法創(chuàng)建的Irrlicht設(shè)備。通過(guò)使用Irrlicht引擎,你應(yīng)該刪除所有你用以 ’create’開(kāi)頭的方法或函數(shù)創(chuàng)建的所有對(duì)象。你可以通過(guò)簡(jiǎn)單地調(diào)用device->drop()來(lái)刪除該設(shè)備對(duì)象。
九、你可能喜歡的Irrlicht插件
正如在前面所介紹的,Irrlicht有一群勤奮的獨(dú)立開(kāi)發(fā)人員并為之產(chǎn)生了大量的插件,也用之開(kāi)發(fā)了相當(dāng)多的游戲。這些開(kāi)發(fā)者中提出的許多的改進(jìn)被再次集成到Irrlicht的隨后的發(fā)行版本中。下面我列舉其中的幾個(gè)例子,我想這會(huì)吸引許多頗有前程的開(kāi)發(fā)者感興趣:
·OCTTools,是一套用于Irrlicht的工具,由Murphy McCauley所創(chuàng)建,用于操作OCT文件相關(guān)的:輸出器,加載器,甚至更多。
·ICE(Irrlicht通用引擎)是一個(gè)開(kāi)發(fā)框架,它提供了一個(gè)工程的輪廓實(shí)現(xiàn),從而加快了新工程的開(kāi)發(fā)。
·MIM,由Murphy McCauley所創(chuàng)建,是一個(gè)非常有用的基于XML的文件格式,可用于Irrlicht的加載器,轉(zhuǎn)換器及其各種工具。
·My3D是一個(gè)開(kāi)發(fā)工具包,它能夠使你把來(lái)自于各種3D包(3DStudio MAX,Giles,等等)中的燈光貼圖場(chǎng)景直接輸出到Irrlicht中。
·Dusty引擎允許程序員創(chuàng)建"任務(wù)"-這些"任務(wù)"可以完成程序員想做的任何事情。之后,這些任務(wù)被添加到一棵普通的任務(wù)樹(shù)上去,而每個(gè)任務(wù)可以有它們希望數(shù)目的孩子任務(wù)。任務(wù)"組"允許游戲設(shè)計(jì)者在一棵完整的樹(shù)上執(zhí)行普通的操作,例如暫停,繼續(xù)或破壞等。
·Irrlicht RPG(Erring Light)是一個(gè)3D 繞行走游戲引擎,最初是針對(duì)RPG類(lèi)游戲開(kāi)發(fā)的。
·2D 圖像和精靈類(lèi)組成了一個(gè)很有用的庫(kù),它擴(kuò)展了Irrlicht的2D能力。
·Zenprogramming站點(diǎn),提供第一個(gè)針對(duì)Irrlicht的非正式的外部地形生成器,此處也提供很多相關(guān)的教程。
發(fā)表于 @ 2006年02月22日 12:02 PM | 評(píng)論 (0)
基于Nokia手機(jī)的移動(dòng)游戲開(kāi)發(fā)步步通wxh zt
????摘要:
一、游戲開(kāi)發(fā)策略
1?游戲動(dòng)作(Action)的使用
MIDP的Canvas類(lèi)讓程序員處理某些按鍵事件,要么作為特定的低級(jí)鍵控代碼事件要么作為抽象的游戲動(dòng)作。FullCanvas是Nokia的全屏畫(huà)布(FullCanvas)類(lèi),它是從Canvas類(lèi)繼承而來(lái)的。
在回合制游戲或者不需要超過(guò)四個(gè)方向鍵(上、下、左、右)的游戲中,最好使用直接的鍵盤(pán)代碼來(lái)控制游戲動(dòng)作。可以使用抽象游戲動(dòng)作的游戲例子包括國(guó)際象棋和知識(shí)測(cè)驗(yàn)以及解謎游戲,這些都是使用方向鍵來(lái)滾動(dòng)屏幕或者移動(dòng)。
游戲動(dòng)作應(yīng)該只在不需要快速反應(yīng)的游戲中使用。這是因?yàn)樗x擇的設(shè)備的游戲動(dòng)作映射可能對(duì)于要求快速動(dòng)作的游戲并不適用。并且,如果一個(gè)游戲要求斜的方 向鍵或者這個(gè)游戲是一個(gè)快節(jié)奏的動(dòng)作游戲,那時(shí)游戲者一只手需要移動(dòng)游戲角色,另一只手需要執(zhí)行其他操作,比如射擊、開(kāi)門(mén)等等,那么就需要使用直接鍵盤(pán)代 碼。原因是在MIDP中沒(méi)有斜向的游戲動(dòng)作,并且游戲動(dòng)作映射是為一只手使用設(shè)計(jì)的。
當(dāng)使用直接鍵盤(pán)代碼事件的時(shí)候,必須特別注意應(yīng)用程序的可移植性。????(全文共27691字)——點(diǎn)擊此處閱讀全文
發(fā)表于 @ 2005年08月25日 4:25 PM | 評(píng)論 (5)
3D游戲開(kāi)發(fā)流程
????摘要:隊(duì)伍組成
開(kāi)發(fā)團(tuán)隊(duì)
n ? ? ? ? ? ? ?制作人
n ? ? ? ? ? ? ?執(zhí)行制作人
n ? ? ? ? ? ? ?策劃團(tuán)隊(duì)
n ? ? ? ? ? ? ?程式團(tuán)隊(duì)
n ? ? ? ? ? ? ?美術(shù)團(tuán)隊(duì)
銷(xiāo)售團(tuán)隊(duì)
測(cè)試團(tuán)隊(duì)
游戲評(píng)論隊(duì)伍
游戲制作人
n ? ? ? ? ? ? ?開(kāi)發(fā)組長(zhǎng)(always)
n ? ? ?????(全文共16443字)——點(diǎn)擊此處閱讀全文
發(fā)表于 @ 2005年08月20日 12:40 PM | 評(píng)論 (0)
half-life2的圖形系統(tǒng)研究心得
????摘要:作者:佚名
小T一邊作自己的3D引擎,一邊研究half-life2的圖形引擎,留下點(diǎn)心得。
整體上half-life2給小T的感覺(jué)一是龐大,二就是難讀,com方式組織引擎,小T也不敢妄加評(píng)價(jià),只是小T覺(jué)得整個(gè)引擎非常的難讀。小T只有借助 調(diào)試器才勉強(qiáng)對(duì)half-life2的圖形引擎有個(gè)大致的了解,至于怎么編譯half-life2,怎么運(yùn)行,以及怎樣調(diào)試,小T就不詳細(xì)的描述了,到網(wǎng) 上隨便一搜索就能找到一大堆,這里只是簡(jiǎn)單的看看他的圖形系統(tǒng)。
當(dāng)前的3D環(huán)境,想要提高渲染速度,一個(gè)最基本的方法就是要減少硬件 的渲染狀態(tài)的切換,今天小T就是講hl2的渲染狀態(tài)管理部分的。在hl2里面,渲染狀態(tài)主要被放在了一個(gè)叫ShadowState_t的結(jié)構(gòu)里面,這個(gè)結(jié) 構(gòu)對(duì)應(yīng)了大多數(shù)的硬件渲染狀態(tài),渲染系統(tǒng)維護(hù)多個(gè)ShadowState_t結(jié)構(gòu),在必要的時(shí)候把ShadowState_t的內(nèi)容真正的設(shè)置到硬件上 面,從而減少硬件的狀態(tài)切換。當(dāng)然實(shí)際上卻沒(méi)有這么簡(jiǎn)單,上面只????(全文共9751字)——點(diǎn)擊此處閱讀全文
發(fā)表于 @ 2005年08月18日 4:37 PM | 評(píng)論 (0)
讀程序員網(wǎng)游專題云風(fēng)的文章有感
????摘要:讀程序員網(wǎng)游專題云風(fēng)的文章有感 ????(全文共3782字)——點(diǎn)擊此處閱讀全文
發(fā)表于 @ 2005年08月01日 11:31 PM | 評(píng)論 (0)
基于圖論的幾何約束解算簡(jiǎn)介
????摘要:基于圖論的幾何約束解算簡(jiǎn)介????(全文共5690字)——點(diǎn)擊此處閱讀全文
發(fā)表于 @ 2005年08月01日 11:31 PM | 評(píng)論 (0)
spg系列c語(yǔ)言開(kāi)發(fā)---改變 sprite 的楨的函數(shù)
????摘要:spg系列c語(yǔ)言開(kāi)發(fā)---改變 sprite 的楨的函數(shù) ????(全文共1938字)——點(diǎn)擊此處閱讀全文
發(fā)表于 @ 2005年08月01日 11:30 PM | 評(píng)論 (0)
進(jìn)入Ogre的世界
????摘要:進(jìn)入Ogre的世界 ????(全文共2435字)——點(diǎn)擊此處閱讀全文
發(fā)表于 @ 2005年08月01日 11:29 PM | 評(píng)論 (0)
總結(jié)
以上是生活随笔為你收集整理的用C++实现跨平台游戏引擎开发的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 通知|百度1+X区块链系统应用与设计职业
- 下一篇: Codeforces Round #59