[优秀毕业设计精品] 基于Direct3D的Windows游戏开发

上传人:仙*** 文档编号:33932931 上传时间:2021-10-19 格式:DOC 页数:44 大小:3.18MB
收藏 版权申诉 举报 下载
[优秀毕业设计精品] 基于Direct3D的Windows游戏开发_第1页
第1页 / 共44页
[优秀毕业设计精品] 基于Direct3D的Windows游戏开发_第2页
第2页 / 共44页
[优秀毕业设计精品] 基于Direct3D的Windows游戏开发_第3页
第3页 / 共44页
资源描述:

《[优秀毕业设计精品] 基于Direct3D的Windows游戏开发》由会员分享,可在线阅读,更多相关《[优秀毕业设计精品] 基于Direct3D的Windows游戏开发(44页珍藏版)》请在装配图网上搜索。

1、毕业设计(论文)任务书系 别:计算机工程系专 业:计算机科学与技术学 生 姓 名:学 号:设计(论文)题目:基于Direct3D的Windows游戏开发起 迄 日 期:2008年10月20日2009年4月20日设计(论文)地点:指 导 教 师:专业教研室负责人:发任务书日期:2008年10月20日任务书填写要求1毕业设计(论文)任务书由指导教师根据各课题的具体情况指导学生填写。此任务书应在毕业设计(论文)开始前一周内填好并发给学生;2任务书内容必须用黑墨水笔工整书写或按教务处统一设计的电子文档标准格式(可从教务处网页上下载)打印,不得随便涂改或潦草书写,禁止打印在其它纸上后剪贴;3任务书内填写

2、的内容,必须和学生毕业设计(论文)完成的情况相一致,若有变更,应当经过所在专业及系主管领导审批后方可重新填写;4任务书内有关“系别”、“专业”等名称的填写,应写中文全称,不能写数字代码。学生的“学号”要写全号(2000级为10位数),不能只写最后2位或1位数字;5任务书内“主要参考文献”的填写,应按照国标GB 771487文后参考文献著录规则的要求书写,不能有随意性;6有关年月日等日期的填写,应当按照国标GB/T 740894数据元和交换格式、信息交换、日期和时间表示法规定的要求,一律用阿拉伯数字书写。如“2004年3月15日”或“2004-03-15”。毕 业 设 计(论 文)任 务 书1本

3、毕业设计(论文)课题应达到的目的:设计并实现一个基于Direct3D 的Windows游戏的Demo版本。该游戏能提供一个完整游戏所具有的各种元素,包含3D游戏场景,玩家角色与NPC的控制和运动,碰撞检测,背景音效等。2本毕业设计(论文)课题任务的内容和要求(包括原始数据、技术要求、工作要求等):1. 设计游戏中的场景,包括天空盒和纹理地形。2. 设计游戏中的背景声音,包括背景声音,和角色动作声音。3. 设计游戏中的下雪效果。4. 设计游戏中的UI界面。5. 设计游戏中的智能AI。6. 设计游戏中的碰撞检测功能。7. 提交设计文档毕 业 设 计(论 文)任 务 书3对本毕业设计(论文)课题成果

4、的要求包括毕业设计、论文、图表、实物样品等:1 游戏程序和相关设计文档。2 撰写毕业设计论文。4主要参考文献:1 DirectX 高级动画制作. Jim Adams著;刘刚 译. 重庆:重庆大学出版社 20052 DirectX9.0 3D游戏开发编程.(美)Frank D.Luna著;段菲 译. 北京:清华大学出版社,20073 精通DirectX 3D图形与动画程序设计. 王德才 杨关胜 孙玉萍 编著. 北京:人民邮电出版社,20074 C+STL 开发技术导引. 叶至军 编著. 北京:人民邮电出版社,20075 DirectX游戏开发终极指南.(美)Allen Sherrod著;狄东宁译

5、. 北京:清华大学出版社,20086 DirectX实时渲染技术详解.(美)Kelly Dempski著;于忠德, 吴红艳, 林锋译.重庆:重庆大学出版社,20067 DirectX角色扮演游戏编程.(美)Jim Adams著;黄际洲, 刘刚译. 重庆:重庆大学出版社,2006毕 业 设 计(论 文)任 务 书5本毕业设计(论文)课题工作进度计划:起 迄 日 期工 作 内 容2008年10月20日 2008年11月10日论文选题,论文资料收集整理,系统需求模型的确立。2008年11月10日 2008年1月15日游戏软件的分析设计,游戏软件的开发。2009年1月15日 2009年3月1日系统测试

