毕业论文 3D游戏设计.doc
《毕业论文 3D游戏设计.doc》由会员分享,可在线阅读,更多相关《毕业论文 3D游戏设计.doc(31页珍藏版)》请在点石文库上搜索。
1、3D游戏设计与开发基于DXUT应用程序框架的DirectX开发3D游戏设计与开发基于DXUT应用程序框架的DirectX开发 【摘要】视频游戏产业在娱乐业所占的比例越来越大,根据美国去年的调查显示,2009至2010年美国的电子游戏产业的营业额已经超过了好莱坞的电影票房收入。可以看出这个市场有着巨大的潜力,当然在我国也不例外。但是由于种种已知原因,这个行业在我国还处于比较落后的局面,缺乏各种核心的技术,尤其是当游戏引擎这种集软件行业顶尖智慧于一身的开发形式面世后,大大加速了各种游戏的开发效率。而大部分的游戏引擎技术都掌握在欧美手里,这种软件的开发难度又不亚于操作系统的编写难度,几家核心游戏引擎
2、的开发商也因此大大的赚了个盆丰钵满。既然要为了这个远大的目标而奋斗,一个基于DirectX技术所开发的3D游戏实验性项目便成为了我这次的选题【关键词】游戏引擎;图形学;自主开发 DirectX1 引言1.1 现今游戏市场背景从某种意义上来说,电子游戏这的开发市场主要以欧美一些主流游戏开发商为主,包括了市面上现在流行的单机或网络游戏都是如此,国内市场鲜有沾光。造成这种局面的原因比较复杂,一是国内在计算机专业领域起步非常晚,尤其是计算机娱乐和多媒体这个领域更是如此,二是国内的游戏市场始终打不开局面。在PC平台上的单机游戏正热火朝天的时候,国内其实也有点这种乘胜追击的势头,比如当年以仙剑为主的一系列
3、武侠RPG游戏也给了我们这一代人不少少年时候的美好回忆。可惜当时国内的单机游戏市场黯淡无光的主要原因是因为被盗版这个始终挥之不去的毒瘤给毁了,国内游戏制作人只能看着国外的同行们一个一个的成为百万富翁,而自己却只能改行或者默默的成为角落里的角色而暗自悲哀。可到了网游盛行的年代,虽然制作以及技术核心以国外为主的局面仍然没有大的改观,但是国内网游制作商以国内玩家这个特殊的游戏群体,以及其巨大的市场潜在价值为基础,以投机取巧的商业运营方式,还是能在这个大蛋糕上赚得一部分份额的。1.2 解决的办法但是问题始终是问题,不能因为其能赚钱而忽略了国内游戏制作商缺乏核心技术的巨大漏洞。如果说现在的国内游戏市场靠
4、着大部分休闲/非核心玩家的大量涌入的道具收费方式得意谋取利润的话,那么到了若干年后,主流游戏玩家们成长为核心游戏玩家,他们追求游戏质量,游戏可玩性,而不是现今的泡菜游戏博一一乐的游戏理念,那么这种打一枪换一个地方的游戏运营方式和理念迟早都是要被淘汰在历史之中的。所以,要培养国内自己的核心游戏开发团队和游戏人才输出现在来说是一个非常有前瞻性并且大胆的人才投资方向。1.3DirectX的优势DirectX 在过去的数十载中已经逐步稳固的进化为游戏开发者们在微软的Windows平台上开发游戏的首选开发接口。每一代的DirectX都带来为新的硬件提供的图形加速支持,使得游戏开发人员能以惊人的速度前进着
5、。图1 利用DirectX制作的逼真的游戏场景DirectX有着多种开发接口,Direct 3D是基于HAL硬件加速的图形接口,DirectSound是声音接口,DirectInput可以用与微软自家的游戏机Xbox的输入系统等等。DirectX很底层,但是也很强大,利用它几乎可以制作所以令人乍舌的视觉效果和性能卓越的精彩游戏。而且微软也在不断的更新着DirectX,使它支持更多的特效,更多的功能,更新的软硬件架构。在推动了游戏发展的同时,也成为了硬件市场发展的强心针,在为玩家带来了快乐的同时,也为商家带来了更多利润。2 本毕业设计所开发的游戏2.1 第三人称跟随视角类游戏图2 著名的TPS战
6、争机器TPS(第三人称射击)游戏是我个人比较喜欢的类型,第三人称跟随视角的游戏一般比较适合做ARPG或者MMORPG游戏,玩家的视角被固定在自己的角色身后,这样可以随时看到自己的人物的装扮,以产生一种满足感。相对于第一人称射击类游戏来说,可以看到自己身边和身后的一些状况,玩家能观察到自己角色流畅的动作,增加了游戏整体的流畅感与爽快感。对于快节奏的射击类游戏来说也是相当重要的环节。而且很重要的一点,第三人称跟随视角的动作类游戏不容易使有3D眩晕症的玩家头晕。所以第三人称视角适合用于做ARPG,MMORPG,TPS这几类游戏,也使得越来越多的网游厂商为了吸引更多核心/非核心玩家而采取第三人称视角,
7、例如魔兽世界等游戏。图3 著名网游魔兽世界截图图4 游戏截图2.2 游戏简介图5 游戏失败画面游戏操作很简单,用只要用键盘就应付所有操作 W 向正前方前进 S 向后方后退 A 向左平移 D 向右平移 方向上 向上爬升 方向下 向下下降 方向左 向左旋转 方向右 向右旋转 空格 开炮游戏方式就是通过移动和旋转躲避敌人的子弹,然后向敌人开火击落他们。当击中敌机的时候敌机会死亡。你一共有4格生命值,当生命值被耗光时游戏结束。3具体设计部分3.1 DirectX SDK的安装与开发环境配置开发环境visual Studio 2010图形界面接口Direct SDK开发包(March 2009 & Ju
8、n 2010)语言C+图6 visual studio 2010开发界面3.2 游戏的架构大家都知道,计算机的显示器是平面的,也就是说是完全二维,那么要如何表现如同现实世界中的三维效果呢?期中最基本的原理即采用了透视。通俗的讲,透视是引入了现实世界中近大远小的视觉效果,对于计算机图形来说,即加入了场景深度的概念,当我们自带看到显示器上的图像时,便产生了错觉1。 3.2.1 游戏所采用的应用程序框架图7 DXUT框架DirectX提供了基础的图形接口,但使用起来非常繁琐,而且功能比较有限。DirectX提供了一个叫做DXUT(也称为sample framework)的应用程序框架,将一些重复的框
9、架性代码封装起来作为应用程序框架,这样程序员就可以将更多精力投入到核心代码的开发,从而大大提高开发的效率。 1相较于DirectX API,使用DXUT框架有许多方便之处。代码的简洁性,程序结构的层次性,处理消息循环,处理设备事件等。DXUT像windows的窗体一样,使用事件回调的机制,也就是说将DirectX里的渲染当作一些事件来处理,对于不同的事件回调使用不同的回调函数。表1 一些必要的DXUT回调函数bool CALLBACK IsDeviceAcceptable()设备能力检查bool CALLBACK ModifyDeviceSettings()修改Direct3D渲染设备设置HR
10、ESULT CALLBACK OnCreateDevice()创建管理内存资源对象HRESULT CALLBACK OnResetDevice()创建默认内存类型资源对象void CALLBACK OnFrameMove()更新场景void CALLBACK OnFrameRender()渲染场景LRESULT CALLBACK MsgProc()消息处理void CALLBACK OnLostDevice()释放在OnResetDevice()中创建的资源和对象void CALLBACK OnDestroyDevice()释放在OnCreateDevice()中创建的资源和对象3.2.2创建
11、框架打开DirectX Sample Browser,找到EmptyProject,点击Install Project,选择保存路径点确定,然后用visual studio打开工程图8 sample browser这个框架可以直接被编译生成一个窗口。因为除了渲染场景的OnFrameRender()以外其他回调函数体内都是空的,所以这个窗口相当于一个”hello world”窗口。图9 空白的窗口像所有其他C+的窗口程序一样,DirectX的程序也需要一个主函数作为函数入口函数定义如下INT WINAPI WinMain( HINSTANCE, HINSTANCE, LPSTR, int )#i
12、f defined(DEBUG) | defined(_DEBUG) _CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );#endif DXUTSetCallbackDeviceCreated( OnCreateDevice ); DXUTSetCallbackDeviceReset( OnResetDevice ); DXUTSetCallbackDeviceLost( OnLostDevice ); DXUTSetCallbackDeviceDestroyed( OnDestroyDevice ); DXUTSetC
13、allbackMsgProc( MsgProc ); DXUTSetCallbackKeyboard( KeyboardProc ); DXUTSetCallbackFrameRender( OnFrameRender ); DXUTSetCallbackFrameMove( OnFrameMove ); DXUTSetCursorSettings( true, true ); InitApp();DXUTInit( true, true, true );DXUTCreateWindow( LNewGame ); DXUTCreateDevice( D3DADAPTER_DEFAULT, fa
14、lse, 0, 0, IsDeviceAcceptable, ModifyDeviceSettings ); DXUTMainLoop(); return DXUTGetExitCode();DXUT框架有着许多它自己的很好的特性也是我使用它的一大原因。其中支持一些DirectX自定义的控件得以在制作游戏时可以使用一些很方便的比如按钮,滑动条,文本框,下拉框这样的操作。为了支持控件,需要添加一个回调函数OnGUIEvent();函数原型如下void CALLBACK OnGUIEvent( UINT nEvent, int nControlID, CDXUTControl* pControl,
15、 void* pUserContext )图10 控件使用效果图使用控件后,可以在游戏内添加按钮,以完全可视化的操作方式来设计游戏的UI界面,让交互变得不再生硬。图11 DXUT即时文本效果3.3 程序逻辑程序从主函数入口进入,第一部先初始化全局变量:检查设备可用性:bool CALLBACK IsD3D9DeviceAcceptable( D3DCAPS9* pCaps, D3DFORMAT AdapterFormat, D3DFORMAT BackBufferFormat, bool bWindowed, void* pUserContext )接着把当前设备修改为默认设备,此函数也为回调
16、函数:bool CALLBACK ModifyDeviceSettings( DXUTDeviceSettings* pDeviceSettings, void* pUserContext )创建设备,如切换全屏,或者其他属性时调用此函数来设置设备属性。在此创建的资源在OnDestroyDevice()函数中销毁:HRESULT CALLBACK OnD3D9CreateDevice( IDirect3DDevice9* pd3dDevice, const D3DSURFACE_DESC* pBackBufferSurfaceDesc, void* pUserContext )重置设备,此回调
17、函数在每次变换设备属性的时候都会被调用,在此创建的资源在OnLostDevice()函数中销毁:HRESULT CALLBACK OnD3D9ResetDevice( IDirect3DDevice9* pd3dDevice, const D3DSURFACE_DESC* pBackBufferSurfaceDesc, void* pUserContext )游戏事件循环,在此进行游戏所有事件的循环检测,以每一帧为更新场景的检测单元,不过最好不要在这里对场景渲染:void CALLBACK OnFrameMove( double fTime, float fElapsedTime, void*
18、 pUserContext )游戏渲染,对图形渲染,包括顶点,光照,纹理,界面,等的函数,以帧为单位更新帧缓冲器的所有数据:void CALLBACK OnD3D9FrameRender( IDirect3DDevice9* pd3dDevice, double fTime, float fElapsedTime, void* pUserContext )用于销毁在OnResetDevice()中创建的资源:void CALLBACK OnD3D9LostDevice( void* pUserContext )用于销毁在OnCreateDevice()中创建的资源:void CALLBACK
19、OnD3D9DestroyDevice( void* pUserContext )消息事件循环,当窗口接受外部消息传入时,回调函数就会接受信息然后传给DirectX并处理给程序:LRESULT CALLBACK MsgProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, bool* pbNoFurtherProcessing, void* pUserContext )图12 一个最简单的流程,本游戏就是基于这个框架而接下来要做的,就是往框架内添加游戏所自定义的的代码。3.4 游戏事件循环详解int APIENTRY WinMain(
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 毕业论文 3D游戏设计 游戏 设计
