毕业论文 3D游戏设计.doc_第1页
毕业论文 3D游戏设计.doc_第2页
毕业论文 3D游戏设计.doc_第3页
毕业论文 3D游戏设计.doc_第4页
毕业论文 3D游戏设计.doc_第5页
已阅读5页,还剩26页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

3D游戏设计与开发基于DXUT应用程序框架的DirectX开发3D游戏设计与开发基于DXUT应用程序框架的DirectX开发 【摘要】视频游戏产业在娱乐业所占的比例越来越大,根据美国去年的调查显示,2009至2010年美国的电子游戏产业的营业额已经超过了好莱坞的电影票房收入。可以看出这个市场有着巨大的潜力,当然在我国也不例外。但是由于种种已知原因,这个行业在我国还处于比较落后的局面,缺乏各种核心的技术,尤其是当游戏引擎这种集软件行业顶尖智慧于一身的开发形式面世后,大大加速了各种游戏的开发效率。而大部分的游戏引擎技术都掌握在欧美手里,这种软件的开发难度又不亚于操作系统的编写难度,几家核心游戏引擎的开发商也因此大大的赚了个盆丰钵满。既然要为了这个远大的目标而奋斗,一个基于DirectX技术所开发的3D游戏实验性项目便成为了我这次的选题【关键词】游戏引擎;图形学;自主开发 DirectX1 引言1.1 现今游戏市场背景从某种意义上来说,电子游戏这的开发市场主要以欧美一些主流游戏开发商为主,包括了市面上现在流行的单机或网络游戏都是如此,国内市场鲜有沾光。造成这种局面的原因比较复杂,一是国内在计算机专业领域起步非常晚,尤其是计算机娱乐和多媒体这个领域更是如此,二是国内的游戏市场始终打不开局面。在PC平台上的单机游戏正热火朝天的时候,国内其实也有点这种乘胜追击的势头,比如当年以仙剑为主的一系列武侠RPG游戏也给了我们这一代人不少少年时候的美好回忆。可惜当时国内的单机游戏市场黯淡无光的主要原因是因为被盗版这个始终挥之不去的毒瘤给毁了,国内游戏制作人只能看着国外的同行们一个一个的成为百万富翁,而自己却只能改行或者默默的成为角落里的角色而暗自悲哀。可到了网游盛行的年代,虽然制作以及技术核心以国外为主的局面仍然没有大的改观,但是国内网游制作商以国内玩家这个特殊的游戏群体,以及其巨大的市场潜在价值为基础,以投机取巧的商业运营方式,还是能在这个大蛋糕上赚得一部分份额的。1.2 解决的办法但是问题始终是问题,不能因为其能赚钱而忽略了国内游戏制作商缺乏核心技术的巨大漏洞。如果说现在的国内游戏市场靠着大部分休闲/非核心玩家的大量涌入的道具收费方式得意谋取利润的话,那么到了若干年后,主流游戏玩家们成长为核心游戏玩家,他们追求游戏质量,游戏可玩性,而不是现今的泡菜游戏博一一乐的游戏理念,那么这种打一枪换一个地方的游戏运营方式和理念迟早都是要被淘汰在历史之中的。所以,要培养国内自己的核心游戏开发团队和游戏人才输出现在来说是一个非常有前瞻性并且大胆的人才投资方向。1.3DirectX的优势DirectX 在过去的数十载中已经逐步稳固的进化为游戏开发者们在微软的Windows平台上开发游戏的首选开发接口。每一代的DirectX都带来为新的硬件提供的图形加速支持,使得游戏开发人员能以惊人的速度前进着。图1 利用DirectX制作的逼真的游戏场景DirectX有着多种开发接口,Direct 3D是基于HAL硬件加速的图形接口,DirectSound是声音接口,DirectInput可以用与微软自家的游戏机Xbox的输入系统等等。DirectX很底层,但是也很强大,利用它几乎可以制作所以令人乍舌的视觉效果和性能卓越的精彩游戏。而且微软也在不断的更新着DirectX,使它支持更多的特效,更多的功能,更新的软硬件架构。在推动了游戏发展的同时,也成为了硬件市场发展的强心针,在为玩家带来了快乐的同时,也为商家带来了更多利润。2 本毕业设计所开发的游戏2.1 第三人称跟随视角类游戏图2 著名的TPS战争机器TPS(第三人称射击)游戏是我个人比较喜欢的类型,第三人称跟随视角的游戏一般比较适合做ARPG或者MMORPG游戏,玩家的视角被固定在自己的角色身后,这样可以随时看到自己的人物的装扮,以产生一种满足感。相对于第一人称射击类游戏来说,可以看到自己身边和身后的一些状况,玩家能观察到自己角色流畅的动作,增加了游戏整体的流畅感与爽快感。对于快节奏的射击类游戏来说也是相当重要的环节。而且很重要的一点,第三人称跟随视角的动作类游戏不容易使有3D眩晕症的玩家头晕。所以第三人称视角适合用于做ARPG,MMORPG,TPS这几类游戏,也使得越来越多的网游厂商为了吸引更多核心/非核心玩家而采取第三人称视角,例如魔兽世界等游戏。图3 著名网游魔兽世界截图图4 游戏截图2.2 游戏简介图5 游戏失败画面游戏操作很简单,用只要用键盘就应付所有操作 W 向正前方前进 S 向后方后退 A 向左平移 D 向右平移 方向上 向上爬升 方向下 向下下降 方向左 向左旋转 方向右 向右旋转 空格 开炮游戏方式就是通过移动和旋转躲避敌人的子弹,然后向敌人开火击落他们。当击中敌机的时候敌机会死亡。你一共有4格生命值,当生命值被耗光时游戏结束。3具体设计部分3.1 DirectX SDK的安装与开发环境配置开发环境visual Studio 2010图形界面接口Direct SDK开发包(March 2009 & Jun 2010)语言C+图6 visual studio 2010开发界面3.2 游戏的架构大家都知道,计算机的显示器是平面的,也就是说是完全二维,那么要如何表现如同现实世界中的三维效果呢?期中最基本的原理即采用了透视。通俗的讲,透视是引入了现实世界中近大远小的视觉效果,对于计算机图形来说,即加入了场景深度的概念,当我们自带看到显示器上的图像时,便产生了错觉1。 3.2.1 游戏所采用的应用程序框架图7 DXUT框架DirectX提供了基础的图形接口,但使用起来非常繁琐,而且功能比较有限。DirectX提供了一个叫做DXUT(也称为sample framework)的应用程序框架,将一些重复的框架性代码封装起来作为应用程序框架,这样程序员就可以将更多精力投入到核心代码的开发,从而大大提高开发的效率。 1相较于DirectX API,使用DXUT框架有许多方便之处。代码的简洁性,程序结构的层次性,处理消息循环,处理设备事件等。DXUT像windows的窗体一样,使用事件回调的机制,也就是说将DirectX里的渲染当作一些事件来处理,对于不同的事件回调使用不同的回调函数。表1 一些必要的DXUT回调函数bool CALLBACK IsDeviceAcceptable()设备能力检查bool CALLBACK ModifyDeviceSettings()修改Direct3D渲染设备设置HRESULT 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创建框架打开DirectX Sample Browser,找到EmptyProject,点击Install Project,选择保存路径点确定,然后用visual studio打开工程图8 sample browser这个框架可以直接被编译生成一个窗口。因为除了渲染场景的OnFrameRender()以外其他回调函数体内都是空的,所以这个窗口相当于一个”hello world”窗口。图9 空白的窗口像所有其他C+的窗口程序一样,DirectX的程序也需要一个主函数作为函数入口函数定义如下INT WINAPI WinMain( HINSTANCE, HINSTANCE, LPSTR, int )#if defined(DEBUG) | defined(_DEBUG) _CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );#endif DXUTSetCallbackDeviceCreated( OnCreateDevice ); DXUTSetCallbackDeviceReset( OnResetDevice ); DXUTSetCallbackDeviceLost( OnLostDevice ); DXUTSetCallbackDeviceDestroyed( OnDestroyDevice ); DXUTSetCallbackMsgProc( MsgProc ); DXUTSetCallbackKeyboard( KeyboardProc ); DXUTSetCallbackFrameRender( OnFrameRender ); DXUTSetCallbackFrameMove( OnFrameMove ); DXUTSetCursorSettings( true, true ); InitApp();DXUTInit( true, true, true );DXUTCreateWindow( LNewGame ); DXUTCreateDevice( D3DADAPTER_DEFAULT, false, 0, 0, IsDeviceAcceptable, ModifyDeviceSettings ); DXUTMainLoop(); return DXUTGetExitCode();DXUT框架有着许多它自己的很好的特性也是我使用它的一大原因。其中支持一些DirectX自定义的控件得以在制作游戏时可以使用一些很方便的比如按钮,滑动条,文本框,下拉框这样的操作。为了支持控件,需要添加一个回调函数OnGUIEvent();函数原型如下void CALLBACK OnGUIEvent( UINT nEvent, int nControlID, CDXUTControl* pControl, void* pUserContext )图10 控件使用效果图使用控件后,可以在游戏内添加按钮,以完全可视化的操作方式来设计游戏的UI界面,让交互变得不再生硬。图11 DXUT即时文本效果3.3 程序逻辑程序从主函数入口进入,第一部先初始化全局变量:检查设备可用性:bool CALLBACK IsD3D9DeviceAcceptable( D3DCAPS9* pCaps, D3DFORMAT AdapterFormat, D3DFORMAT BackBufferFormat, bool bWindowed, void* pUserContext )接着把当前设备修改为默认设备,此函数也为回调函数:bool CALLBACK ModifyDeviceSettings( DXUTDeviceSettings* pDeviceSettings, void* pUserContext )创建设备,如切换全屏,或者其他属性时调用此函数来设置设备属性。在此创建的资源在OnDestroyDevice()函数中销毁:HRESULT CALLBACK OnD3D9CreateDevice( IDirect3DDevice9* pd3dDevice, const D3DSURFACE_DESC* pBackBufferSurfaceDesc, void* pUserContext )重置设备,此回调函数在每次变换设备属性的时候都会被调用,在此创建的资源在OnLostDevice()函数中销毁:HRESULT CALLBACK OnD3D9ResetDevice( IDirect3DDevice9* pd3dDevice, const D3DSURFACE_DESC* pBackBufferSurfaceDesc, void* pUserContext )游戏事件循环,在此进行游戏所有事件的循环检测,以每一帧为更新场景的检测单元,不过最好不要在这里对场景渲染:void CALLBACK OnFrameMove( double fTime, float fElapsedTime, void* pUserContext )游戏渲染,对图形渲染,包括顶点,光照,纹理,界面,等的函数,以帧为单位更新帧缓冲器的所有数据:void CALLBACK OnD3D9FrameRender( IDirect3DDevice9* pd3dDevice, double fTime, float fElapsedTime, void* pUserContext )用于销毁在OnResetDevice()中创建的资源:void CALLBACK OnD3D9LostDevice( void* pUserContext )用于销毁在OnCreateDevice()中创建的资源:void CALLBACK 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(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)srand(timeGetTime();HWND hWnd;MSG msg;IDirect3DDevice9 *Device;CGameEngine_App *GameEngine_App = new CGameEngine_App;GameEngine_App-InitD3D(&Device,Game,hInstance,(int)width,(int)height, true);hWnd = GameEngine_App-GetHWnd();GetWindowRect(hWnd, &rect);Game *game = new Game(Device, hWnd, hInstance);while(true)if(PeekMessage(&msg,NULL,0,0,PM_REMOVE)if(msg.message = WM_QUIT)break;TranslateMessage(&msg);DispatchMessage(&msg);game-GameRun(Device);UnregisterClass(game,hInstance);return true;这是一个理想的游戏循环入口,它包括了设备的创建,各种内存变量的初始化,应用程序窗口的创建,游戏对象的创建,游戏内部的循环开始,消息的循环等一系列基本过程,十分言简意赅。当然这只是一个模型,伪代码,游戏真正的游戏事件并不是基于这个框架的,但是用这个例子可以将制作游戏的整体思路表达的很清晰明了,在使用DirextX自带的框架时可以更加得心应手。3.4.1 全局变量的声明ID3DXFont* g_pFont = NULL; / 用来建立窗口上的字体ID3DXSprite* g_pTextSprite = NULL; /用来加快窗口上的字体输出ID3DXEffect* g_pEffect = NULL; /D3DX响应接口bool g_bShowHelp = true; /用来决定是否显示窗口上的Help的字CDXUTDialogResourceManager g_DialogResourceManager; / 共享资源对话框管理器CD3DSettingsDlg g_SettingsDlg; / 设备设置对话框CDXUTDialog g_HUD; /控制窗口上右上角3特按钮CDXUTDialog g_SampleUI; /控制窗口右下角其他的UIFLOATg_yaw_angle;/绕y轴旋转角ID3DXMatrixStack*g_pHeroMat;/存储转换矩阵的栈Hero*g_pHero;/主角模型CMesh*g_pFloor;/地板CBoxsky*g_pSky;/天空盒子Snow*snow;/雪花Enemy*g_pEnemyEnemyNum;/敌人Game*game; /判断游戏事件变量D3DXMATRIXg_pHeromatWorld;/主角世界矩阵UserInputg_UserInput;/存储玩家输入的结构D3DXVECTOR3g_HeroPos;/主角三维位置boolgameover;/游戏失败boolwin;/胜利inthit;/被击中的敌机数量WCHAR g_strShow100;全局变量的声明包括了很多方面变量的创建,控制游戏事件检测的布尔型变量gameover,当它被声明为false时表明游戏尚未结束,渲染正常的游戏画面,反之则渲染游戏结束时的画面;g_pHeromatWorld是一个D3DXMATRIX的4*4阶矩阵类型变量,用来存储世界矩阵变换;g_HeroPos是一个D3DXVECTOR3的3维向量变量,存放一个向量值,代表了主角在三维世界里的方向和位置。3.4.2 游戏状态初始化 g_SettingsDlg.Init( &g_DialogResourceManager ); g_HUD.Init( &g_DialogResourceManager ); g_SampleUI.Init( &g_DialogResourceManager ); g_HUD.SetCallback( OnGUIEvent ); int iY = 10; g_HUD.AddButton( IDC_TOGGLEREF, LToggle REF (F3), 35, iY += 94, 125, 22 ); g_HUD.AddButton( IDC_CHANGEDEVICE, LChange device (F2), 35, iY += 24, 125, 22, VK_F2 ); g_SampleUI.SetCallback( OnGUIEvent ); iY = 10; g_HeroPos.x = 0.0f;g_HeroPos.y = 5.5f;g_HeroPos.z = 12.0f;g_yaw_angle = 0.0f;gameover= false;win=false;hit=0;InitApp()函数主要使一些游戏画面的初始数据进行初始化更新,如: 控件指针的初始化 界面的文字显示 按钮控件的初始化 角色模型的定位 方向的设置 游戏失败判断的初始化为否 游戏胜利判断初始化为否等一系列操作。3.4.3 设备参数创建HRESULT CALLBACK OnCreateDevice( IDirect3DDevice9* pd3dDevice, const D3DSURFACE_DESC* pBackBufferSurfaceDesc, void* pUserContext )函数主要对一些设备分配内存空间,还有为游戏对象分配内存空间g_pHero = new Hero();for(int i = 0;i SetMaterial(&mtrl);设定世界矩阵以及初始化 D3DXMATRIX matIdentity; D3DXMatrixIdentity(&matIdentity); pd3dDevice-SetTransform(D3DTS_WORLD,&matIdentity);设定投影的相关信息,以决定窗口的视野范围 D3DXMATRIX matProj; FLOAT fAspect = (FLOAT)pBackBufferSurfaceDesc-Width)/pBackBufferSurfaceDesc-Height; D3DXMatrixPerspectiveFovRH(&matProj,D3DX_PI/4,fAspect,1.0f,100000.0f); pd3dDevice-SetTransform(D3DTS_PROJECTION,&matProj);光源的渲染模式将贴图表面的渲染模式用SetTextureStageState()函数来定义。这里使用了多重纹理的渲染模式。pd3dDevice-SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_SELECTARG1);pd3dDevice-SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE );pd3dDevice-SetSamplerState( 0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR ); pd3dDevice-SetSamplerState( 0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR ); pd3dDevice-SetRenderState(D3DRS_DITHERENABLE,FALSE);是否需要激活颜色补差法来着色pd3dDevice-SetRenderState(D3DRS_SPECULARENABLE,FALSE);是否开启 高光 效果,也就是当物体被光源直射时,是否产生反射的光亮效果pd3dDevice-SetRenderState(D3DRS_ZENABLE,TRUE);是否激活顶点坐标深度值的判断功能pd3dDevice-SetRenderState(D3DRS_AMBIENT,0x000F0F0F);在真实世界中,光线在到达眼睛之前经过了物体表面的多次反射,每次反射时,物体表面都会吸收一些光,有些被随机反射扩散出去,其余的到达下一个物体的表面或眼睛。真实世界中光线反射的效果就是光线跟踪算法需要模拟实现的。尽管光线跟踪算法能够创建非常逼真的与自然界中观察到的几乎相似的景象,但是还没有实时程序能够完成这些运算。考虑到实时渲染的需要,Direct3D使用更简单的方法进行光照计算。Direct3D光照计算模型包括4种:环境光、漫反射光、镜面反射光和自发光。它们的结合能灵活高效地解决三维图形程序中的光照问题。当然,程序员也完全可以编写自己的光照计算模型,来进行光照计算9。坐标变换和光照处理一起构成了Direct3D的渲染过程:顶点坐标变换和光照流水线。正式五彩斑斓的光和影,带给了这个世界魅力的色彩,它对我们的3D图形程序同样如此3。设定环境光源的颜色值D3DLIGHT9 light; D3DXVECTOR3 vecLightDirUnnormalized(-1.0f,-1.0f,-2.0f); ZeroMemory(&light,sizeof(D3DLIGHT9); light.Type = D3DLIGHT_DIRECTIONAL; light.Diffuse.r = 1.0f; light.Diffuse.g = 1.0f; light.Diffuse.b = 1.0f; D3DXVec3Normalize(D3DXVECTOR3*)&light.Direction,&vecLightDirUnnormalized); pd3dDevice-SetLight(0,&light); pd3dDevice-LightEnable(0,TRUE); pd3dDevice-SetRenderState(D3DRS_LIGHTING,TRUE);剔除不计算顺时针方向的面 pd3dDevice-SetRenderState(D3DRS_CULLMODE,D3DCULL_CW);初始化主角的网格模型和贴图g_pHero-InitGeometry(pd3dDevice);初始化敌机的网格模型,和出生点位。出生点为随机数生成,和主角距离一段位置。for(int i = 0;i InitGeometry(pd3dDevice);srand(GetTickCount();g_pEnemyi-Position._41 = float(rand() % 10) * 0.1f*2600.0f-1300.0f);g_pEnemyi-Position._42 = float(rand() % 10000) * 0.0001f*10.0f);g_pEnemyi-Position._43 = float(rand() % 10) * 0.1f*2600.0f-1300.0f)if(g_pEnemyi-Position._41*g_pEnemyi-Position._41+g_pEnemyi-Position._43*g_pEnemyi-Position._43 3.0f)y_step-= 100*fElapsedTime;else if (g_UserInput.bUp&!g_UserInput.bDown)if(g_HeroPos.y Update(fElapsedTime,g_HeroPos);直观的说,我们知道物体的“方位”主要描述的是物体的朝向。然而,“方向”和“方位”并不完全一样。向量有“方向”但没有“方位”,区别在于,当一个向量指向特定方向时,可以让向量自转,但向量(或者说它的方向)却不会有任何变化,因为向量的属性只有“大小”,而没有“厚度”和“宽度”。 然而当一个物体超像特定的方向时,让它和上面的向量一样自转,就会发现物体的方位改变了。从技术角度来讲,这就说明在3D中,只要用两个数字(例如极坐标)就能用参数表示一个方向(direction)。但是要确定一个方位(orientation),却至少需要三个数字。我们知道不能用绝对坐标来描述物体的位置,要描述物体的位置,必须把物体放置于特定的参考系中。描述位置实际上就是描述相对于给定参考点(通常是坐标系的原点)的位移。同样,描述物体方位时,也不能使用绝对量。与位置只是相对一直点的位移一样,方位是通过于相对已知方位(通常称为“单位”方位或“源”方位)的旋转来描述的。旋转的量称作角位移。换句话说,在数学上描述方位就等价于描述角位移4。在OnFrameMove()中还有两个重要的并列循环,用于检测子弹是否击中(主角有没有击中敌机、敌机是否击中主角)for(int j = 0;j Update(g_pHeromatWorld._43,g_pHeromatWorld._42, g_pHeromatWorld._41,fElapsedTime);/判断Hero的粒子枪是否击中Enemyfor(int i = 0 ;i Guni-live)if(g_pEnemyj-alive)if(g_pEnemyj-InBox(D3DXVECTOR3(g_pHero-Guni-position._41,g_pHero-Guni-position._42,g_pHero-Guni-position._43)hit+;if(hit=EnemyNum)win=true;g_pEnemyj-alive = false;/敌机死亡g_pEnemyj-Expl-live = true;/爆炸效果g_pEnemyj-Expl-g_matparticle = g_pHero-Guni-position;g_pHero-Guni-live = false;/粒子枪死亡g_pHero-Guni-lifeTime = 0.0f; /重置粒子枪存活时间 g_pHero-fireNum-;/已发射的子弹数目减1/判断Hero是否被粒子枪击中if(g_pEnemyj-Gun-live)if(g_pHero-InBox(D3DXVECTOR3(g_pEnemyj-Gun-position._41,g_pEnemyj-Gun-position._42,g_pEnemyj-Gun-position._43),g_pHeromatWorld)g_pHero-Health -= 0.25f;if(g_pHero-Health HpChange = true;g_pEnemyj-Gun-live = false;g_pEnemyj-Gun-lifeTime = 0.0f;图15 绿色的小点发射的子弹3.4.6 帧渲染图 16 OnFrameRender内的循环当每更新完一次数据,GPU就会对所有表面缓冲里的数据进行一次渲染 BeginScene()开始场景,属于pd3dDevice对象的方法 判断游戏是否结束!gameover,若结束,则渲染gameover.bmp,若没有,则继续 判断游戏是否达到胜利判定,若胜利,则渲染win.bmp画面,若没有,则正常渲染场景 EndScene()结束场景,和BegineScene()配套使用3.4.7 消息处理LRESULT CALLBACK MsgProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, bool* pbNoFurtherProcessing, void* pUserContext )消息处理函数主要处理的是来自外部信息的输入,比如输入输出设备的消息等这是处理这一段是回调DXUT控件的消息映射。 *pbNoFurtherProcessing = g_DialogResourceManager.MsgProc( hWnd, uMsg, wParam, lParam ); if( *pbNoFurtherProcessing ) return 0; if( g_SettingsDlg.IsActive() ) g_SettingsDlg.MsgProc( hWnd, uMsg, wParam, lParam ); return 0; *pbNoFurtherProcessing = g_HUD.MsgProc( hWnd, uMsg, wParam, lParam ); if( *pbNoFurtherProcessing ) return 0; *pbNoFurtherProcessing = g_SampleUI.MsgProc( hWnd, uMsg, wParam, lParam ); if( *pbNoFurtherProcessing ) return 0;这一段是回馈由输入输出设备的响应。在这个程序中,输入输出设备主要是键盘,所以编写的都是反应键盘事件的消息回调。switch(uMsg) case WM_KEYDOWN: if(wParam = 0x20) /如果按下空格键g_pHero-fire = true;/开火 break;case WM_KEYUP:if(wParam = 0x20) g_pHero-fire = false; break; 3.5 一些主要的类本项目编写的与游戏相关的所有类型。包括: 主角 敌人 主角武器 敌人武器 UI界面类 CMESH蒙皮骨骼类 天空盒子 游戏的判定为了使游戏更加丰富多彩,添加更多的特效类型: 爆炸效果 雪花粒子3.5.1 游戏判定class Gamepublic:Game(void);Game(void);public:HRESULT Init(IDirect3DDevice9* pd3dDevice);HRESULT LoseRender(IDirect3DDevice9* pd3dDevice,D3DXMATRIX Pos);HRESULT WinRender(IDirect3DDevice9* pd3dDevice,D3DXMATRIX Pos);public:LPDIRECT3DVERTEXBUFFER9 g_pVB;LPDIRECT3DTEXTURE9 g_pTextureLose;LPDIRECT3DTEXTURE9 g_pTextureWin;这个类型专门用于判定游戏是否进入胜利或者失败的画面。关键的函数是:HRESULT LoseRender(IDirect3DDevice9* pd3dDevice,D3DXMATRIX Pos);HRESULT WinRender(IDirect3DDevice9* pd3dDevice,D3DXMATRIX Pos);这两个函数的完全一样,只不过调用的贴图不同,所以为了节省运行时的内存空间,多写了一个函数。这两个函数用于渲染一张胜利(失败)时的贴图:HRESULT Game:LoseRender(IDirect3DDevice9* pd3dDevice,D3DXMATRIX Pos)/获取世界矩阵D3DXMATRIX oldMat;pd3dDevice-GetTransform(D3DTS_WORLD,&oldMat);/设置新的世界矩阵D3DXMATRIX m;m = Pos;D3DXMATRIX mm;D3DXMatrixIdentity(&mm);D3DXMatrixTranslation(&mm,0.0f,8.0f,0.0f);D3DXMatrixMultiply(&m,&mm,&m);pd3dDevice-SetTransform(D3DTS_WORLD,&m);/设置设备属性pd3dDevice-SetRend

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论