6、,论文结构的撰写2009年3月1日 2009年4月20日论文正文的撰写,修改,定稿。指导教师审查意见:指导教师(签名): 年 月 日基于Direct3D的Windows游戏开发摘 要随着电脑绘图技术的不断发展,3D绘图硬件效能的增强以及宽带网络的普及,3D技术的应用也有了新的风貌。3D技术的使用非常广泛,而且使用比较普遍的可能就是在3D游戏的制作领域。并且随着电脑硬件的不断升级和游戏开发库的功能日益强大,游戏的真实性场景和炫丽的效果不断冲击着游戏玩的视角。DirectX是一种应用程序接口(API),它可让以windows为平台的游戏或多媒体程序获得更高的执行效率,加强3d图形和声音效果,并提供

7、设计人员一个共同的硬件驱动标准,让游戏开发者不必为每一品牌的硬件来写不同的驱动程序,也降低用户安装及设置硬件的复杂度。本论文介绍游戏开发库DirectX相关技术。及勇者斗恶龙开发前期的策划和设计,并且较为详细介绍了游戏各个功能的实现。关键词:3D;Windows游戏;DirectX;骨骼动画Progamming Games with Direct3DAbstractWith computer graphics technology development, 3D graphics hardware performance enhancements as well as the populari

8、zation of broadband networks, 3D technology also has a new outlook. 3D technology is widely used, but use may be more common in the field of 3D game production. And with the continuing escalation of computer hardware and game developers increasingly powerful function library, the authenticity of sce

9、nes and Games Behind the effect of constant impact on the game play perspective. DirectX is an application programming interface (API), which allows to windows as a platform for games or multimedia programs to achieve higher efficiency in the implementation and strengthening 3d graphics and sound ef

10、fects, and to provide designers a common hardware-driven standards for the Games developers do not have for each brand of hardware to write a different driver, but also lowers the user to install and set up the hardware complexity. In this paper, introduce DirectX game development library related te

11、chnology. And Dragon Quest pre-development planning and design, and more detailed information on the implementation of each functional Games.Key words: 3D;WindowsGame;DirectX; Skeletal Animation 目 录1绪 论11.1背景11.2我国游戏的现状和未来趋势11.3论文的主要工作22总体方案32.1Microsoft Visual C+ 简介32.2DirectX简介43游戏策划53.1游戏的简要介绍53.

12、2背景和情节53.3游戏各个角色和物品的素材63.3.1角色和物品63.3.2物品63.4场景设计73.5游戏UI94游戏设计与实现104.1游戏基本流程104.2游戏的实现及相关概念104.2.1地形的实现104.2.2天空盒的现实134.2.3UI的实现144.2.4下雪效果的实现194.2.5角色模型的实现204.2.6静态模型的实现264.2.7声音系统的实现274.2.8碰撞检测的实现284.2.9AI的实现284.2.10拾取系统的实现295总 结31参考文献32致 谢33II1 绪 论1.1 背景随着电脑绘图技术的不断演进,3D绘图硬件效能的增强以及宽带网络的普及,3D技术的应用

13、也有了新的风貌。目前3D技术的使用非常广泛,它已经成为各界研究、应用的主题,3D应用发展纵然也就成为了时势所趋最热门的研究话题,也是各行业努力的方向,它的发展主题跨及了制造设计、电子商务、动画制作、多媒体教学、虚拟现实以及游戏行业等。3D技术满足了人们在视觉上拟真的需求,目前市场上可见的3D技术的应用包括:单机游戏、网络多人联机游戏、虚拟社群、训练模拟、科学可视化、网站广告、网络商品3D显现、行动式装置(PDA或是手机)游戏、广告动画、3D特效合成、3D动画影集或3D动画电影等。从上述的应用层面分析,3D技术一个较大的应用市场在于娱乐软件与3D动画特效制作等。在这样一个科技迅猛发展、3D技术广

