用C++实现跨平台游戏引擎开发

原创
2017/01/18 12:02
阅读数 85

你是否梦想写一部格斗游戏但却无从着手呢?是否你只因游戏开发好玩而对之感兴趣?本文我们将分析一个通用的跨平台游戏引擎,每个游戏开发新手都可以自由地使用它。

  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_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 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_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,但是通过参观他们广阔的开发站点([url]http://www.allegro.cc/[/url]),你能学习怎样把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中的一个场景。
 


图5.XenoHammer屏幕快照

 

登录乐搏学院官网http://www.learnbo.com/

或关注我们的官方微博微信,还有更多惊喜哦~

 

本文出自 “青峰” 博客,转载请与作者联系!

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部