用C++实现跨平台游戏引擎开发
你是否梦想写一部格斗游戏但却无从着手呢?是否你只因游戏开发好玩而对之感兴趣?本文我们将分析一个通用的跨平台游戏引擎,每个游戏开发新手都可以自由地使用它。
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-117(见图1)的开发引擎。事实上,513游戏的当前开发已经基于SDML引擎而且被注册到了SDML的主页。
图1.GL-117中的一个视图3. 通道视觉效果演示程序
研究游戏引擎的最好方法是看一些示例程序代码。简单地看一下图2中用SDML实现的2D通道类型演示图,你就能发现你仅用几行代码所能完成的工作。你可以使用该实例作为一个保护屏程序,音乐可视化动画效果,等等。篇幅所限,我已经整理了实际的绘制代码。请跟随我的注释分析下面对SDML的工作原理的描述:
#include "Tunnel.h"
// SDL 相关变量定义
SDL_Su易做图ce *screen,*bBuffer,*Image;
SDL_Rect rScreen,rBuffer;
int main (int argc, char **argv)
{
int flag = SDL_SWSURFACE;// 请求一个软件表面.
//软件表面处于系统内存中,
// 一般不如硬件表面速度快
#ifdef WIN32
int fullscreen = MessageBox(NULL, "Show Full 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_CreateRGBSu易做图ce( 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_ConvertSu易做图ce(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_LockSu易做图ce(bBuffer);
SDL_LockSu易做图ce(Image);
Tunnel.Draw(bBuffer, Image, 180*sin(fTime), fTime*100);
SDL_UnlockSu易做图ce(bBuffer); // 在更新以后你可以开锁
SDL_UnlockSu易做图ce(Image);
// 把缓冲区中的数据输出到屏幕绘图区域并易做图进行重画
SDL_BlitSu易做图ce( 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,但是通过参观他们广阔的开发站点(http://www.allegro.cc/),你能学习怎样把OpenGL集成到Allegro游戏程序中。
大约有700种不同的游戏工程,与Allegro一起发行,其中最为杰出的两类是街机游戏和谜题游戏。我特别地喜欢经典的街机游戏Zaxxon(见图3)的重制品。
图3.酷毙的Zaxxon的重制品b) Irrlicht:点燃快速实时的3D引擎
这个Irrlicht 引擎是一个跨平台,高性能实时引擎,用C++写成。你可以选择Direct3D,OpenGL或基于软件的着色技术。高端特点包括动态阴影,粒子系统,人物动画,进门和出门技术和碰撞检测(见图4)。Irrlicht支持Windows和Linux并提供到语言Java,Perl,Ruby等的绑定。业界先驱Nikolaus Gebhardt在他的朋友的少部分帮助下完成的这个引擎工。
图4.在Irrlicht中的一个十分逼真的场景c) ClanLib:为多玩家游戏设计的引擎
ClanLib提供了一个平易做图立的接口来书写游戏-它们有一个共同的到低级库如DirectX和OpenGL的接口。借助于ClanLib,你只需编写少量代码即可在Windows,Linux和OSX系统上开发游戏程序。ClanLib包括一个广泛的声音库,2D碰撞检测,动画,GUI框架和网络库。图5显示了游戏XenoHammer中的一个场景。
补充:综合编程 , 安全编程 ,