14、泛应用的信息时代,我们的生活每天都在发生变化,游戏业迅速发展就是其中不可忽视的一个方面,尤其是3D技术在游戏中的运用。如今国内的游戏产业也在突飞猛进,3D游戏将是世界网络游戏的发展趋势,因此3D技术的使用也将会变得更加普及。1.2 我国游戏的现状和未来趋势游戏产业处于整个动漫游戏产业的末端,一度被视为动漫产业的衍生产业。2000年国务院部署开展的电子游戏经营场所专项治理至今余波未消,停止审批并大力压减电子游戏经营场所数量,禁止进口电子游戏设备及其零附件,电子游戏在中国处于极度萎缩的状况,单机版游戏则由于猖獗的盗版问题而难以实现盈利。纵观中国游戏产业的发展现状,网络游戏依然是执牛耳者。截止到20

15、06年6月30口,中国互联网网民人数达到了12300万人,与2005年同期相比增长了194,其中宽带上网网民人数为7700万人,在所有网民中的比例接近23,比2005年同期增加了2400万人,增长率为453,而宽带上网的计算机数也迅速增长到2815万台,我国真正迎来了“宽带时代”。网民中网络游戏玩家超过了3000万人。2005年中国游戏产业报告显示,我国网络游戏用户的主要年龄段集中在1925岁,其中1922岁的占333,2325岁的占284,加起来超过60。对网民的上网地点分析发现,网吧已经成为网络游戏发展的重地。 根据IDC预测,2006年中国网络游戏市场规模将达到50亿元,这个数字低于其先

16、前的预计。网络游戏的发展强势带动了相关产业的发展,据2005年中国游戏产业报告披露,2005年网络游戏对相关产业的总体贡献为3198亿元。其中,对通信业务的直接贡献是1734亿元,对IT产业的直接贡献是716亿元,对媒体和传统出版业的直接贡献是371亿元;网络游戏产业对这三个产业的贡献分别比2004年增加了227亿元、79亿元和13亿元。此外,2005年网络游戏还带来了 377亿元的游戏广告收入。 2006年中国网络游戏发展中也呈现出如下特点。(1)国产化比例提高,国产网游数量继续增长。据统计,目前在中国上市的200款网络游戏中,国产网游占545,韩国网络游戏的比例已经降低到357。仅从数量上

17、看,国产网络游戏已经占据了半壁江山。这是文化部、信息产业部等有关部门积极实施民族游戏精品工程,支持鼓励民族原创游戏发展的结果。但是,国产网络游戏的质量还需要不断提高,从下载排名来看,在名列前12位网络游戏中,国产游戏权占4席。(2)休闲类游戏已成为中国网络游戏市场重要的推动力量。各种棋牌类、赛车类、益智类的绿色休闲游戏相继推出,比如跑跑卡丁车、疯狂赛车、连连看等内容远远超过了一些大型角色扮演类游戏。由于这类休闲游戏耗时短、上手容易,很快受到了国内广大用户的欢迎。据预测,休闲游戏在未来五年内将占据整个游戏产业总收入的50。(3)角色扮演类游戏本身类型也日益多样化。现在已经不是传奇类的打怪练级游戏

18、的天下,体育竞技、音乐舞蹈、航海冒险、星战幻想系列题材内容丰富的游戏也纷纷相继推出,受到玩家的追捧,并占据了市场的主导。包括大航海时代、星战前夜、QQ音速等游戏的推出,有力地推动了角色扮演类游戏的结构调整(4)免费游戏成为潮流。从2005年底上海盛大公司宣布对旗卜传奇、传奇世界、梦幻国度等三款游戏永久免费之后,2006年成为“免费网游年”。2006年中国网络游戏市场上已经有超过70款永久免费网游,可逐渐与费网游相抗衡。其中包括航海世纪、魔力宝贝等原来很受玩家欢迎的老游戏,也有武林外传、征途等新游戏。1.3 论文的主要工作通过论文的解释说明讲述基于DirectX的Windows游戏设计的过程,介

19、绍DirectX库的一些常用接口和游戏一些主要部分的实现方法。2 总体方案2.1 Microsoft Visual C+ 简介 Visual C+是一个功能强大的可视化软件开发工具。自1993年Microsoft公司推出Visual C+1.0后,随着其新版本的不断问世,Visual C+已成为专业程序员进行软件开发的首选工具。虽然微软公司推出了Visual C+.NET(Visual C+7.0),但它的应用的很大的局限性,只适用于Windows 2000,Windows XP和Windows NT4.0。所以实际中,更多的是以Visual C+6.0为平台。Visual C+6.0不仅是一

