你是否梦想写一部格斗游戏但却无从着手呢?是否你只因游戏开发好玩而对之感兴趣?本文我们将分析一个通用的跨平台游戏引擎,每个游戏开发新手都可以自由地使用它。
1. 3D游戏引擎的简短历史
在游戏开发中,从一开始就确定正确的开发平台是很重要的。是否你的游戏支持Windows,Linux和OS X?是否你的游戏开发只使用OpenGL就足够了?OpenGL是十九世纪九十年代初期设计的,起初只运行于价值约$25,000的Unix CAD工作站上,后来移植到Windows和其它一些低端平台上。与此同时,随着游戏工业的发展,图形加速器价格从$2,000剧跌到你今天看到的价值约$150的大众市场价格。
确实,许多人都会援引在1996年用OpenGL开发成功的革命性的游戏Quake,作为以上急速发展现象的直接的原因。然而,成功的Quake级的游戏开发标准要求更多:世界级音频支持,网络连接,用户输入设备支持,以及实时的管理能力等。既需要实现跨平台支持又能使游戏效果激动人心,要实现这样的解决方案最好建立一个体面的游戏开发站台。
2. 用于C++,Java和其它开发语言的简单DirectMedia层
对,历史就是这样有趣,但并不是每一部游戏都要做成Quake的克隆品。一直被业界许多人吹捧有着许多优点的选择是简单DirectMedia层(SDML)。这是一套跨平台的多,它提供对于音频,键盘,鼠标,游戏杆,OpenGL和2D视频帧缓冲的低级存取。SDML支持几乎我能想像出的每一个平台,包括Linux,Windows,所有的MacOS变异物,WinCE,Dreamcast还有另外一些操作系统。它被广泛应用于开发MPEG播放器,硬件仿真器,和许多流行的游戏,包括获奖的运行于Linux平台的Civilization:Call to Power。
SDML用C写成,但生来就与C++一起工作,已经绑定到了另外许多语言,包括Ada,Eiffel,Java,Lua,ML,Perl,PHP,Pike,Python和Ruby。SDML的应用环境简直就没有什么限制,而且它碰巧是我最喜爱的开源飞行模拟器GL-(见图1)的开发引擎。事实上,513游戏的当前开发已经基于SDML引擎而且被注册到了SDML的主页。
图1.GL-117中的一个视图 |
3. 通道视觉效果演示程序
研究游戏引擎的最好方法是看一些示例程序代码。简单地看一下图2中用SDML实现的2D通道类型演示图,你就能发现你仅用几行代码所能完成的工作。你可以使用该实例作为一个保护屏程序,音乐可视化动画效果,等等。篇幅所限,我已经整理了实际的绘制代码。请跟随我的注释分析下面对SDML的工作原理的描述:
#i nclude "Tunnel.h" // SDL 相关变量定义 SDL_Surface *screen,*bBuffer,*Image; SDL_Rect rScreen,rBuffer; int main (int argc, char **argv) { int flag = SDL_SWSURFACE;// 请求一个软件表面. //软件表面处于系统内存中, // 一般不如硬件表面速度快 #ifdef WIN32 int fullscreen = MessageBox(NULL, "Show Screen (y/n):","Screen Setting", MB_YESNO); if (fullscreen==IDYES) { flag |= SDL_FULLSCREEN; // 如果用户需要,接管整个屏幕 } #endif Tunnel_Timer(); // 读取起始的系统时钟值 SDL_Init( SDL_INIT_VIDEO ); // 初始化视频子系统 //把屏幕设置到 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 ); // 通道将填充整个的缓冲区 Tunnel.Precalc( 16 ); //内部的圆圈直径 while (SDL_PollEvent(NULL)==0) { float fTime = Tunnel_GetTime(); //在修改前,必须锁定表面,特别当缓冲区处于图形硬件内存中时 SDL_LockSurface(bBuffer); SDL_LockSurface(Image); Tunnel.Draw(bBuffer, Image, 180*sin(fTime), fTime*100); SDL_UnlockSurface(bBuffer); // 在更新以后你可以开锁 SDL_UnlockSurface(Image); // 把缓冲区中的数据输出到屏幕绘图区域并强迫进行重画 SDL_BlitSurface( bBuffer, NULL, screen, &rBuffer ); SDL_UpdateRect( screen, 0, 0, 0, 0 ); } Tunnel.Free(); } |
图 2. 演示旋转和扭曲的2D通道 |
4. 对另外一些游戏引擎的探索
让我们看一下另外一些开源的游戏引擎。
a) ALLEGRO(Allegro低级游戏开发例程)
Allegro是一个开源的可移植的库,主要针对视频游戏和多媒体编程。Allegro由Shawn Hargreaves(近来称为Climax)创建,现在成长为一个能够跨越许多操作系统如Linux,Windows,MacOS,MS-DOS和许多另外的流行平台等的游戏系统。
除了具有一个高级的2D图形库,它能容易地存取鼠标,键盘,游戏杆和高精度定时器中断。Allegro并没有包装或替换OpenGL,但是通过参观他们广阔的开发站点(),你能学习怎样把OpenGL集成到Allegro游戏程序中。
大约有700种不同的游戏工程,与Allegro一起发行,其中最为杰出的两类是街机游戏和谜题游戏。我特别地喜欢经典的街机游戏Zaxxon(见图3)的重制品。
图3.酷毙的Zaxxon的重制品 |
b) Irrlicht:点燃快速实时的3D引擎
这个Irrlicht 引擎是一个跨平台,高性能实时引擎,用C++写成。你可以选择,OpenGL或基于软件的着色技术。高端特点包括动态阴影,粒子系统,人物动画,进门和出门技术和碰撞检测(见图4)。Irrlicht支持Windows和Linux并提供到语言Java,Perl,Ruby等的绑定。业界先驱Nikolaus Gebhardt在他的朋友的少部分帮助下完成的这个引擎工。
图4.在Irrlicht中的一个十分逼真的场景 |
c) ClanLib:为多玩家游戏设计的引擎
ClanLib提供了一个平台独立的接口来书写游戏-它们有一个共同的到低级库如DirectX和OpenGL的接口。借助于ClanLib,你只需编写少量代码即可在Windows,Linux和OSX系统上开发游戏程序。ClanLib包括一个广泛的声音库,2D碰撞检测,动画,框架和网络库。图5显示了游戏XenoHammer中的一个场景。
图5.XenoHammer屏幕快照 |
阅读(2179) | 评论(0) | 转发(0) |