国内赛车发展现状和趋势毕业论文.doc_第1页
国内赛车发展现状和趋势毕业论文.doc_第2页
国内赛车发展现状和趋势毕业论文.doc_第3页
国内赛车发展现状和趋势毕业论文.doc_第4页
国内赛车发展现状和趋势毕业论文.doc_第5页
已阅读5页,还剩54页未读 继续免费阅读

下载本文档

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

文档简介

国内赛车发展现状和趋势毕业论文目录第一章 绪论11.1 研究背景11.2 国内外发展现状和趋势11.3 论文研究的主要内容2第二章 XNA概述42.1 XNA简介42.2 XNA功能42.3 XNA2D图形52.4 XNA3D图形62.5 XNA声音72.6 XNA纹理映射82.7 XNA摄像机92.8 XNA输入102.8.1Xbox 360控制器102.8.2键盘112.8.3鼠标112.9XNA光照112.9.1 XNA光照模型112.9.2 XNA中添加光照的一般步骤12第三章 3D赛车游戏开发133.1 典型游戏简介133.1.1 3D赛车游戏简介133.1.2应用程序模型133.2输入和用户界面153.2.1 Input类153.2.2Input类中的Update方法163.2.3游戏屏幕163.3摄像机管理183.3.1创建摄像机183.3.2旋转、移动摄像机193.3.3摄像机追踪效果203.3.4摄像机弹簧效果223.4碰撞检测与处理233.4.1赛车与公路边界的碰撞233.4.2赛车与路面的碰撞273.4.3赛车与赛车的碰撞283.5场景特效293.5.1三维光晕293.5.2场景颜色变化293.5.3 3D音效303.5.4雨、雪、雾323.6物理模型323.6.1重力323.6.2惯性343.6.3漂移343.7数据更新与存储353.7.1异步创建一个StorageDevice353.7.2将数据保存到磁盘363.7.3从磁盘加载数据373.8 3DMAX建模373.8.1总体场景373.8.2公路383.8.3单个景物383.8.4贴图要求393.8.5最终需要的文件393.9人工智能413.10其它413.10.1玩家档案管理413.10.2多种游戏模式413.10.3天空423.10.4地图雷达433.10.5速度计43第四章 程序运行测试454.1 程序运行截图454.2 关于运行结果的讨论54第五章 总结与展望55致谢56参考文献57青岛大学本科毕业论文(设计)第一章 绪论1.1 研究背景在电子游戏的发展历史进程中,3D游戏占据了举足轻重的地位。3D游戏以其栩栩如生的画面效果、声音、粒子、三维等特效而带给玩家一种全新的体验。建立在3D技术之上所构建的游戏世界,可以轻松地实现传统2D游戏所无法实现的效果,例如摄像机跟踪、镜头回旋、慢动作播放等推拉摇移的电影化效果,以及更加绚丽夺目的3D特技效果:例如焰火在炮口的爆炸、空气气浪的冲击、观察视野的雾化影响、现场感的雨雪气候变化等等。3D游戏虚构了真实的世界,并力图呈现出一个场景空间感强,有着动态视角、真实光源、全屏特效等融合在一起的亮丽画面。这将在视觉效果上极大地增强冲击力,引领玩家进入一个绮丽梦幻般的幻想空间。3D环境的建立,不仅在视觉效果上,更在游戏规则上带来突破,玩家需要面对的不再是一个平面,而需要在一个虚拟的立体环境中进行思考:玩家将置身于一个小型星球的球体地表之上,全方位地考虑如何在地表、天空中展开竞技比赛,并迎接来自于360度立体环境中的对手的挑战。游戏的变化丰富度,要远远超出传统的2D、2.5D画面表现下的前代产品。然而如何真实高效地渲染3D场景、构建完整的游戏模式成为广大3D游戏开发人员的难题。首先,3D游戏效果虽被人们熟知,但是想要使用某种常规方法来描述其形成,是不容易的。其次,3D游戏的种类多种多样,没有一种统一的方式对其描述。再次,创建物体模型,真实地展现它们,将需要大量的设计时间和存储空间,而且生成的景物有可能过于单调,与真实世界相差甚远。因此,急需一套完整的解决方案来开发3D游戏。美国微软于2006年 8 月 13 日发布针对业余创作者所设计的游戏开发套件XNA Game Studio Express,提供给使用者开发跨Xbox 360与PC平台游戏的管道。XNA是Microsoft的下一代软件开发平台,致力于帮助开发者更快地开发更好的游戏,使得3D游戏开发具有广泛的适应性。如今3D游戏受到人们狂热地追捧,游戏种类层出不穷,产业规模空前壮大,开发流程日趋成熟,玩家更是跨越了所有年龄群。不仅PC平台,手机、Web、PDA等众多平台都出现了相应的3D游戏,3D游戏在所有电子游戏中所占的比重越来越大。因此,国内外学者、工作室、游戏公司都十分热衷于对3D游戏的开发。使用的实现工具也多种多样,编程语言方面,有C、C+、C#、Java等;图形引擎方面有C图形、DirectX、OpenGL、XNA等;编程框架方面有MFC、.NET等;集成开发环境(IDE)方面,有Visual Studio、Eclipse等。本论文是使用XNA结合Visual C# Express 2005开发环境完成的3D赛车游戏开发。1.2 国内外发展现状和趋势游戏开发是高度的设计奇思。游戏设计是一门学问,它涉及的技术和知识太交叉、太综合。它包含众多单独的环节,最后还得把这些部分有机地结合起来。近年来,大型3D游戏制作已发展成为电子游戏开发的最高境界。大型3D游戏制作的一项重要标准就是对现实世界的仿真程度。在现实世界中,雨、烟雾、重力、碰撞等现象是人们所熟知的。然而,很少有人能够准确的描述出这些现象是什么样子。这就使在3D游戏中描述这些现象成为一大难题。目前人们对游戏的高期望导致游戏产品开发周期延长,投入剧增,负担不起沉重费用的中小开发商纷纷出局。同时,一款优秀游戏在多种平台上同时推出已经成为游戏开发商增加投资回报率的普遍做法。游戏在不同平台间相互移植的成本也一直居高不下,微软把业界这种状况归咎于没有一个强劲且标准统一的平台,他们宣称为所有游戏平台建立一套通用开发标准来有效降低门槛,减少成本。按照目前游戏开发的分工,要完成一款游戏必须兼顾绘图、物理运算、音效、网络、I/0输出入控制、计算机AI等不同范围的程控,这些完全不同的程序需求必须要用不同的工具来完成,所以不但程序人员要一一学会当个万能侠,对游戏公司而言不同资源的分散也增加游戏开发难度与研发成本(因为不同的软件包工具都所费不赀),所以微软愿意扮演火车头角色把这些绘图、物理运算、音效、网络等不同范围的程序完全整合在一个工具中,并提供最完善的函数库让游戏开发人员能学会使用、全盘了解,这就是XNA。XNA Game Studio是用于游戏开发的Visual Studio。这是一个集成的、基于团队的、为游戏产品量身定做的开发环境。今天的游戏团队都在努力地挑战日益复杂的内容需求、越来越大且越来越多的特殊团队、日渐复杂的工作流和不断增长的外部采购。XNA Studio将发布一个由统一的文件格式驱动的改进了的构建架构,并以此来解决工作流问题。该构建框架由一个集成的工具套装构成,能够为所有团队成员优化游戏生产流程。本项目构建于XNA技术。1.3 论文研究的主要内容本论文在全新的XNA平台上,大胆尝试最新的软件开发实践和方法,综合利用了重构、设计模式等先进的软件开发思想。本研究课题的最终目标是学习、分析、运用XNA技术和游戏开发技术进行3D赛车游戏的开发,并对XNA技术本身的不足和游戏开发中出现的问题、难点进行分析总结。为了实现这一目标,本研究课题选用Visual C# Express 2005为开发环境,以3DMAX为建模工具,构建基于XNA的3D游戏框架。整个研发过程解决如下技术问题:图形化用户界面摄像机管理碰撞检测与处理场景特效人工智能物理模型系统数据更新与存储3D模型建模文件管理与游戏发布软件环境如下:编程语言:C#软件集成开发环境:Visual C# Express 2005图形引擎:XNA操作系统平台:Windows XP SP3 x86硬件环境如下:CPU:Intel Pentium Dual T2370 1.73GHz主板:Intel PM 965显卡:nVIDIA GeForce 8400GS内存:DDR2 667MHz 2048MB X 2硬盘:120GB第二章 XNA概述2.1 XNA简介XNA技术是微软研发的下一代游戏开发平台,从2006年问世以来先后经历了XNA Game Studio Express、1.0、2.0、3.0、3.1、4.0供五个版本,最新版本可以支持在XBOX360、Windows OS、Windows Phone 7和ZUNE平台上快速地开发出优质的游戏。XNA技术以微软已获成功的游戏开发技术DirectX为基础,以微软发布的优秀IDE产品Visual Studio为开发环境,以微软公司研发并大力倡导的最新一代编程语言C#语言为编程语言,与微软公司下一代软件开发平台Net紧密结合。可以说XNA技术是软件开发领域巨头微软公司一切最新技术在游戏开发领域的一次大集合,该产品的研发和推广过程充分展示了微软公司进军游戏领域的决心。XNA技术的主要产品包含XNA Framework以及XNA Game Studio两部分。其中XNA Framework作为XNA技术的软件实现部分,同时融合了Net平台的先进技术和DirectX平台的工业界成功经验,为软件开发人员提供所需的帮助。而XNA Game Studio作为XNA技术的开发环境,在Visual Studio开发环境的基础上,针对游戏开发过程的特殊性,为游戏开发人员提供更为便捷、高效的开发体验。2.2 XNA功能真实感图形绘制是计算机图形学的一个重要组成部分,它综合利用数学、物理学、计算机科学和其它科学知识在计算机图形设备上生成的具有真实感的图形。一般说来,生成真实感图形须完成以下四个步骤:一是建模,即用一定的数学方法建立所需三维场景的几何描述;二是将三维几何模型经过一定变换转为二维平面透视投影图;三是运用隐藏面消隐算法将视域外或被遮挡住的不可见面消去;四是根据基于光照模型计算可见面投射到观察者眼中的光亮度大小和颜色分量,确定投影画面上每一象素的颜色,最终生成图形。生成具有真实感的图形的确是一个比较复杂的问题,但XNA已经为开发者完成了大部分的内容,开发者所做的只是在每个步骤中设定一些参数,使之能够完美并优雅地完成真实感图形的生成。为了方便开发者完成这项工作,XNA提供了以下七大功能:建模。XNA图形库除了提供基本的点、线、多边形的绘制函数外,还提供了复杂的三维物体(球、锥、多面体、茶壶等)以及复杂曲线和曲面绘制函数。变换。XNA的变换包括基本变换和投影变换。基本变换有平移、旋转、缩放等,投影变换有平行投影和透视投影两种。颜色模式设置。XNA颜色模式有两种,即RGBA模式和颜色索引。光照和材质设置。XNA光有辐射光、环境光、漫反射光和镜面光。场景中物体最终反映到人眼的颜色是光的红绿蓝分量与材质红绿蓝分量的反射率相乘后形成的颜色。纹理映射。利用XNA纹理映射功能可以十分逼真地表达物体表面细节。位图显示和图像增强:图像功能除了基本的拷贝和像素读写外,还提供融合、反走样和雾化等特殊图像效果处理。双缓存(Double Buffering)动画:双缓存即前台缓存和后台缓存,简而言之,后台缓存计算场景、生成画面,前台缓存显示后台缓存已画好的画面。2.3 XNA2D图形Sprite(即精灵)是取代3D空间而直接绘制在屏幕上的2D位图,通常用来显示一些玩家信息,如生命值或者得分。一些游戏,特别是早期的游戏,几乎全部由精灵组成。Sprite在屏幕上是按坐标定位的。 屏幕的宽和高和后台缓存是一样的,即如果屏幕为800x600的,那么后台缓存就是一个800x600x(每个像素所占的内存数)的大小的内存块。x轴表示屏幕的宽,y轴表示屏幕的高 。一定要注意y轴是从上到下递增的,而x轴是从左到右递增的。精灵原点:其实就是精灵中指定的一个点,这个点默认是在精灵的左上角(0,0)。Draw方法将使用指定的屏幕位置作为精灵的原点开始绘制。例如,当后台缓存是800x600时,(0,0)表示屏幕的左上角,(800,600)表示屏幕的右下角。如果开发者在没有为精灵指定一个原点(即使用默认原点)的情况下在(400,200)的位置绘制一个50x50像素的精灵,这个精灵的左上角将会在屏幕的(400,200)处。如果开发者使用50x 50精灵的中心(25,25)作为原点,想绘制相同的纹理到相同的位置(即上面的使用默认精灵原点绘制的位置),开发者就必须在屏幕位置上再加上原点的坐标(位置是425,225,原点是25,25),如图2-1所示:图2-1 一个Sprite(x轴400,y轴200),红色点是Sprite的中心操作2D图形的执行步骤:绘制Sprite。必须先创建一个SpriteBatch对象,通过调用Begin使其初始化;然后对每个精灵调用Draw方法,精灵的位图信息可以从Texture2D对象中得到;为了能使部分纹理透明或半透明,纹理要包含Alpha通道信息;可以用Draw来调节着色,旋转或者缩放精灵,这个方法也可以让开发者选择在屏幕上只绘制纹理的一部分;绘制完后,在调用Present之前调用End。旋转Sprite。当旋转一个精灵的时候,将使用原点作为旋转的中心。为了方便,就应该在屏幕上绘制精灵时普遍使用精灵的中心作为原点。缩放Sprite。Draw方法可以接受一个统一的缩放参数或者不统一的缩放参数或者是一个源矩形和目标矩形。统一缩放变量是一个浮点数,这个浮点数将和精灵的x和y轴相乘。这将以相等的值缩小或扩大精灵的每个轴,不会改变精灵原来的宽高比。2.4 XNA3D图形要创建3D图形,需要3个基本条款:一套用于世界坐标,视图坐标和投影坐标相互转换的矩阵一个顶点缓冲区一个将世界坐标,视图坐标和投影坐标应用于顶点数据的特效XNA坐标系如图2-2所示:图2-2 XNA坐标系3D图形可由三角形、线或点组成。当绘制3D几何对象时,首先需要使用Primitives(图元)定义它的形状。Primitives(图元)是可以被XNA绘制的最基本的对象,最常被使用的图元是三角形。XNA Framework可以将点,线、三角形作为图元绘制。XNA允许定义这些图元的所有3D坐标。当调用DrawUserPrimitives方法时,只要提供正确的观察矩阵和投影矩阵,XNA会自动将这些3D坐标转换为对应的屏幕坐标。使用XNA绘制三角形的步骤:定义三角形三个顶点的坐标和颜色,将它们存储在一个数组中。对应三角形的每个顶点,不仅要存储3D位置还要存储顶点的颜色。XNA提供了一个叫做VertexPositionColor的结构,这个结构可以存储位置和颜色。所以需要添加VertexPositionColor结构的数组,告诉显卡每个顶点所包含信息的类型。设置绘制三角形要用到的effect。在绘制三角形前,需要设置BasicEffect的一些参量。这些参量可能是通过设置世界矩阵移动,旋转或缩放三角形,比如只是简单地将三角形绘制到指定位置,可以设置世界矩阵设为单位矩阵。BasicEffect还需要知道观察矩阵和投影矩阵以让显卡可以根据相机的位置将顶点从3D坐标转换为2D屏幕坐标。最后还需指定BasicEffect使用指定的颜色信息。 声明要传递的数据类型。在屏幕上绘制数组中的内容。定义了顶点和加载了BasicEffect后,就做好了绘制三角形的准备。显然,绘制三角形应在Draw方法中完成,而Draw方法在XNA Framework中已经提供了,它每帧都会被调用。2.5 XNA声音XNA Framework提供使用Microsoft Cross-Platform Audio Creation Tool和其相关的声音引擎的方法来实现音频重现。Microsoft Cross-Platform Audio Tool或XACT,是XNA Framework Audio API的核心。它由强大的图形工具和API组合而成,图形工具用来创作音频内容,而API则用来解释已创建的XACT文件以及为响应游戏事件而播放音频文件。作为GUI驱动的音频内容创建系统,XACT能使音频设计器以组的方式来加载wave文件,将文件组织成离散的可以被游戏事件激活的“cues”,还能在“cues”之间创建过渡。XACT还能允许设计者定义变量,游戏中可以更改这些变量以更改音频设置。通过使用这些高级工具,音频设计者可以做很多事情,例如:为赛车游戏设计一组汽车发动机的声音,通过使用设计者所定义的这些变量来使发动机的声音的音量和音调增加或减小,这些变量都使由XACT引擎在游戏中控制的。XACT界面如图2-3所示:图2-3 XACT界面从XNA Game Studio的Tools文件夹内进入XACT,XACT编程步骤: 创建一个XACT工程,并且将它保存为一个.xap文件,就可以将这个.xap文件和所有这个XACT工程使用到的wave文件输入到XNA游戏中,素材管道(Content Pipeline)将生成在运行时访问素材所需要的文件。一个XACT项目将生成一组文件:一个全局配置文件(.xgs)、一个或多个Wave Bank(.xwb)以及一个或多个Sound Bank(.xsb)。这些文件都可以单独的提供给AudioEngine, WaveBank,还有SoundBank的构造函数。要初始化XACT引擎,必须先创建一个新的AudioEngine并且为全局配置文件(.xgs)提供路径。然后,通过创建新的WaveBank对象来加载所需要的任何Wave Bank,通过创建SoundBank对象来加载所需要的任何Sound Bak。一旦加载完所有所需文件,就可以访问cues,它是音频设计器在适当的SoundBank中通过调用GetCue创建的,该SoundBank中包含想获取的Cue。每一个获取的Cue实例都是唯一的,即使当使用同一个名字获取多个cues 的时候也是唯一的。这将允许多个来自相同 Cue 的实例存在并同时播放。分别使用Play,Pause,Resume以及Stop方法可以播放、暂停、重新播放以及停止播放Cue对象。必须定期调用Update方法,让音频引擎来处理音频数据。对于更高级的项目,可以通过调用AudioEngine.GetCategory来访问AudioCategory 对象,AudioCategory对象可以用来控制声音的播放。同样,如果想访问音频设计者定义的用来改变音量、音高或者DSP效果的变量,可以调用AudioEngine.GetGlobalVariable来获得这些变量。2.6 XNA纹理映射在三维图形中,纹理映射(Texture Mapping)的方法运用广泛,尤其描述具有真实感的物体。比如绘制一块木板,就可以用一幅真实的木板图像或照片作为纹理贴到一个矩形上,这样,一面逼真的木板就画好了。如果不用纹理映射的方法,则木板上的每一块木头都必须作为一个独立的多边形来画。纹理映射有许多种类,一维、二维和三维。其中二维纹理最为常见,它是将一张图片加载到内存(称为纹理),然后将其每个象素附着到面片上,使面片不再只具有单一的颜色,使得场景的真实感增强。比如绘制一个颜色漂亮的三角形并可以完全控制三角形上的颜色,显卡允许指定一张图像,从这张图像可以采样想要的颜色。这意味着需要将一张2D图像导入到XNA项目中,并在绘制三角形之前将它传递到显卡。对每个顶点,需要指定2D图像的哪个位置对应顶点。如果三角形的每个顶点对应一个2D纹理坐标,显卡就会将指定的2D图像的某一部分填充到三角形内部。执行纹理映射所需的步骤:创建纹理。首先,从硬盘加载一幅图片,并获取其宽、高和图片数据;其次,创建Texture2D对象,使用ContentManager.Load方法加载资源并且可以设置纹理的alpha值。 Texture2D newTexture = new Texture2D(device,textureWidth,textureHeight,1,TextureUsage.None,SurfaceFormat.Color);参数device是创建纹理的设备名,第二、三个参数表示图像分辨率,第四个参数是mipmap的数量,第五个参数设置TextureUsage,可选择TextureUsage.AutoGenerateMipMap,XNA会自动生成指定的mipmaps的数量。如果使用mipmap,图像的宽和高必须是2的整数幂。最后一个参数指定了纹理中像素的格式,这对XNA分配足够的内存存储纹理是必须的。而且,当获取纹理中的值时,这也是预期的格式,当把数据写入到纹理时,必须提供这个格式的数据。设置特效参数。这个特效具有两个参数,一个被vertex shader使用的,名为WorldViewProj的变换矩阵,和一个被纹理采样器使用的,名为gTex的纹理。绘制场景,给出顶点的纹理坐标和几何坐标,使用一个VertexPositionTexture类的数组来把3D对象的每个顶点和对应的纹理坐标关联起来。2.7 XNA摄像机要将3D世界绘制到屏幕,就得需要相机的View和Projection矩阵。用一个矩阵中保存相机位置和方向,这个矩阵叫做View矩阵(视矩阵,观察矩阵)。要创建View矩阵,XNA需要知道相机的Position,Target和Up向量。View矩阵保存相机位置和观察方向的定义。通过调用Matrix. CreateLookAt方法创建这个矩阵: viewMatrix = Matrix.CreateLookAt(cameraPosition, cameraTarget, cameraUpVector);这个方法需要三个参数:相机的Position,Target和Up向量。Position向量容易理解,它表示在3D空间中的哪个位置放置相机;需要指定另一个点表示相机观察的目标,即摄像机位置到贯彻目标的连线向量。UP向量是垂直相机且朝向向上的向量。知道了这三个值相机就唯一确定了。XNA还需要Projection矩阵。这个矩阵是从3D空间到2D窗口的所有点的一个映射模式矩阵,或者可以看成包含相机镜头信息的矩阵。XNA摄像机原理如图2-4所示,左图显示了一个在相机视野中的3D场景,它像一个金字塔,切除顶部的金字塔叫做视锥体(view frustum),右图中可以看到金字塔的一个2D切面。 图2-4 相机的视锥体(view frustum)只有在视锥体内部的物体才会被绘制到屏幕上。XNA可以创建这样一个视锥体,它存储在Projection矩阵中。可以调用Matrix. CreatePerspectiveFieldOfView创建这个矩阵: projectionMatrix=Matrix.CreatePerspectiveFieldOfView(viewAngle,aspectRatio, nearPlane, farPlane);Matrix. CreatePerspectiveFieldOfView方法的第一个参数是观察角度。它对应金字塔顶角的一半。第二个参数与“source”无关,即与视锥体无关,而和“destination”有关,即与屏幕有关。它是2D屏幕的长宽比,它实际上对应后备缓冲的长宽比,通过使用以下代码获取它: float aspectRatio = graphics.GraphicsDevice.Viewport.AspectRatio; 当使用一个长宽相同的正方形窗口时,这个比为1。但是绘制全屏800 600窗口时这个比大于1。最后两个参数与视锥体有关。XNA定义一个靠近金字塔顶部的平面。位于金字塔顶部和这个平面之间的物体不会被绘制,这个平面叫做近裁平面(near clipping plane),通过指定相机到这个近裁平面的距离作为CreatePerspectiveFieldOfView方法的第三个参数。同理第二个平面叫做远裁平面(far clipping plane),它是视锥体的最远边界。通过指定相机到这个远裁平面的距离作为CreatePerspectiveFieldOfView方法的最后一个参数。2.8 XNA输入在XNA Game Studio中,Microsoft.XNA.Framework.Input命名空间支持3种不同的输入设备:Xbox 360控制器、键盘以及鼠标。输入是普通术语,是获取用户动作的过程。2.8.1Xbox 360控制器Xbox 360提供了数字按钮和模拟手杆的良好组合,因此可以用它来玩许多类型的游戏。控制器既可用于Windows系统,也可用于Xbox 360系统。最多可以支持四个控制器。使用步骤:游戏中的每帧,都从GamePad类中调用静态的GetState方法;将要查询的玩家索引作为参数传递,与控制器相关联的玩家在控制器上的Ring of Light中是可见的;询所得到的GamePadState 结构来获取控制器的状态信息。2.8.2键盘有大量数字按钮的键盘,对于多功能的复杂模拟来说它是最好的,或者在输入文本时它是必须的,但是它没有任何模拟控制来实现精确移动。使用步骤:游戏中的每帧,都从Keyboard 类中调用静态的GetState方法;询所得到的KeyboardState结构来获取键盘的状态信息。2.8.3鼠标有精确模拟控制的鼠标是选择对象的最佳选择,比如在策略游戏中或移动视口,比如在第一人称的动作游戏中 但是鼠标没有数字按钮。现代鼠标除了标准左右按钮之外还有3个附加按钮:两个数字按钮,通常在鼠标侧面,还有一个数字按钮,按下滚轮可以激活它。滚轮本身就相当于在两个方向上的额外的模拟控制,但不能提供精确的控制。使用步骤:游戏开始时,通过设置Mouse类的静态WindowHandle属性将游戏窗口赋值给鼠标,通常Game类的派生类的Window属性也是这样设置的;游戏中每一帧,都从Mouse类中调用静态GetState方法;查询返回鼠标状态信息的MouseState结构;如果要通过状态比较来确定上一帧和下一帧的输入变化,需要存储前一个鼠标状态。2.9XNA光照在三维渲染中,光照对与场景的渲染效果有着十分重要的作用。XNA中实现光照效果十分方便,只需要对其光照模型中的一些参数进行设置即可,不需要用户进行复杂的光线追踪等复杂的计算。2.9.1 XNA光照模型光照类型在XNA中的物体,如果其自身不发光,则一般受到思念中不同类型的光照:环境光、散射光、镜面光。环境光并不来自任何特定的方向,而是来自某个光源,但光线是在场景四处反射的,没有方向性可言。由环境光所照射的物体在所有方向上的所有表面都是均匀照亮的。散射光来自一个特定的方向,它照射在物体表面,并均匀地反射开来。虽是均匀反射,但受到光线直接指向的物体表面看起来更亮一些。镜面光也是有方向的,但是其反射光线只是延一个特定的方向。高强度的镜面光趋向于在它所照射的表面上生成一个亮点,叫做光斑。现实生活中,没有任何一种光源纯粹由上面的一种类型的光组成,而是由各种强度不同的光所组成的。例如,激光中镜面光所占的比例较大,而其中的环境光和散射光虽存在,但是所占比例极小。材质属性光照类型只是XNA计算光照的一部分,还有一部分就是物体的材质属性。通常材质属性是指物体的颜色。然而,开发者并不是把多变性描述具有一种特定的颜色,而是认为它是由一些具有某种反射属性的材料所组成的。除了设置物体的颜色,还需要设置物体对各种类型的光的反射能力。这种反射能力是指某种类型的光照射到物体之后有多少会被反射回来。2.9.2 XNA中添加光照的一般步骤XNA已经设计好光照模型,开发者要做的就是对这个模型的参数进行设定,之后的操作就交给XNA完成了。添加光照的步骤如下:启用光照设置光照模型设置材质属性绘制物体通过以上步骤,一个具有光照的场景就完成了,但是要达到自然、真实的效果,还需要广大程序员对光照模型中的数值作细致调整。第三章 3D赛车游戏开发3.1 典型游戏简介3.1.1 3D赛车游戏简介赛车游戏是竞速游戏的一类,是指游戏内容主要是玩家控制汽车进行竞速比赛的电子游戏。赛车游戏的主要游戏方式和游戏目标是玩家驾驶车辆同CPU或其他玩家比赛并试图获取胜利,过程中经常营造驾驶汽车的速度感和刺激感。3D赛车游戏以其逼真的画面效果、声音、粒子、三维等特效而带给玩家一种全新的体验。建立在3D技术之上所构建的游戏世界,可以轻松地实现传统2D游戏所无法实现的效果,例如摄像机跟踪、镜头回旋、慢动作播放等推拉摇移的电影化效果,以及更加绚丽夺目的3D特技效果:例如云、雨、烟雾、火焰、重力、碰撞、漂移等等。3D赛车游戏虚构了真实的世界,并力图呈现出一个场景空间感强,有着动态视角、真实光源、全屏特效等融合在一起的亮丽画面。这将在视觉效果上极大地增强冲击力,引领玩家进入一个绮丽梦幻般的幻想空间。3D环境的建立,不仅在视觉效果上,更在游戏规则上带来突破,玩家需要面对的不再是一个平面,而需要在一个虚拟的立体环境中进行思考:玩家将置身于一个小型星球的球体地表之上,全方位地考虑如何在地表赛道上展开竞技比赛,并迎接来自于360度立体环境中的对手的挑战。游戏的变化丰富度,要远远超出传统的2D、2.5D画面表现下的前代产品。3.1.2应用程序模型XNA Framework Game类提供了一个框架来处理游戏模拟,该模拟以固定的或不定时间间隔为基础。创建新游戏创建新游戏的第一步就是要创建Game类的派生类。该新类需要重载Update、Draw和Initialize。Update方法用于处理游戏逻辑,Draw方法用于绘制每一帧,Initialize方法用于在游戏开始之前初始化。创建简单游戏循环步骤:创建Game类的派生类。用游戏指定的渲染和逻辑代码来重载Game类的Draw和Update方法。添加一个GraphicsDeviceManager成员变量。在该派生类的构造器中,为新实例GraphicsDeviceManager初始化该成员变量。创建一个该派生类的实例。调用Game实例的Run方法。游戏循环周期Game的循环周期要么是固定的要么是可变的,默认的是固定的。周期的类型决定了Update被调用的频率,同时也会影响程序中那些以时间为基础的函数的运行,例如移动、动画等。一完成上一帧的渲染,可变周期的Game 就会调用它的 Update方法。将Game.IsFixedTimeStep 的值设为false的话,Game就会使用可变周期的游戏循环。这种类型的Game要求游戏逻辑和动画代码是基于流逝的时间的,这样才能保证游戏流畅地运行。因为前一个帧一完成就会立即调用Update方法,所以两次调用Update方法之间的时间是可以变化的。不考虑调用之间的时间,游戏看起来好像是变快和减慢了。可以用Update方法的gameTime参数来得到两次调用Update方法之间的流逝时间。当使用可变周期的游戏循环时,应该确定游戏中的速率比如精灵的移动距离游戏中是以每毫秒为单位。在任何给定的游戏更新中,精灵移动的距离都可以使用流逝时间的速率来计算出来。用这种方法计算精灵的移动距离,即使游戏速度或计算机速度不同,也能保证精灵的连续移动。固定周期的Game 类以TargetElapsedTime中特定的固定时间间隔来调用它的 Update方法。将Game.IsFixedTimeStep的值设置为true,Game 就会使用固定周期的游戏循环。使用固定周期的话,游戏逻辑可以将Update作为其基本时间单位,并假设将以指定的时间间隔调用Update。如果Update运行得比预期的慢,Game类将通过加时调用Update来进行补偿,并且丢弃掉那些无用的Update渲染的图像来节省时间。这可以保证即使游戏循环比期望的要慢,也能调用足够次数的Update。当使用固定的游戏循环周期,速率(例如精灵的移动距离)将由调用Update的次数决定,这通过调用Update来使用Update中的移动速率来改变精灵的位置。游戏周期流程图如图3-1所示:图3-1 游戏周期流程图开始游戏调用Game.Run方法开始运行游戏。该方法开始游戏循环,在调用Exit之前,每秒多次调用Update和Draw方法。游戏组件游戏组件提供一种有标准组件的方法向游戏添加功能。通过通过继GameComponent或DrawableGameComponent类来创建游戏组件。然后通过重载GameComponent.Update、DrawableGameComponent.Draw 和 GameComponent.Initialize向游戏组件添加游戏逻辑和渲染代码。将组件传递给Game.Components.Add可以在游戏中注册游戏组件。已注册的组件将在Game.Initialize、Game.Update 和Game.Draw方法中调用自己的draw,update,还有initialize方法。3.2输入和用户界面3.2.1 Input类Input类有许多轻松获得所有最常用的键盘,鼠标和手柄键状态的属性。此类还提供了一些辅助方法来管理键盘输入,文字输入,当游戏发展并使用更多的用户界面代码时,就会觉得它们的用处了。此类最重要的方法是Update方法,该方法每一帧都被调用(在BaseGame类的Update方法中被自动调用)。通过Input类的属性可获取鼠标参数,如果检查是否有另一个键或按钮被按下,可直接操作手柄和键盘状态,但对于鼠标,您只能通过Input类的属性。现在运行在PC上,会返回所有属性。/ Handle GamePad input, and also allow keyboard inputif (Input.GamePadUpJustPressed |Input.KeyboardUpJustPressed) Sound.Play(Sound.Sounds.Highlight); selectedButton =(selectedButton + NumberOfButtons - 1) % NumberOfButtons;else if (Input.GamePadDownJustPressed |Input.KeyboardDownJustPressed) Sound.Play(Sound.Sounds.Highlight); selectedButton = (selectedButton + 1) % NumberOfButtons; GamePadUpJustPressed 方法代码如下:/ Game pad up just pressedpublic static bool GamePadUpJustPressed get return (gamePadState.DPad.Up = ButtonState.Pressed & gamePadStateLastFrame.DPad.Up = ButtonState.Released) | (gamePadState.ThumbSticks.Left.Y 0.75f & gamePadStateLastFrame.ThumbSticks.Left.Y 0.75f); / get / GamePadUpJustPressed该代码使用目前的手柄状态(这是每帧开始时分配的)和上一帧的手柄状态以按键状态是否已经发生变化。当写更多的用户界面代码时,它将更容易检查所有输入状态,处理许多不同的输入设备3.2.2Input类中的Update方法Update方法并没有什么复杂,但它是Input类中最重要的部分,因为上一帧的所有状态被复制,然后获得每一个键盘,鼠标和手柄输入的新状态。这里有一些额外的代码处理相对鼠标移动。鼠标的相对移动在XNA中不支持,不同于DirectX中的DirectInput类,它能让您获得相对鼠标位置去替代绝对鼠标位置,比如用相对坐标(-3.5,7.0)替代绝对坐标(350,802)。3.2.3游戏屏幕大多数游戏屏使用一个特殊的背景纹理把大多数的信息显示在屏幕上。在任务选择画面,您可以选择四项任务中的其中一个,然后启动游戏。其他屏幕只是显示出一些信息和只有在Option屏幕上允许用户可以一些东西。所有的游戏画面在按下Back键后返回主菜单。游戏屏幕堆栈自动处理所有游戏屏幕,或使用更复杂的多层次的菜单系统,并可以随时返回以前的画面。如果想返回到主菜单,只需移除堆栈中除最后一个以外的所有项。另一个我经常使用的技巧是在主菜单前添加另一个屏幕。大多数游戏屏幕类也非常简单。本游戏的用户界面不是很复杂,由一个游戏主界面和多个子界面组成,各个界面直接可以自由衔接和跳转。游戏主界面的基色是绿色,这样本游戏可持续发展的主题也十分相符。游戏主界面如图3-2所示:图3-2 游戏主界面1、用户界面的三大元素:图片、按钮、界面特效。l 图片:是在屏幕上绘制2D图片。l 按钮:本身也是图片,但需要经过特殊加工。此外,按钮具有交互能力,可以检测鼠标、键盘输入。这些交互都是通过坐标检测来实现的,XNA不提供这些功能。可以说每一处的交换检测都有一段相应代码与之对应。l 界面特效:在用户界面上加些动态特效,可以获得更好的用户体验,这一点非常重要。比如在主界面中,黑色Jeep的车尾灯是和眼睛一样一眨一眨的;当鼠标放入按钮上时,按钮会表现出放大缩小的连续动作。2、游戏中的显示信息:l 污染条:显示了赛车尾气对环境的污染程度。如果污染到达一定程度,场景中树叶、草地等会由绿色渐变为枯黄色。l 记分牌:显示赛车成绩。l 地图雷达:详细显示各赛车的位置、行驶方向等信息。l 提示条:对玩家的行为作出友好的警告,是一种人性化提示。l 速度计:显示玩家赛车当前速度值。3、此外,还有游戏设置界面、画面设置界面、游戏选择界面等等。用户界面总体结构如图3-3所示:图3-3 用户界面结构图3.3摄像机管理3.3.1创建摄像机用一个矩阵保存相机位置和方向,这个矩阵叫做View矩阵(视矩阵,观察矩阵)。要创建View矩阵,XNA需要知道相机的Position,Target和Up矢量。保存视锥体(view frustum),它是3D世界中实际可见的部分,在另一个叫做Projection的矩阵中。知道了相机的位置,观察目标和相机的up方向,相机就唯一确定了。View矩阵由这三个向量决定,可以使用Matrix. CreateLookAt方法创建一个相机:Matrix viewMatrix;Vector3 camPosition = new Vector3(10, 0, 0);Vector3 camTarget = new Vector3(0, 0, 0);Vector3 camUpVector = new Vector3(0, 1, 0);viewMatrix = Matrix.CreateLookAt(camPosition, camTarget, camUpVector);相机的Position和Target向量指向3D空间中的真实位置,Up向量表示相机向上方向。例如,一个相机位于点(300,0,0)观察点(200,0,0)。如果相机的Up向量只是简单地向上,只需指定(0,1,0)Up向量,这不是指在3D空间中的点,这个例子中这个3D点为(300,1,0)。XNA为最常用的向量提供了一个快捷方式,Vector3. Up表示(0,1,0),Vector3. Forward表示(0,0,-1),Vector3. Right表示(1,0,0)。XNA还需要Projection矩阵,这个矩阵可以看成映射从3D空间到2D窗口的所有点的一个东西。XNA可以创建这样一个视锥体,它存储在Projection矩阵中。通过调用Matrix. CreatePerspectiveFieldOfView创建这个矩阵:projectionMatrix = Matrix.CreatePerspectiveFieldOfView(viewAngle, aspectRatio, nearPlane, farPlane);Matrix. CreatePerspectiveFieldOfView方法的第一个参数是观察角度。它对应金字塔顶角的一半。如果想知道自己的观察角度,可以将手放在眼睛前面,就会发现这个角度约为90度。因为弧度PI等于180度,90等于PI/2。因为要指定观察角度的一半,所以这个参数为PI/4。XNA坐标世界中摄像机模型如图3-4所示:图3-4 摄像机3.3.2旋转、移动摄像机确定摄像机的世界坐标。 确定旋转摄像机所需的观察点 Vector3 ,在游戏中这个方向不能改变,并且将经常是(0, 0, 1)或(0, 0, 1)。/ The direction the camera points without rotation.Vector3 cameraReference = new Vector3(0, 0, 10);创建一个旋转矩阵来描述摄像机所面对的方向,表示沿Y轴旋转的旋转.矩阵应该通过 CreateRotationY 来创建. Matrix rotationMatrix = Matrix.CreateRotationY(avatarYaw);通过 Transform 和旋转Matrix 来转换观察点 vector 的副本。/ Create a vector pointing the direction the camera is facing.Vector3 transformedReference = Vector3.Transform(cameraReference, rotationMatrix);将摄

温馨提示

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

评论

0/150

提交评论