20、个C+编译器,而且是一个基于Windows操作系统的可视化集成开发环境(integrated development environment,IDE)。Visual C+6.0由许多组件组成,包括编辑器、调试器以及程序向导AppWizard、类向导Class Wizard等开发工具。 这些组件通过一个名为Developer Studio的组件集成为和谐的开发环境。Visual C+它大概可以分成三个主要的部分:Developer Studio,这是一个集成开发环境,我们日常工作的99%都是在它上面完成的,再加上它的标题赫然写着“Microsoft Visual C+”,所以很多人理所当然的认为

21、,那就是Visual C+了。其实不然,虽然Developer Studio提供了一个很好的编辑器和很多Wizard,但实际上它没有任何编译和链接程序的功能,真正完成这些工作的幕后英雄后面会介绍。我们也知道,Developer Studio并不是专门用于VC的,它也同样用于VB,VJ,VID等Visual Studio家族的其他同胞兄弟。所以不要把Developer Studio当成Visual C+, 它充其量只是Visual C+的一个壳子而已。MFC。从理论上来讲,MFC也不是专用于Visual C+,Borland C+,C+Builder和Symantec C+同样可以处理MFC。同

22、时,用Visual C+编写代码也并不意味着一定要用MFC,只要愿意,用Visual C+来编写SDK程序,或者使用STL,ATL,一样没有限制。不过,Visual C+本来就是为MFC打造的,Visual C+中的许多特征和语言扩展也是为MFC而设计的,所以用Visual C+而不用MFC就等于抛弃了Visual C+中很大的一部分功能。但是,Visual C+也不等于MFC。Platform SDK。这才是Visual C+和整个Visual Studio的精华和灵魂,虽然我们很少能直接接触到它。大致说来,Platform SDK是以Microsoft C/C+编译器为核心(不是Visua

23、l C+,看清楚了),配合MASM,辅以其他一些工具和文档资料。上面说到Developer Studio没有编译程序的功能,那么这项工作是由谁来完成的呢?是CL,是NMAKE,和其他许许多多命令行程序,这些我们看不到的程序才是构成Visual Studio的基石。Visual C+ 2005。微软的Visual C+2005发布版本对于有志于轻松、迅速地编写安全可靠的应用程序的编程爱好者来说是正确地选择。正如你所听到的那样,Visual C+中语言和库的新特点使开发安全、可靠的应用程序比以前更容易。它即提供了功能强大并且灵活的标准C+,又提供了适于.NET框架下编程的最强大的开发语言。2.2

