设为首页 加入收藏

TOP

用C++实现跨平台游戏引擎开发(一)
2014-11-23 20:29:17 】 浏览:784
Tags:实现 跨平台 游戏 引擎 开发

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


  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的主页。


  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();
}


  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)的重制品。


  b) Irrlicht:点燃快速实时的3D引擎


  这个Irrlicht 引擎是一个跨平台,高性能实时引擎,用C++写成。你可以选择Direct3D,OpenGL或基于软件的着色技术。高端特点包括动态阴影,粒

首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇C++实现用掌上电脑遥控电视 下一篇用C++Builder为计算机增加启动日志

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目