24、DirectX简介DirectX是由微软公司建立的游戏编程接口。由C+编程语言实现,遵循COM。在Windows的平台上影响力超越OpenGL并被多数PC游戏开发商采用。最新版本DirectX9.0c(2006年12月13日)。另外,WindowsVista第5238版亦包含有DirectX10的Beta版。 很多Windows游戏需要DirectX。DirectX包含DirectGraphic、DirectPlay、DirectSound、DirectInput、DirectSetup等部份。(Direct3D与DirectDraw已整合成DirectGraphic,而DirectShow亦

25、已自原本的DirectXSDK中移到Windows平台SDK了。RedistPackage是媒体开发底层API,通过它可以开发游戏和其它媒体应用程序。DirectX并不是一个单纯的图形API,它是由微软公司开发的用途广泛的API,它包含有DirectGraphics(Direct3D+DirectDraw)、DirectInput、DirectPlay、DirectSound、DirectShow、DirectSetup、DirectMediaObjects等多个组件,它提供了一整套的多媒体接口方案。只是其在3D图形方面的优秀表现,让它的其它方面显得暗淡无光。DirectX开发之初是为了弥补W

26、indows3.1系统对图形、声音处理能力的不足,而今已发展成为对整个多媒体系统的各个方面都有决定性影响的接口。DirectX是一组低级“应用程序编程接口(API)”,可为Windows程序提供高性能的硬件加速多媒体支持。Windows支持DirectX8.0,它能增强计算机的多媒体功能。使用DirectX可访问显卡与声卡的功能,从而使程序可提供逼真的三维(3D)图形与令人如醉如痴的音乐与声音效果。3 游戏策划3.1 游戏的简要介绍 游戏利用一个高度图文件来形成高低不同的地型再配以纹理图片制造出一个雪地的环境。使用了6张天空的纹理图片制作一个天空盒,天空盒的中心位置是游戏中英雄的位置,所以天空

27、盒相对英雄角色是静止的。加入了一个粒子系统模拟一个下雪的过程,再加上一些树的模型就构成了游戏的场景了。游戏中的英雄角色和怪物角色的动作是使用了蒙皮骨骼动画技术。通过该技术可以随意的控制角色的动作和在动作发生的过程中产生所需要的事件(如攻击时播放攻击的音乐,计算角色在攻击动作发生后将自身的生命值减去伤害值)。游戏中采用的了第三人称视觉,玩家在电脑屏幕上看到的画面就是通过游戏里的摄像机拍摄出来的。摄像机会跟随英雄角色移动,也可以360度环绕英雄角色改变视觉的位置。游戏UI使用了点精灵实现角色的状态显示栏,并加以文字描述。游戏构建了声音系统,声音系统由背景音乐、英雄角色动作音乐、还有NPC动作音乐组

28、成。游戏给NPC设定了AI,NPC可以根据情况做出不同的反应和动作。在游戏过程中。玩家可以控制英雄角色在场景中自由移动。当英雄角色进入NPC的防范距离时NPC会主动接近英雄角色。当NPC到了攻击范围时会主动攻击英雄角色。当玩家选定了要攻击的目标时,进入到攻击有效范围可就以进行攻击。游戏会自己计算伤害然后在角色状态栏中相应显示。当NPC血量为0时会死亡随机掉出物品该物品可以回复英雄角色的血量,当英雄角色为血量为0量也会死亡,并在数秒后显示游戏结束界面。3.2 背景和情节游戏发生在一个魔幻的世界,英雄所在的村庄受到一条邪恶的冰龙破坏。本来小村庄里的人民过幸福的生活,但自从冰龙来了以后村庄变成一个冰

29、封的世界。一位青年的英雄为了解救村庄,他拿起手中的剑与冰龙还有冰龙的手下开展了一场生死的搏斗。3.3 游戏各个角色物品和各场景的素材3.3.1 角色的设计游戏中的角色如下表所示:表 3-1 角色属性生命值攻击力速度外形英雄1000507070怪物500305060怪物800506060冰龙10007090403.3.2 物品的设计游戏中增加英雄体力的物品苹果如下图所示: 图3-1 物品苹果3.3.3 场景的设计1 游戏中的天空盒图片前和后如下图所示: 图 32 天空盒图片前 图 33 天空盒图片后2 游戏中的天空盒图片右和左如下图所示: 图 34 天空盒图片右 图 35 天空盒图片右3 游戏中

30、的天空盒图片上和下如下图所示: 图 36 天空盒图片上 图 37 天空盒图片下4 游戏中的树模型如下图所示:图 38 树模型5 游戏中的房子模型如下图所示:图 39 房子模型3.4 游戏UI的设计游戏中的开始与结束界面如下图所示: 图 310 游戏开始界面 图 311 游戏结束界面游戏中的各角色状态栏如下图所示:图 312 游戏中各角色态栏游戏中的按钮和HP血量条如下图所示: 图 313 按钮 图 314 HP血量条4 游戏设计与实现 4.1 游戏基本流程 图4-1 基本流程图4.2 游戏的实现及相关概念 游戏的实现主要包括了地形的实现、天空盒的现实、UI的实现、下雪效果的实现、英雄角色及NC

31、P模型的实现、静态模型的实现、声音系统的实现、AI的实现、碰撞检测的实现,拾取选定的实现。4.2.1 地形的实现游戏中的地形呈现出高低不同的起伏是利用了高度图这一技术实现的。在3D游戏中坐标分为XYZ。XZ表示地平面坐标Y表示海拔高度,在游戏的世界坐标系中以XYZ为一点来表示一个位置。高度是图其实就是一个数组,该数组的每个元素都指定了地形方格中某一特定的顶点的高度值。我们高度图视以一个矩阵,这样高度图中的元素就与地形栅格中的顶点一一对应。高度图有多种可能的图形表示,其中一种是灰度图。地形中某一点的海拔越高,相应地该点在灰度图中的亮度就越大。我们利用一个灰度图的资源,再加上纹理就可以创建一个地形

32、了。下面讲述地形类GeneralTerrain的主要构成。class GeneralTerrainpublic:GeneralTerrain(int r, int c, float length); GeneralTerrain(void);bool SetVertexBuffer(IDirect3DDevice9 *Device, LPCSTR rawFileName, LPCSTR texFilename, float heightScale, bool OneTex = true); void Render(IDirect3DDevice9 *Device);float GetHeigh

33、t(int r, int l);void ComputeTriNormal(MAPCUSTOMVERTEX &v1, MAPCUSTOMVERTEX &v2, MAPCUSTOMVERTEX &v3, D3DVECTOR &normal);float GetPositionHeight(float x, float z);float Lerp(float a, float b, float t);void OnDestory();private:int num_row;/每列顶点数int num_col;/每行顶点数float uTexSize;/平分后的纹理U坐标float vTexSize

34、;/平分后的纹理V坐标IDirect3DVertexBuffer9 *m_pVertexBuffer;IDirect3DTexture9 *Dtex;IDirect3DIndexBuffer9 *m_pIndexBuffer;float length;/网格宽度vector raw;/存放高度的容器;GeneralTerrain 构造函数用于初始化地形中行的点数和列的点数还有之间的距离。SetVertexBuffer用于设置地形纹理,Device是设备指针,rawFileName是文件路径,texFilename是纹理资源的路径,heightScale是高度的相对比例值,OneTex是否一张纹

35、理显示。Render用于渲染时调用。GetHeight用于得到指定的行列相交点的高度。ComputeTriNormal用于计算向点法向量。GetPositionHeight用于得到世界坐标系中的高度。Lerp用于线性插值。当程序加载了高度图和纹理之后,就可以显示在游戏中。我们在主程序中加入GeneralTerrain *terrain这个变量,然后在主程序的OnCreateDevice函数中对terrain进行初始化,在主程序的OnFrameRender调用terrain的Render函数进行渲染。当游戏结果时在主程序的OnDestroyDevice中调用terrain的OnDestory来释

36、放资源。而游戏中的角色和物体的高度就可以通过GetPositionHeight传入自己在世界坐标系中的XZ坐标来得到对应的高度,从而构成3D游戏中的三维坐标。下面讲述GeneralTerrain的渲染函数Render的实现void GeneralTerrain:Render(IDirect3DDevice9 *Device)Device-SetTexture(0,Dtex);/将地形纹理选入设备。Device-SetStreamSource(0,m_pVertexBuffer,0,sizeof(MAPCUSTOMVERTEX);/将地形顶点缓存选入设备。Device-SetIndices(m_

37、pIndexBuffer);/将地形顶点索引选入设备Device-SetFVF(MAPCUSTOMVERTEX_FVF);/设置顶点格式D3DXMATRIX I;D3DXMatrixIdentity(&I);Device-SetTransform(D3DTS_WORLD, &I);/设备世界坐标系坐标Device-DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0, 0,this-num_col*this-num_row,0,(this-num_col-1)*(this-num_row-1)*2);/渲染地形下面讲述GeneralTerrain的渲染函数Get

38、PositionHeight的实现float GeneralTerrain:GePositionHeight(float x, float z)/将地图移动到原点,方便计算x = (float)(num_col-1)*length / 2.0f) + x;z = (float)(num_row-1)*length / 2.0f) - z;/将地图大小单位化,方便计算x /= (float)length;z /= (float)length;/计算x,z坐标所在的行列值float col = :floorf(x);float row = :floorf(z);/ 获取如下图个顶点的高度/ / A

39、 B/ *-*/ | / |/ *-* / C Dloat A = GetHeight(int)row, (int)col);float B = GetHeight(int)row, (int)col+1);float C = GetHeight(int)row+1, (int)col);float D = GetHeight(int)row+1, (int)col+1);float dx = x - col;float dz = z - row;float height = 0.0f;if(dz SetSamplerState(0, D3DSAMP_ADDRESSU, D3DTADDRESS

40、_CLAMP);/设置世界坐标系中的坐标if(pos = NULL)D3DXMATRIX temp;D3DXMatrixIdentity(&temp);Device-SetTransform(D3DTS_WORLD, &temp);elseDevice-SetTransform(D3DTS_WORLD, pos);/加载顶点缓存,和顶点格式,关闭光源。Device-SetStreamSource(0,this-m_pVertexBuffer,0,sizeof(CUSTOMVERTEX);Device-SetFVF(CUSTOMVERTEX_FVF);Device-SetRenderState(

41、D3DRS_LIGHTING, false);/循环显示天空盒中的各个面for(int i = 0; iSetTexture(0, Skytexi);Device-DrawPrimitive(D3DPT_TRIANGLESTRIP,i*4,2);Device-SetRenderState(D3DRS_LIGHTING, true);/设置设备光源为开启4.2.3 UI的实现游戏中的UI是使用了DirectX里的一个ID3DXSprite接口来实现的。ID3DXSprite是DriectX 9.0里面的一个简单模块,在DriectX 9.0帮助文档里面对其功能的描述为:“向用户提供一套简单的在屏

42、幕上实现精灵渲染的接口。”何为精灵渲染,说白了就是渲染画面,ID3DXSprite帮助用户透过简单的操作就能运用DriectX 9.0制作游戏(渲染图形),ID3DXSprite的功能还包括:帮助用户在游戏里面实现“公告牌”技术。游戏中正是利用了“公告牌”技术再配合自定制的按钮和文字系统来实现游戏的启动界面、游戏结束界面、角色状态栏的UI界面。ID3DXSprite的使用过程一般如下:一、利用D3DXCreateSprite函数得到一个ID3DXSprite的实例对象。二、加载相关的要显示的UI纹理。三、设置显示属性。四、显示渲染UI。五、回收资源。游戏中对ID3DXSprite的使用封装了一

43、个CSprite类,下面来讲述游戏中的UI类CSprite的实现class CSpritepublic:CSprite();CSprite();HRESULT Init(IDirect3DDevice9* pd3dDevice);HRESULT LoadTexture(IDirect3DDevice9 *pd3dDevice,UINT index,LPCWSTR sthPath);HRESULT Render(UINT Index);D3DXVECTOR2 SetPosition(D3DXVECTOR2*pos);D3DXVECTOR2* GetPosition();float SetAngl

44、e(float angle);float GetAngle();D3DXVECTOR2 SetSize(D3DXVECTOR2*size);D3DXVECTOR2* GetSize();void OnLostDevice();void Destory();void SetIsRender(bool isrender);bool IsRender();private:UINT m_TexIndex;/当前要渲染的索引ID3DXSprite* m_pPicSprite;/实例指针LPDIRECT3DTEXTURE9 m_pTex9;/UI纹理数组float m_angle;/旋转角度bool m_

45、isRender;/是否渲染标志D3DXVECTOR2 m_size;/显示大小D3DXVECTOR2 m_position;/显示位置;Init用于得到ID3DXSprite的实例对象。LoadTexture用于加载要显示的UISetPosition、GetPosition用于设置或得到某特定UI在游戏窗口中的二维坐标(注:窗口左上角的坐标为(0,0))。SetSize用于设置某特定UI的大小。当游戏加载了指定的UI图片时,就可以根据程序的需要来显示相应的UI界面我们在主程序中加入CSprite*g_pBillBoard这个变量。在OnCreateDevice里new一个CSprite的实例

46、对象并将指针传给pBillBoard,调用pBillBoard的LoadTexture函数来加载UI资源。在OnResetDevice里调用pBillBoard的Init函数来实例化ID3DXSprite对象。OnLostDevice里调用pBillBoard的OnLostDevice函数,当游戏结束时在OnDestroyDevice里调用pBillBoard的Destory函数回收资源。主程序中添加了一个全局函数RenderUI用于渲染UI时做相关的设置。只要在OnFrameRender函数里添加RenderUI函数就可以显示相应的UI了。下面展示出RenderUI函数的内容,说明如何显示相

47、应的UI。下面讲述CSprite的渲染函数Render的实现HRESULT CSprite:Render(int Index)HRESULT hr;/设置UI在窗口中的二维坐标D3DXMATRIX mat;D3DXMatrixTransformation2D(&mat, NULL, m_angle, &m_size,NULL, 0, &m_position); m_pPicSprite-SetTransform(&mat);/设置启用ALPAHA通道,并渲染m_pPicSprite-Begin(D3DXSPRITE_ALPHABLEND );hr=m_pPicSprite-Draw(m_pTe

48、xIndex,NULL , NULL,NULL, 0xffffffff);m_pPicSprite-End();return hr;程序添加了一个BillBoardInfo结构的全局变量用于控制UI的显示。BillBoardInfo结构的内容如下:struct BillBoardInfoBillBoardInfo()herobloodPercent=_monsterbloodPercent=_monsterbloodPercent=0;float _herobloodPercent;/英雄角色状态栏中血量条的当前血量显示百分比float _monsterbloodPercent;/怪物角色状态

49、栏中血量条的当前血量显示百分比float _MonsterIndex;/要显示的怪物状态栏索引;下面讲述主程序中的RenderUI函数的实现 void RenderUI()/判游戏是否开始,如果是刚根据情况渲染角色状态栏if(g_bGameStart)/保存旧的坐标,角度和大小D3DXVECTOR2 oldpos;D3DXVECTOR2 oldsize;float oldangle;/防止显示的血量倒流if(g_billBoardInfo._herobloodPercent=0.0f)g_billBoardInfo._herobloodPercent=0;if(g_billBoardInfo.

50、_monsterbloodPercentIsRender()/设置英雄UIoldpos=g_pBillBoard-SetPosition(&D3DXVECTOR2(0.0f,0.0f);oldsize=g_pBillBoard-SetSize(&D3DXVECTOR2(1.2f,1.2f);g_pBillBoard-Render(2);g_pBillBoard-SetPosition(&oldpos);g_pBillBoard-SetSize(&oldsize);oldpos=g_pBillBoard-SetPosition(&D3DXVECTOR2(145.0f,37.2f); oldsiz

51、e=g_pBillBoard-SetSize(&D3DXVECTOR2(1.2f*g_billBoardInfo._herobloodPercent,1.35f);g_pBillBoard-Render(6);g_pBillBoard-SetPosition(&oldpos);g_pBillBoard-SetSize(&oldsize);/设置被选怪物UIif(g_billBoardInfo._MonsterIndex2&g_billBoardInfo._MonsterIndexSetPosition(&D3DXVECTOR2(450.0f,5.0f);oldsize=g_pBillBoard

52、-SetSize(&D3DXVECTOR2(1.2f,1.2f);g_pBillBoard-Render(g_billBoardInfo._MonsterIndex);g_pBillBoard-SetPosition(&oldpos);g_pBillBoard-SetSize(&oldsize);oldpos=g_pBillBoard-SetPosition(&D3DXVECTOR2(455.0f,39.2f);oldsize=g_pBillBoard-SetSize(&D3DXVECTOR2(1.21f*g_billBoardInfo._monsterbloodPercent,1.5f);g

53、_pBillBoard-Render(6);g_pBillBoard-SetPosition(&oldpos);g_pBillBoard-SetSize(&oldsize);else/游戏结束界面if(g_bGameOver)g_bGameStart=false;g_pBillBoard-SetPosition(&D3DXVECTOR2(0.0f,0.0f);g_pBillBoard-SetSize(&D3DXVECTOR2(2.0f,1.5f);g_pBillBoard-Render(1);return;/渲染声明if(g_billBoardInfo._MonsterIndex=-1)g_p

54、BillBoard-SetPosition(&D3DXVECTOR2(0.0f,0.0f);g_pBillBoard-SetSize(&D3DXVECTOR2(1.0f,1.0f);g_pBillBoard-Render(7);/渲染控制说明else if(g_billBoardInfo._MonsterIndex=-2)g_pBillBoard-SetPosition(&D3DXVECTOR2(0.0f,0.0f);g_pBillBoard-SetSize(&D3DXVECTOR2(1.0f,1.0f);g_pBillBoard-Render(8);/渲染开始界面elseg_pBillBoa

55、rd-SetPosition(&D3DXVECTOR2(0.0f,0.0f);g_pBillBoard-SetSize(&D3DXVECTOR2(1.0f,1.0f);g_pBillBoard-Render(0);程序中定制了自定义的按钮,下面贴出如何自定按钮的代码和注解来作为说明。CDXUTElement*g_element;/临时控件控制指针RECT rc;/矩形变量rc.top=rc.left=0;rc.bottom=60;rc.right=260;/为g_HUD对话框设置消息处理函数,添加控件g_HUD.SetCallback( OnGUIEvent ); g_HUD.AddButton( IDC_BUTTONSTART, L开始, 0, 0, 150,

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

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!