2024年4月5日发(作者:历梦寒)
四川师范大学本科毕业设计
基于DirectX的小游戏的设计与实现
学生姓名
学 号
所 在 系
专业名称
班 级
指导教师
**********
计算机科学与技术系
计算机科学与技术
2008级计科(网络)1班
四川师范大学
二○一二年五月
四川师范大学本科毕业设计
基于DirectX的小游戏
学生: 指导教师:
内容摘要:
开发一款好的游戏成为了目前IT界关注的主题,目前游戏产业属欧美,
韩国做的最好,人们对国产游戏产生了怀疑,它们为什么能开发出好的游戏来了,究竟
怎么设计一款游戏,怎么制作开发一款游戏,成为了一个热门话题,所以作为对游戏感
兴趣的我,利用微软推出的DirectX 图形开发库来进行DirectX的D3D打斗小游戏的
设计与实现,整个过程重点阐述了DirectX游戏开发过程中所有的重要环节,包括了
3D游戏制作过程中的3D建模,碰撞检测,打斗机制,场景渲染,智能NPC等等技术,
从而实现逼真的场景渲染,英雄角色和NPC的打斗的一个小游戏。玩家可以通过鼠标和
键盘进行游戏,有很高的可玩性。同时也向大家揭开3D游戏的面纱,使大家了解3D游
戏的简单开发过程,消除游戏制作的神秘感,让每个人都了解3D游戏开发,使每个人
都能开发3D游戏,并对实现D3D游戏技术难点和关键手段作了详细的分析和研究,提
出了系统设计方案,明确了本课题实现的功能和目标。
关键词:
DirectX 碰撞检测 打斗机制 智能NPC
I
四川师范大学本科毕业设计
Based on the DirectX small game
Abstract:
Develop a good game will become the main subject of the current IT
sector, the best of the current game industry is Europe and the United States,
South Korea ,people in the domestic game had doubts. Why they develop so such
good game, how to design a game, how making a game development has become a hot
topic, as for my interest of game i describes the design and achievement process
of a fighting game based the D3D DirectX which Microsoft release, it contain
all of the important parts,including the 3D game production process of 3D
modeling, collision detection, fighting mechanism, scene rendering, smart NPC
and other technologies,to achieve realistic rendering, heroic characters and
NPC's fighting in the game. players can play games by using mouse and keyboard,
have a high playability. And it open the veil of 3D game ,so that we can understand
the simple 3D game development process, eliminate the mystery of game
production,so that everyone can develop 3D games, and D3D games to achieve key
technical problems and means of detailed analysis and research, and system
design, specifically the function of this task and goals to achieve.
Keywords:
DirectX Collision detection Fighting mechanism Smart NPC
II
四川师范大学本科毕业设计
目 录
前言 .................................................................................................................................................. 1
1相关知识简介 ............................................................................................................................. 2
2总体设计 ...................................................................................................................................... 7
2.1概述 ....................................................................................................................................... 7
2.2程序开发步骤 ...................................................................................................................... 7
2.2.1三维建模........................................................................................................................ 7
2.2.2读取模型文件,并进行D3D编程 ........................................................................... 7
2.2.3设计程序所需的类 ....................................................................................................... 7
2.2.4实现类,完成程序的编写 .......................................................................................... 8
2.3系统框图 ............................................................................................................................... 8
2.4功能需求 ............................................................................................................................... 9
3详细设计 ................................................................................................................................... 10
3.1地形模拟,自然环境模拟 .............................................................................................. 10
3.1.1地形模拟..................................................................................................................... 10
3.1.2自然环境模拟 ............................................................................................................ 10
3.2雾效 .................................................................................................................................... 11
3.3角色 .................................................................................................................................... 12
3.4人物控制 ............................................................................................................................ 12
3.5摄像机控制 ....................................................................................................................... 12
3.6碰撞检测 ............................................................................................................................ 13
III
四川师范大学本科毕业设计
3.7打斗机制实现 ................................................................................................................... 14
3.8项目详细类设计 ............................................................................................................... 15
3.8.1游戏主逻辑类 ............................................................................................................ 16
3.8.2摄像机类..................................................................................................................... 17
3.8.3地形类 ......................................................................................................................... 18
3.8.4天空盒类..................................................................................................................... 19
3.8.5角色类 ......................................................................................................................... 20
3.8.6雾效类 ......................................................................................................................... 22
3.8.7静态模型类 ................................................................................................................ 23
3.8.8Input类 ...................................................................................................................... 24
3.8.9WindowClass类 ...................................................................................................... 25
4系统测试 ................................................................................................................................... 26
4.1场景的真实感测试 ........................................................................................................... 27
4.2人物基本的控制情况测试 .............................................................................................. 27
4.3碰撞检测测试 ................................................................................................................... 28
4.4NPC的智能性测试........................................................................................................... 29
5结束语 ....................................................................................................................................... 29
5.1程序的不足 ....................................................................................................................... 29
5.2心得与体会 ....................................................................................................................... 30
参考文献 ...................................................................................................................................... 33
IV
四川师范大学本科毕业设计
DirectX打斗小游戏设计与实现
前言
随着多媒体技术、Internet技术的飞速发展,生活水平的提高,人们开始追求精
神生活的享受,近年来游戏的快速发展,迎合了人们的这一需求,可以说游戏给人们现
实生活中感受不到的东西,人们的方方面面都离不开游戏,从单机游戏发展到网络游戏,
人们对游戏软件的需求日益扩大,将是21世纪具有广阔前景的一门产业。
从目前来看,不管是在游戏开发的技术上还是在设计思想方面,我国和其他发达国
家在游戏开发上还有很大的差距。这主要表现在两个方面:
新闻出版总署近期查处了一批低俗网游,其中充斥着暴力、色情、赌博等不健康内
容,令人触目惊心。关闭了45款未经审批的境外网络游戏;查处了26款存在低俗内容
的网络游戏。警告了27家网络游戏企业,并勒令其限期整改;还有10家网络游戏企业
负责人被诫勉谈话。
当《赤壁》、《诛仙》、《超级舞者》等国产网游在海内外受欢迎时,大量的速成产品
也在垂死挣扎很多公司在推出一款成功的产品之后,就会接着推出第二代、第三代,而
游戏的内容是完全一样的。另外还有很多厂商也会对成功的产品进行大规模的抄袭,换
一个故事、换一个形象就拿去赚钱了。
当今游戏界谁人不知《魔兽世界》,《魔兽争霸》?它的成功激发了欧美网络游戏开
发商把自己的产品尽可能的让东方文化与西方文化相结合欲望。中国玩家正把希望和兴
趣转向欧美优秀的网络游戏产品,同时逐渐的适应和接受欧美网络游戏。
所以综上所述,我国在游戏开发领域还处于初级阶段当前,我们游戏产业发展的当
务之急就是壮大自己的实力,国外游戏发展较为迅猛,它们掌握着先进的技术,从而开
发出来的游戏从可玩性,可观赏性都比国产游戏要好的多。在看下国内,虽然我国游戏
产业这几年有良好的发展,但是相比国外,还有一定差距,这就驱使一些人对游戏开发
产生了动力,可观未来的10年内,游戏产业必将掀起腥风血雨,我国的游戏开发产业
将是一片大好趋势,这也就给我们这些程序员创造了良好的机会,游戏开发将是你最理
智的选择。
目前比较流行的图形开发API是OpenGL和DirectX两种,OpenGL的前身是高端图
形工作站厂商SGI在80年代所开发的IRIS G,它在90年代初期成为了开源的标准。
当时微软在它的Windows 95中发布了DirectX,将它作为OpenGL的竞争对手。而在90
年代末,微软曾经和SGI进行了Fahrenheit项目的开发,试图将两者结合起来,但是
1
四川师范大学本科毕业设计
没有成功。之后微软继续开发DirectX并与GPU厂商合作,留下OpenGL任其发展。OpenGL
之后几乎逐渐消失,直到90年代末Apple放弃了自己的QuickDraw 3D,将OpenGL作
为Mac OS X的官方3D库。Apple的系统给OpenGL程序带来了不少拥护者。之后OpenGL
正式被Linux采用,现在主流的游戏平台,包括PSP,PS3和Wii都支持该技术。
Microsoft推出的DirectX,是专门用于游戏开发和高性能多媒体应用软件开发的
低层API。DirectX是一种应用程序接口,它可让以windows为平台的游戏或多媒体程
序获得更高的执行效率,加强3d图形和声音效果,并提供设计人员一个共同的硬件驱
动标准,让游戏开发者不必为每一品牌的硬件来写不同的驱动程序,也降低用户安装及
设置硬件的复杂度。这样说是不是有点不太明白,其实从字面意义上说,Direct就是
直接的意思,而后边的X则代表了很多的意思,从这一点上我们就可以看出DirectX的
出现就是为了为众多软件提供直接服务的。利用DirectX可以使程序员很容易的开发出
具有高质量的游戏来。随着DirectX不同版本的不断更新,它所包含的东西越来越多,
开发出来的游戏也越来越好,总之DirectX包括DDraw,D3D,DInput,DSound等很多部分,
而OpenGL仅为3D图形接口,OpenGL简单易学,另外OpenGL是跨平台的,最后DirectX
的速度略快,OpenGL的稳定性更高,但表现的都不是很明显。所以我们选择DirectX
来开发这个格斗游戏,因为它包含内容比较全面。而且就是编程方便,很容易控制程序,
其中包含的函数也很容易调用。
本论文以开发一个基于DirectX的游戏作为切入点,讲述利用DirectX开发一个简
单的3D游戏的基本步骤,其中包含的功能有:3D模型驱动、3D骨骼模型驱动、角色控
制器、地形生成器、绚丽的魔法效果、采用ATL(Active Template Library)编写的游
戏脚本解析引擎等等。本设计创建一个游戏场景,场景中的地形高低起伏,带有天空效
果。在场景中有两个角色,一个玩家角色,由用户控制,以实现一个简单的3D游戏。
本毕业设计是一个D3D打斗小游戏的设计与实现,其中包含了D3D游戏实现的重要
环节,我所以选择这个题目,是想学习3D游戏的制作,锻炼自己的动手开发能力,增
加自己的专业知识,同时这款游戏也有一定的发展空间,具有一定的实际意义。
1相关知识简介
DirectX是一种应用程序界面(api),可让以Windows为平台的游戏或多媒体程序
获得更高的执行效率,加强3d图形和声音效果,并提供设计人员一个共同的硬件驱动
标准,让游戏开发者不必为每一品牌的硬件来写不同的驱动程序,也降低用户安装及设
置硬件的复杂度。
2
四川师范大学本科毕业设计
下面我们来举个例子说明DirectX的作用:以前我们玩Dos游戏的时候,都必须设
置声卡的品牌,然后再设置它的irq、i/o、dma,其中有一项设置不对游戏就发不出声。
这部分设置不但让玩家伤透脑筋,对游戏设计者开说也非常头痛!因为游戏设计者做游
戏之初便需要把市面上所有声卡硬件数据都收集过来,然后根据不同的api来写不同的
驱动程序。
现在我们玩Windows游戏,并不会做这些设置,因为DirectX提供了一个共同的应
用程序界面,其实只要这个游戏是依照DirectX来开发的,不管你是什么显卡、声卡、
统统都能玩,而且还能发挥比Dos下更佳的效果。当然,前提是你的显卡、声卡的驱动
程序也必须支持DirectX才行。
前面所说的只是提供一致的应用程序界面,其实要深入了解DirectX的各个组件你
就会更加明白为什么游戏都要支持DirectX了。DirectX由许多API组成,我只介绍几
个重要的部分:
DirectDraw:这是DirectX中非常重要的部分。它担任图形处理的关键。以往在实
地址的Dos下设计游戏时,为了游戏速度的考虑,都让程序直接操作硬件。而在
Windows98这种保护模式下,所有图形的访问动作都必须gdi这个图形处理中心来处理,
而不能直接对硬件下命令,而gdi对连续的画面处理不佳,游戏一旦通过gdi来处理的
话,那么效果会差强人意。
▲ DirectDraw就是来帮助windows程序也能直接进行硬件操作,更进一步还能加
速显卡的速度,使游戏更为流畅。另外DirectDraw还支持mmx、3dnow、agp等技术,
还能处理多屏幕显示,让窗口环境的游戏更加多姿多采。
▲ DirectSound这是用来处理声音的api,除了播放声音和处理混音之外,还加强
了3d音效,并提供了录音功能。前面所举的声卡兼容的例子,就是利用了DirectSound
来解决的。
▲ DirectInput这用来处理游戏的一些外围装置,例如游戏摇杆、gamepad、方向
盘、vr手套、力反馈的各种设备等。以往要在Dos下用方向盘来玩赛车游戏,就要先
调整好irq、dma等各种设置。而现在DirectInput则使这些设备与游戏配合良好,不
需要做特别配置。
▲ DirectPlay这是为了满足近来流行的网络游戏而开发的api,支持多通信协议,
让玩家可以用各种连网方式来进行对战,此外也提供网络对话功能及保密措施。
▲ Direct3D(D3D):d3d的大名相信谁都听过吧!对现在的游戏来说d3d实在是
太重要了!由于3d游戏的兴起,各大厂商纷纷推出3d加速卡为了避免重蹈声卡的覆辙,
3
四川师范大学本科毕业设计
微软从Directx3.0后加入d3d这个api,让3d游戏有一个共同的开发标准。这样当游
戏再执行时若需要绘图时就会通过d3d向显卡驱动程序提出要求从而完成绘图。
▲ DirectX已经经历了很多个版本下面如下:
目前最新版本是DirectX11, 在微软刚刚发布的Windows 7 Beta版本中,一些已
经安装使用的用户的发现了DirectX 11已经包含其中了。DirectX 11作为3D图形接
口,不仅支持未来的DX11硬件,还向下兼容当前的DirectX 10和10.1硬件。DirectX
11增加了新的计算shader技术,可以允许GPU从事更多的通用计算工作,而不仅仅是
3D运算,这可以鼓励开发人员更好地将GPU作为并行处理器使用。
DirectX 1.0:第一代的DirectX很不成功,推出时众多的硬件均不支持,当时基
本都采用专业图形API-OpenGL,缺乏硬件的支持成了其流行的最大障碍。DirectX 1.0
版本是第一个可以直接对硬件信息进行读取的程序,它提供了更为直接的读取图形硬件
的性能(比如:显示卡上的块移动功能)以及基本的声音和输入设备功能(函数),使
开发的游戏能实现对二维(2D)图像进行加速。这时候的DirectX不包括现在所有的
3D功能,还处于一个初级阶段。
DirectX 2.0:DirectX 2.0在二维图形方面做了些改进,增加了一些动态效果,
采用了Direct 3D的技术。这样DirectX 2.0与DirectX 1.0有了相当大的不同。在
DirectX 2.0中,采用了“平滑模拟和RGB模拟”两种模拟方式对三维(3D)图像进行加
速计算的。DirectX 2.0同时也采用了更加友好的用户设置程序并更正了应用程序接口
的许多问题。从DirectX 2.0开始,整个DirectX的设计架构雏形就已基本完成。
图1.1-1 生化危机
4
四川师范大学本科毕业设计
DirectX 3.0:DirectX 3.0的推出是在1997年最后一个版本的Windows95发布后
不久,此时3D游戏开始深入人心,DirectX也逐渐得到软硬件厂商的认可,97年时应
用程序接口标准共有三个,分别是专业的OpenGL接口,微软的DirectX D接口和3dfx
公司的Glide接口。而那时的3dfx公司是最为强大的显卡制造商,它的Glide接口自
然也受到最广泛的应用,但随着3dfx公司被NVIDIA的收购、Voodoo显卡的衰败,Glide
接口逐渐从人们眼中消失了。
图1.1-2 Counter-Strike
DirectX 8.0:DirectX 8.0的推出引发了一场显卡革命,它首次引入了像素渲染
引擎(Vertex Shader)与顶点渲染引擎(Pixel Shader)的概念,反映在特效上就是动态
光影效果。同硬件T&L仅仅实现的固定光影转换相比,VS和PS单元的灵活性更大,它
使GPU真正成为了可编程的处理器。这意味着程序员可通过它们实现3D场景构建的难
度大大降低。通过VS和PS的渲染,可以很容易的宁造出真实的水面动态波纹光影效果。
此时DirectX的权威地位终于建成,代表产品:GeForce4 Ti系列。
DirectX 9.0:2002年底,微软正式发布DirectX9.0,DirectX 9中PS单元的渲
染精度已达到浮点精度,传统的硬件T&L单元也被取消。全新的VertexShader(顶点着
色引擎)编程将比以前复杂得多,新的VertexShader标准增加了流程控制,更多的常量,
每个程序的着色指令增加到了1024条。另外,DX9增加对浮点数据的处理功能,以前
只能对整数进行处理,突破了以前限制PC图形图象质量在数学上的精度障碍,它的每
条渲染流水线都升级为128位浮点颜色,让游戏程序设计师们更容易更轻松的创造出更
漂亮的效果,让程序员编程更容易。
5
四川师范大学本科毕业设计
Visual studio 2005知识简介
开发工具我们选择Visual studio 2005集成开发环境。
Visual Studio 是一套完整的开发工具集,用于生成 Web 应用程序、XML
Web Services、桌面应用程序和移动应用程序。Visual Basic、Visual C++、Visual C#
和 Visual J# 全都使用相同的集成开发环境 (IDE),利用此 IDE 可以共享工具且有助
于创建混合语言解决方案。另外,这些语言利用了 .NET Framework 的功能,通过此框
架可使用简化 ASP Web 应用程序和 XML Web Services 开发的关键技术。
该框架为开发人员提供了统一的、面向对象的、分层的和可扩展的类库集 (API)。
目前,C++ 开发人员使用 Microsoft 基础类,而 Java 开发人员使用 Windows 基础类。
该框架统一了这些完全不同的模型,还为 Visual Basic 和 JScript 程序员提供了对
类库的访问。通过创建跨所有编程语言的公共 API 集,公共语言运行库使得跨语言继
承、错误处理和调试成为可能。从 JScript 到 C++ 的所有编程语言具有对框架的相似
访问,开发人员可以自由选择它们要使用的语言。
2005 年,微软发布了 Visual Studio 2005。.NET 字眼从各种语言的名字中被抹
去,但是这个版本的 Visual Studio 仍然还是面向 .NET 框架的(版本2.0)。它同时
也能开发跨平台的应用程序,如开发使用微软操作系统的手机的程序等。总体来说是一
个非常庞大的软件,甚至包含代码测试功能。这个版本的 Visual Studio 包含有众多
版本,分别面向不同的开发角色。同时还永久提供免费的 Visual Studio Express 版
本。
3D Studio Max知识简介
建模工具我们选择Autodesk公司开发的3D Studio Max,3D Studio Max,常简称
为3ds Max或MAX,是Autodesk公司开发的基于PC系统的三维动画渲染和制作软件。
其前身是基于DOS操作系统的3D Studio系列软件,最新版本是2011。在Windows NT
出现以前,工业级的CG制作被SGI图形工作站所垄断。3D Studio Max + Windows NT
组合的出现一下子降低了CG制作的门槛,首选开始运用在电脑游戏中的动画制作,后
更进一步开始参与影视片的特效制作,例如X战警II,最后的武士等。
在应用范围方面,广泛应用于广告、影视、工业设计、建筑设计、多媒体制作、游
戏、辅助教学以及工程可视化等领域。拥有强大功能的3DS MAX被广泛地应用于电视及
娱乐业中,比如片头动画和视频游戏的制作,深深扎根于玩家心中的劳拉角色形象就是
3DS MAX的杰作。在影视特效方面也有一定的应用。而在国内发展的相对比较成熟的建
筑效果图和建筑动画制作中,3DS MAX的使用率更是占据了绝对的优势。根据不同行业
6
四川师范大学本科毕业设计
的应用特点对3DS MAX的掌握程度也有不同的要求,建筑方面的应用相对来说要局限性
大一些,它只要求单帧的渲染效果和环境效果,只涉及到比较简单的动画;片头动画和
视频游戏应用中动画占的比例很大,特别是视频游戏对角色动画的要求要高一些;影视
特效方面的应用则把3DS MAX的功能发挥到了极至。
2总体设计
2.1概述
D3D打斗小游戏主要是利用微软的DirectX API来制作一款打斗小游戏,其中包括
了游戏制作的重要过程,3D建模,碰撞检测,打斗机制等等。
2.2程序开发步骤
2.2.1三维建模
3Ds max是一套用于制作三维动画的应用软件,其三维建模功能十分强大,所以利
用3Ds max能够建立很好的模型出来,并且生成的 3DS文件是一种非常普遍的数据格
式,用它建模不仅大大缩短建模时间而且提高建模效率.
本项目需要建立的模型有房子,树,木车子,小狗,英雄,NPC等。
2.2.2读取模型文件,并进行D3D编程
根据第一步用3ds max进行建模,之后把 3DS文件转换成 .X格式的可以被DirectX
识别的文件,之后程序载入这些模型,因为转换了格式所以图形都变成了一些顶点的集
合,这样程序就能很好的对图形进行控制,以便于实现对模型的控制,从而达到所要达
到的目的。
2.2.3设计程序所需的类
本程序包括16个类,他们都是D3D程序的基本类,比如,摄像机类,可以说它是
说有3D项目中都有的类,因为你必须在场景中架设一个摄像机,这样才能实现观察场
景,漫游场景的目的,还有控制类,对于有好的用户交互的程序时良好的,控制类提供
了键盘响应方法,这样就可以让运行者很好的控制角色。等等的这些都是D3D程序所必
须包含的,所以很有研究价值。
本项目的类都具有一定联系,他们都是相互依赖的,下面是项目中的一些类关系图,
从图中我们可以很清楚的看出它们之间具有很大的联系性:
7
四川师范大学本科毕业设计
图2.2.3-1 系统类图
上图表现了程序的大体框架,表现为3层:
第一层:首先是由CFloor,CSkyBox,CFog类来创建程序的场景框架,地面,天空,
和雾效,
第二层:这一层主要是CCamera类和碰撞检测类CmeshObject,摄像机类是程序中
的重要类,因为它是想外部展现程序的窗口,我德项目中用的是CFreeCamera类,它是
由CCamera类继承等到的,里面添加了很多新的功能,再有就是碰撞检测类,有了碰撞
检测类,使程序变得更加智能。
最后一层就是:游戏主类,由于第一层,第二层的成功创建,游戏基本环境就被模
拟出来,而且是十分良好的,所以在这些基础上就可以最主角色类进行设计,里面有
CRole,CNpc,CDirectinput类等等,这些类都是用来支持响应用户输入以及英雄的动作
的,比如英雄的响应鼠标事件,英雄的碰撞检测等等。
2.2.4实现类,完成程序的编写
设计算法,实现类中的成员方法,以完成程序。
由于D3D为我们提供了很强大的API所以我们就可以真对想要达到的想过来实现类
中的方法,比如可以用向量和矩阵之间的点乘和叉乘,来改变向量或者矩阵的状态,从
而改变图形或者物体的状态,例如人物的行走等等。
2.3系统框图
系统框图是表现整个程序的架构图。
如图2.3-1所示:
8
四川师范大学本科毕业设计
图2.3-1 系统框图
从图2.3-1可以看出,系统设计大致分为两大块。
第一:场景的构建,场景构建主要就是模型的构建,其中就包括为例材质,比如要
构成树木的图片,天空盒的图片。还有就是些其他模型的构建,人物模型,道具模型等,
这些需要准备的东西有了之后就可以建立我们的3D场景了。
第二:角色的控制。也就是和用户的交互,用户可以通过输入来控制人物模型已达
到一定的目的。这部分大致就是利用D3D为我们提供的函数接口,来实现对人物的控制,
于此同时场景调度,碰撞检测,地形匹配也是很重要的,所以在这部分也要实现它们,
有了它们我们的程序才会十分的智能,也就是人物不可能穿过建筑物,或者人物能够爬
上山坡等等。
2.4功能需求
本程序的功能大体上就是在运行程序以后D3D可以成功载入我们的模型文件,成功
渲染场景,之后用户能够通过鼠标和键盘的操作来控制英雄的移动,比如可以爬到山坡
来俯瞰场景,漫游整个场景,可以去牵着小狗一同行走,还有就是能够和NPC进行对战,
其中W,S,A,D是人物进行前,后,左,右移动,C是踢脚,F是出拳,鼠标左键改变摄
像机的视角方向,鼠标右键改变人物的行走方向。程序流程图如下:
9
四川师范大学本科毕业设计
图2.4-1 系统流程图
3详细设计
3.1地形模拟,自然环境模拟
3.1.1地形模拟
在本项目中,利用高度图和均匀网格算法来生成地形,高度图可以有两个作用:一
方面,通过高度图存储每个地形节点的高度信息,另一方面,通过高度图的尺寸决定地
形网格的顶点数目。
本项目中,使用一张“128*128”像素的BMP格式的位图作为高度图。在高度图中
地形高度最低的部分,即颜色最深的部分为地平面,白色为山坡。
图3.1.1-1 地形纹理图
3.1.2自然环境模拟
三维场景里的天空并不是“真正”的天空,而是用图片拼起来的,欺骗我们眼睛。
10
四川师范大学本科毕业设计
通常把大家所在的场景用一个几何体包裹起来,再在里面贴上从各个角度的风景图,之
后把摄像机放到场景里面,这样视角就被盒子包围起来,就好像一个真正的环境一样。
想想CS之类的天空,是不是有点印象?
本程序采用最常见的天空盒的方法,天空盒是一个六面体的盒子,通过给6个面添
加无缝连接的纹理,形成天空的效果。天空盒的优势在于盒子只有12个三角形面,渲
染所占用的资源少,速度快。天空盒纹理:
图3.1.2-1 天空纹理图
3.2雾效
在场景中,除了应用天空盒和太阳光晕来烘托场景的气氛;还可以为场景添加雾效,
以模拟出一种景深效果雾化效果能增加场景的真实感,纵深感和距离感,创造环境氛围。
微软的Direct3D提供两种类型的雾:定点雾和像素雾。雾化结果不仅可以用于模拟雾,
也能减少远处场景的清晰度。产生一种雾里看花,水中望月的朦胧美。雾效是通过景物
颜色与雾的颜色,以随物体和观察点距离增加面衰减的混合因子混合实现。本项目中,
11
四川师范大学本科毕业设计
提供了三种雾效分别为:线性雾化、指数雾化、平方指数雾化。由于雾化是通过硬件实
现,不会增加过多的系统资源消耗,所以在场景中只使用了平方指数雾化。
3.3角色
在游戏中,玩家角色和NPC角色使用绑定骨骼的三维模型。玩空控制的角色需要接
收玩家的输入控制来产生相应的行为,面NPC角色则添加人工智能(AI)进行简单的行为
活动。
3.4人物控制
人物移动控制是单机和网游中比较重要的部分,但前单机游戏使用动力学以及IK
动画已经达到了非常逼真的地步,在大型网络游戏中这样的物理模拟同步是很实现的,
因此在目前多数网游中仍旧是采取使用一个包围体(盒子或者胶囊)来模拟人物。
本程序中玩空控制的角色需要接收用户输入,因此,需要添加用户控制的模块。通
常情况下都是通过鼠标和键盘来工同操作。
项目中,对角色的控制使用键盘的“W”、“S”、“A”、“D”分别表示上、下、左、右
4个方向上的移动,而攻击行为为“F”、“C”,同时鼠标的右键控制角色的旋转。
3.5摄像机控制
游戏中摄像机为尾随摄像机,另外使用鼠标左键对摄像机作俯、仰、旋转视角的相
应处理,可以对玩家控制的角色在不同方位上的观察。DirectX提供了一个摄像机基类
如下:
图3.5-1 摄像机类图
12
四川师范大学本科毕业设计
从上面的类中可以看出,摄像机类是很全面的,其中它用4个向量成员变量分别表
示right,up,look方向以及摄像机当前位置pos,这其中还有几个重要的成员函数,
strafe表示摄像机可以左右移动,fly表示摄像机上下移动,这个函数在有飞行的程序
中是很重要的,walk表示前后移动,pitch表示在right向量上的步长或者缩短,roll
则表示在视角方向的旋转。其他的就是些控制摄像机对象状态的方法。
3.6碰撞检测
在本项目中,使用最简单的碰撞检测,只对玩家与NPC或者场景的静态模型是否发
生碰撞的相应处理,而NPC之间没有进行碰撞检测,主要采用的技术是包围盒检测。
实现碰撞检测是十分必要的,在本系统中拟采用包围盒技术,包围盒的各线段与坐
标轴平行,最大好处是可以实现快速碰撞检测,特别是在证明两个物体并不相交时是非
常有效的。
碰撞检测算法在图形学中已经很成熟了,大致就是判断物体运动方向是否有多边
形,之后判断多边形的类型,不如山坡和建筑物都是多边形,但是处理这两种类型的碰
撞的方法是不同的,碰撞检测算法流程图如图表3.6-1:
图3.6-1 碰撞检测流程图
从图3.6-1我们看出在虚拟环境中,由于用户的交互和物体的运动,此时为保持环
境的真实性,需要及时检测到这些碰撞,并计算相应的碰撞反应,更新绘制结果,否则
物体会发生穿透现象,破坏虚拟环境的真实感和用户的沉浸感 在碰撞检测中,第一是
检测到碰撞的位置;第二是计算碰撞后的反应。考虑碰撞检测方法以及虚拟漫游测的特
13
四川师范大学本科毕业设计
殊要求本漫游引擎中采用基于视点向前线段探测的碰撞检测方法,如图3.6-2所示:
图3.6-2 碰撞检测原理图
▲ 视点为V(在漫游系统中是虚拟人的头部位置);
▲ 取视线上沿运动方向距离为d的点M这是因为某一时刻只有在虚拟人运动的方
向才有可能产生碰撞;
▲ 连接V和M形成线段;
▲ 计算求得与线段V2L4相交的物体,若其不与任何物体相交,则判断为无碰撞;
若线段与多个物体相交,则存在多个交点.此时求得与视点最近的交点C1即为碰撞检
测点,这个最短距离就是碰撞距离.为了找到碰撞点,最核心的运算是求交.由于在漫
游系统中,各种实体模型都是由多边形组成的,所以线段和物体之间的求交运算,可以
从2个方面考虑:第一,线段与长方体相交;第二,线段与多边形相交;但是,当视点
与物体的距离大大超过线段的长度时,只需判断出它们不可能相交,而不必求它们的交
点.因此,系统只对视点与物体包围盒的相交进行运算,以减少不必要的求交运算.一
旦发生了视点与虚拟物体之间的碰撞,输入设备给出的前进或后退的指令将立刻被忽
略,这是在漫游引擎中给出的简单碰撞响应。
在现实中,并不是所有的面都会阻挡角色的前进,例如,楼梯的竖面和平缓的山坡
斜面,这些面在碰撞检测中都可以检测到,但是在现实生活中这样的面不会阻挡人的前
进.因此,当碰撞到这种面时,系统应该能做出正确判断和适当处理,让视点能继续前
进.采用的方法是,在漫游系统中给这样的实体设置一个共同的属性,如果与这些实体
碰撞时,则对它们进行特殊处理。
3.7打斗机制实现
14
四川师范大学本科毕业设计
程序中英雄可以和NPC进行打斗,玩家可以通过W,S,A,D,F,C来进行上,下,左,
右,出拳,踢脚来对英雄进行控制,在CNpc类和CRole类中有记录NPC和英雄血量值,
魔法值的变量m_HP,m_MP,所以程序在打斗过程中伴随着英雄出招的动作就会对NPC和
英雄对象中的变量进行读取,同时做相应的运算,直到有一方的血量不大于零位置,若
是NPC对象,则程序撤销NPC对象,若是英雄对象,则程序显示英雄死亡,游戏结束,
同时结束程序。
图3.7-1 打斗流程图
3.8项目详细类设计
首先,设计一个Cgame类,作为整个场景的逻辑类。同时在类中,定义其他具体的
实现类的对象,进行调用,以实现整个场景。
场景中每个要素都可以封装在单独的类,在Cfloor类中封装了地形的实现;在
CskyBox类中封装了天空盒的实现;在Cfog类中封装了雾效的实现;在CmeshObject
类中封装了静态模型的实现;在CNpc类中封装了角色的实现;在CFreeCamera类中封
装了摄影机的实现;在CdirectInput类中封装了键盘和鼠标输入的实现。
由于玩家控制的角色行为跟其它NPC的行为操作不一样,其它的属性都是相同的,
因此,定义CNpc类作为CRole类的基类。
在场景中可能有多种摄像机,项目中是以CFreeCamera类为基类,它的属性集合了
其它摄像机的相同属性,因此,定义Ccamera继承以CfreeCamera类。
15
四川师范大学本科毕业设计
图3.8-1 项目类关系图
图3.8-1表示了在项目中所有类都是为CGame类提供服务的。
在本项目中,还有其它的TXT文件读取类等。它们在此项目中只作为辅助类使用。
3.8.1游戏主逻辑类
CGame
- m_pCamera:CCamera*
- m_floor:CFloor*
- m_lpfog:CFog*
- m_lpskybox:CSkyBox*
- m_pHero:Role*
- m_pMonster:CRole*
- m_pDog:CRole*
- m_meshObj:vector
- m_timeFrame:float
- m_timeNow: float
+ CGame(in devicePointer: IDirect3DDevice9*,in hWnd: HWND,in hInst:
HINSTANCE)
+ ~Cgame()
+ IntiGame():BOOL
16
四川师范大学本科毕业设计
+ KeyPressManage()
+ CollisionTest():BOOL
+ CDisplay()CGame是程序的主类,它是组织程序框架的关键类,它包括了构成场
景对象的指针,比如摄像机对象,地形对象,天空盒对象,角色对象等等。它还负责初
始化工作,初始化游戏,初始化键盘管理,初始化碰撞检测,最后显示程序界面。
3.8.2摄像机类
CFreeCamera
- m_position: D3DXVECTOR3
- m_up: D3DXVECTOR3
- m_look: D3DXVECTOR3
- m_right: D3DXVECTOR3
- m_fMaxPitch: float
- m_fMinPitch: float
- m_fPitchAdd: float
- m_fMinNear: float
- m_fMaxFar: float
- m_scrWidth: UINT
- m_scrHeight: UINT
+ CFreeCamera(IDirect3DDevice9* devicePointer)
+ ~CFreeCamera()
+ Strafe(float units)
+ Fly(float units)
+ Walk(float units)
+ Pitch(in angle: float)
+ Yaw(in angle: float)
+ Roll(in angle: float)
+ GetViewMatrix(in veiw: D3DXMATRIX*)
+ GetProj(in nProj: D3DXMATRIX*)
CCamera
- m_distance: float
- m_minDistance: float
17
四川师范大学本科毕业设计
- m_maxDistance: float
- m_fYaw: float
- m_fPitch: float
- m_vDeltaPos: D3DXVECTOR3
- m_vLastPos: D3DXVECTOR3
+ CCamera(in devicePointer: IDirect3DDevice9*)
+ ~CCamera()
+ SetCameraY(in y: float): BOOL
+ SetLookAt(in vLastPos: D3DXVECTOR3*)
+ SetDeltaPos(in vNewPos: D3DXVECTOR3*)
+ TransformYawPitch(in nYaw: float,in nPitch: float)
+ NearFarMove(in fMove: float)
+ UpdateCamera()
CFreeCamera类是摄像机类,它是由CCamera派生得到的,摄像机类是向外展示场
景的重要类,其中有几个重要的方法,Strafe,Fly,Walk,Pitch,Yaw,Roll它们是
控制视角的重要方法,比如Strafe是控制摄像机左右移动的方法,想象在游戏中人物左
右移动用的就是这个方法,Roll方法是视角转动方法,调用摄像机对象的此方法就可
以改变场景的观察视角。
3.8.3地形类
CFloor
- m_vertexBufferPointer: IDirect3DVertexBuffer9*
- m_indexBufferPointer: IDirect3DIndexBuffer9*
- m_texturePointer: IDirect3DTexture9*
- m_pHeightMap: IDirect3DTexture9*
- m_HeightMapDesc: D3DSURFACE_DESC
- m_floorPos: D3DXVECTOR3
- m_border: float
- m_col: DWORD
- m_row: DWORD
- m_NumVertexs: WORD
- m_pHeightData: BYTE*
18
四川师范大学本科毕业设计
- pVertex: CVertex*
+ CFloor(in border: float)
+ ~CFloor()
+ CSetDevicePointer(in devicePointer: IDirect3DDevice9*)
+ TextureHeightMap(in FloorMap: char*,in mapPathHead: char*): HRESULT
+ LoadHeightMap(in FloorMap: char*,in mapPathHead: char*,in hInstance:
HINSTANCE): BOOL
+ CSetVertexBuffer(): HRESULT
+ CSetIndexBuffer(): HRESULT
+ CSetTexture(): HRESULT
+ CSetTranslation()
+ GetHeight(in hPos: D3DXVECTOR3*)
+ CSetUp()
+ CPrintPrimitive()
地形模拟类CFloor,地形模拟类是构建场景地形环境的类,类中的成员标量定义
了地形的顶点缓存和顶点索引缓存,有了这两个成员我们就可以把地形数据化成一些列
连续的数据块,之后通过输送到显卡现存中进行地形渲染,以构造地形环境。
3.8.4天空盒类
CSkyBox
+ m_boxVertexBuffer: IDirect3DVertexBuffer9*
+ m_boxIndexBuffer: IDirect3DIndexBuffer9*
+ m_skyVertexBuffer: IDirect3DVertexBuffer9*
+ m_skyIndexBuffer: IDirect3DIndexBuffer9*
+ m_textures[7]: IDirect3DTexture9*
+ m_texNumIndex: int
+ m_segment: int
+ m_size: float
+ m_skyTile: float
+ m_uSpeed: float
+ m_vSpeed: float
+ m_angle: float
19
四川师范大学本科毕业设计
CSkyBox(in devicePointer: IDirect3DDevice9*,in nSize: float,in nSegment:
int,in skyTile: float)
~CSkyBox()
+ InitBox():HRESULT
+ InitSky():HRESULT
+ LoadSkyBoxTexture(in skybox: char*,in imagePathHead: char*): HRESULT
+ SetMatrix(in pos: D3DXVECTOR3)
+ RenderSkyBox(in pos: D3DXVECTOR3,in framTime: float)
和地形模拟类CFloor类似,自然环境类我们用一个天空盒类CSkyBox表示,它的
重要成员变量依旧是又顶点缓存和顶点索引缓存构成,用来记录天空盒的顶点信息,其
中还有定义天空盒大小的m_size变量,天空盒包围和片数的m_skyTile变量,方法
InitBox()和InitSky()用来初始化天空盒RenderSkyBox()用来渲染天空盒,即绘制天
空盒。
3.8.5角色类
CNpc
- m_Angle: float
- m_Scale: float
- m_LifeTime: float
- m_Speed: float
- m_attackBound: float
- m_fSeeing: float
- m_vPos: D3DXVECTOR3
- m_vDirection: D3DXVECTOR3
- m_vMin: D3DXVECTOR3
- m_vMax: D3DXVECTOR3
- m_Action: ROLEACTION
- m_pMesh: CSkinMesh*
CNpc(IDirect3DDevice9* devicePointer,char* strFileName)
~CNpc()
+ SetSpeed(in speed: float)
+ SetNpcPos(in nPos: D3DXVECTOR3)
20
四川师范大学本科毕业设计
+ SetNpcDirection(in nDirection: D3DXVECTOR3*)
+ SetNpcScal(in nScal: float)
+ SetNpcRot(in nAngle: float)
+ GetAction():ROLEACTION
+ SetMinAndMaxPoint()
+ GetMinPoint(in vMin: D3DXVECTOR3*)
+ GetMaxPoint(in vMax: D3DXVECTOR3*)
+ GetPosition():const D3DVECTOR*
+ GetDirection():const D3DVECTOR*
+ GetPos(in vPos: D3DVECTOR*)
+ GetAngle():float
+ SetAction(in action: ROLEACTION)
+ SetNpcY(float y)
+ NpcMove(in vPos: D3DXVECTOR3*)
+ AABBCollision(in vMin: D3DXVECTOR3*,in vMax: D3DXVECTOR3*): BOOL
Render(in nTime: float)
CRole
- m_Level: UINT
- m_HP: LONG
- m_MP: LONG
- m_Experiece: LONG
- float m_DirAngle
- float m_tempAngle
- m_bWalk: BOOL
- m_bRun: BOOL
+ CRole(IDirect3DDevice9* devicePointer,char* strFileName);
+ ~CRole();
+ SetRoleDirection(in angle: float)
+ GetRole(D3DXVECTOR3* vPos)
+ GetRoleAngle():float
+ RoleRoll(in angle: float)
21
四川师范大学本科毕业设计
+ RoleLogic(in nInput: CDirectInput*)
+ Update(in fTime: float)
+ Render(in nTime: float)
程序中有两种角色,第一是英雄,第二个就是和英雄打斗的NPC,但是英雄又属于
特殊的NPC所以可以构造NPC类之后派生出英雄类,只是在NPC基类的基础上再添加些
方法或者属性罢了,CNpc类中定义了NPC的叫声,生存时间,速度,攻击范围等基本
状态变量,还有一些改变状态的成员方法比如: SetSpeed()用来设定NPC的速度,
SetAction(),用来设置NPC的动作,当然还提供了获取状态的方法,如GetPosition()
获取NPC的位置等方法。在派生类中添加了生命值,魔法值,经验等成员变量,同时也
添加了RoleRoll()角色翻滚,RoleLogic()角色逻辑等方法。使NPC特殊化,赋予更多
的功能。
3.8.6雾效类
CFog
- m_fogType: int
- m_fogColor: D3DCOLOR
- m_OffOn: bool
- m_start: float
- m_end: float
- m_density: float
+ CFog(in devicePointer: IDirect3DDevice9*,in fogType: int,in fogColor:
D3DCOLOR,in nStart: float,in nEnd: float,in nDensity: float,in off_on: bool)
+ ~CFog(){}
+ SetStartDis(in nStart: float)
+ SetEndDis(in nEnd: float)
+ SetDensity(in nDensity: float)
+ SetFogType(in fogType: int)
+ SetFogState(in fogState: bool)
+ SetFogColor(in fogColor: DWORD)
+ GetFogState():bool
+ activationFog()
+ SetFogEffect()
22
四川师范大学本科毕业设计
雾效类CFog是用来使程序显得更加逼真的类,在类中有保存雾何时开始,何时结
束的变量m_start和m_end,还有雾的密度变量m_density,雾的颜色变量m_fogColor,
雾的类型变量m_fogType,等还有用来改变状态的方法如SetStartDis()用来设定雾何
时开启,SetDensity()用来设定雾的密度的方法等等。
3.8.7静态模型类
CMeshObject
- m_meshPointer: ID3DXMesh*
- m_materials:vector
- m_textures:vector
- m_loadModel:CLoadModel*
- m_position:D3DXVECTOR3
- m_vMin:D3DXVECTOR3
- m_vMax: D3DXVECTOR3
- m_scal: float
- m_rot: float
- m_center: D3DXVECTOR3
- m_radius: float
+ CMeshObject(in devicePointer: IDirect3DDevice9*)
+ CMeshObject(in ld: CLoadModel*)
+ CMeshObject(in cmo: const CMeshObject&)
+ CMeshObject& operator=(in cmo: const CMeshObject&)
+ ~CMeshObject()
+ SetLoadModelPointer(in ld: CLoadModel*)
+ SetTransformPos(in pos: D3DXVECTOR3)
+ SetScalSize(in nScal:float)
+ SetRotationAngle(in nAngle: float)
+ SetModelY(in y: float)
+ GetColBoxMin(in nMin: D3DXVECTOR3*)
+ GetColBoxMax(D3DXVECTOR3* nMax)
+ GetModelPos(vPos: D3DXVECTOR3*)
+ LoadModel(in fileName:char*,in texPathHead: char*)
23
四川师范大学本科毕业设计
+ CreateCollisionBox()
+ CreateCollisionSphere()
+ MeshCollision(in vMin: D3DXVECTOR3*,in vMax: D3DXVECTOR3*): BOOL
+ SphereCollision(in vMin: D3DXVECTOR3*,in vMax: D3DXVECTOR3*): BOOL
+ SetTranslation()
+ DrawModel()
+ safeRelease()
静态模型类CMeshObject是用来设定程序中静态模型的状态方法的类,它实例化出
来的就是某个静态模型的对象。类中有保存模型对象状态的变量,比如m_materials模
型材料,m_textures模型质感, m_position模型位置等变量。还有就是控制模型状态
的成员函数,SetScalSize()设置模型大小,SetRotationAngle设置模型旋转角度,
CreateCollisionBox()创建碰撞检测,DrawModel()绘制模型,safeRelease()安全释放
模型等等。
3.8.8Input类
CDirectInput
- m_pDInput: LPDIRECTINPUT8
- m_pKeyboard: LPDIRECTINPUTDEVICE8
- m_pMouse: LPDIRECTINPUTDEVICE8
- m_mState: DIMOUSESTATE
- m_mStateOld: DIMOUSESTATE
- m_dwFlags: DWORD
- m_strKeyState[256]: char
- m_bImmedi: BOOL
- m_mX: LONG
- m_mY: LONG
- m_mZ: LONG
+ CDirectInput()
+ ~CDirectInput()
+ InitInputDevice(in hInst: HINSTANCE,in hWnd: HWND): HRESULT
+ CreateDirectInputObject(in hInst: HINSTANCE): HRESULT
+ CreateKeybaordDevice(in hWnd: HWND): HRESULT
24
四川师范大学本科毕业设计
+ CreateMouseDevice(in hWnd: HWND): HRESULT
+ GetDeviceInput()
+ GetKeybaordInput():HRESULT
+ GetMouseInput():HRESULT
+ GetKeyValue(in keyValue: DWORD): HRESULT
+ CMouseKeyValue(in keyIndex: UINT): HRESULT
+ GetDirectInputObject():LPDIRECTINPUT8*
+ GetKeyboardObject():LPDIRECTINPUTDEVICE8*
+ GetMouseObject()
+ GetMouseState():DIMOUSESTATE
CDirectInput类是程序用来与用户交互的类,通俗的说就是响应鼠标键盘事件的
类,在类中定义了鼠标句柄m_pMouse,键盘句柄m_pKeyboard,状态变量m_mState,可
以记录键盘是否被按下,是否被放开的标志变量m_dwFlags, InitInputDevice()用来初
始化设备, GetKeyValue()获取键盘值,CMouseKeyValue()获取鼠标值,
GetLX(),GetLY(),GetLZ()获取光标的X.Y.Z坐标等等。
3.8.9WindowClass类
程序中的WindowClass类调用windows API来绘制一个窗口,以显示程序的内容设
计如下:
图3.8.9-1 WindowClass类图
25
四川师范大学本科毕业设计
项目在VS2003或者更高的版本中开发,大致的类视图如下:
图3.8.9-2 项目类概览图
4系统测试
本程序在windows平台,vs2005下编译通过,其中主要测试部分:
▲ 场景的效果是否达到要求,真实性良好;
▲ 人物基本的控制情况,可以响应键盘鼠标事件;
▲ 碰撞检测;
▲ 人物动作,可以打斗;
▲ NPC是否智能等等;
由于本程序是一个windows 应用程序,所以测试过程不能像类似网站那样截图以
显示效果,所以尽量使用关键截图,以说明测试结果。
程序运行结果如下图:
26
四川师范大学本科毕业设计
图4.1-1 场景测试图
4.1场景的真实感测试
从上图可以看出本程序可以满足测试点1,场景还算真实。
场景采用蓝天绿草作为基本背景,是画面显得更加生动,场景中还添加了树木以及
房屋,也是场景显得更加真实。
4.2人物基本的控制情况测试
人物基本的控制情况,可以响应键盘鼠标事件。这个可以根据运行中的程序自行测
试,即键盘的W,S,A,D角色分别向前,后,左,右行走。F为出拳,C为踢脚。
图4.2-1 打斗测试图
27
四川师范大学本科毕业设计
上图展示为人物可以和NPC进行打斗,F出拳,C为踢脚,图中显示的英雄正在用
脚踢打NPC。
4.3碰撞检测测试
3D场景中进行碰撞检测是十分必要的,因为现实生活中的碰撞时时刻刻的,3D场
景若要逼真,就必须有好的碰撞检测。
图4.3-1 建筑物碰撞检测测试图
上图显示了建筑物不可穿越,这个是碰撞检测的最基本部分,从图中可以清楚的看
出建筑物不可穿越,程序有良好的检测机制,还有一种检测就是形如山坡的检测,即人
物可以在形如山坡的地形中行走,而不掉进山坡里面:
图4.3-2 山坡碰撞检测测试图
28
四川师范大学本科毕业设计
上图表示人物可以走到山坡上来俯瞰全场景,而不至于掉进坡中。
4.4NPC的智能性测试
下图展示的为NPC的智能性,场景中有一个小狗,他可以跟着英雄一起行走,体现
了智能性。这点很像网游中的宠物,随时跟着主人走一样。
图4.4-1 NPC智能测测试图
以上就是基本的测试结果,可以说都是正常的,到此测试完毕,程序可以按照前面
功能要求的正常运行。
5结束语
毕业论文是本科学习阶段一次非常难得的理论与实际相结合的机会,本论文从建
模、动画到光影、粒子特效,从物理系统、碰撞检测到文件管理、网络特性,还有专业
的编辑工具和插件,几乎涵盖了Directx游戏开发过程中所有的重要环节。
5.1程序的不足
通过系统测试程序中还有很多不足表现为:
▲ 打斗过程中如果添加人物血条,这样可以使游戏显得更真实,有待提高。
▲ 人物被打之后没有反应效果,如果能够添加反应效果这样可以使游戏更真实,
有待改进。
▲ 角色行走上面有些毛病,就是如果没有鼠标的帮助,角色只能按照十字形方向
行走,这点需要改进,以使角色能够按照任意方向行走。
▲ 天空的云彩可以让其流动,这样可以使场景更加逼真。
29
四川师范大学本科毕业设计
这个程序只是一个简单的打斗模型,所以各方面都做的不是很好,有很广阔的研究
前景,如果有时间可以研究代码,以添加自己的一些心得的东西,是此小游戏更加丰富。
5.2心得与体会
通过此次毕业设计我总结了以下几点体会:
▲ 有利于基础知识的理解
通过本毕业设计,使我对计算机编程有了更好的锻炼,对编程的语言也有了更深的
理解,对语言的使用能力也有了很大的提高,比如可以用C++进行面向对象编程程序设
计。
▲ 有利于逻辑思维的锻炼
程序设计是公认的、最能直接有效地训练学生的创新思维,培养分析问题、解决问
题能力的学科之一。即使一个简单的程序,从任务分析、确定算法、界面布局、编写代
码到调试运行,整个过程学生都需要有条理地构思,这中间有猜测设想、判断推理的抽
象思维训练,也有分析问题、解决问题、预测目标等能力的培养。
▲ 有利于与其他学科的整合
在程序设计中,我们可以解决其它学科有关问题,也利用其它课程的有关知识来解
决信息技术中比较抽象很难理解的知识。在信息技术课中整合其它学科的知识,发挥信
息技术的优势。例如,我们在程序开发中使用了图形学知识,这就使计算机和图形学这
两大学科有利的联系在一起,等等这些都有利于知识的汇总。
▲ 有利于治学态度的培养。
程序设计中,语句的语法和常量变量的定义都有严格的要求,有时输了一个中文标
点、打错了一个字母,编译就不通过,程序无法正常运行。因此,程序设计初学阶段,
学生经常会犯这样的错误,可能要通过几次乃至十多次的反复修改、调试,才能成功,
但这种现象会随着学习的深入而慢慢改观。这当中就有一个严谨治学、一丝不苟的科学
精神的培养,又有一个不怕失败、百折不挠品格的锻炼。
过程是艰辛的,但结果是美好的,在本次设计过程中我摆脱了单纯的理论知识学习
状态,和实际设计的结合锻炼了我的综合运用所学的专业基础知识,解决实际工程问题
的能力,同时也提高我查阅文献资料、设计手册、计算机编程,设计规范以及3DsMax
建模等其他专业能力水平,而且通过对整体的掌控,对局部的取舍,以及对细节的斟酌
处理,都使我的能力得到了锻炼,经验得到了丰富,并且意志品质力,抗压能力及耐力
也都得到了不同程度的提升。这是我们都希望看到的也正是我们进行毕业设计的目的所
在。
30
四川师范大学本科毕业设计
虽然毕业设计内容繁多,过程繁琐但我的收获却更加丰富。出现问题,解决问题,
经历了无数的这样的循环过程,我的自身能力,对知识的理解,对自己动手能力的提高
统统都在这些循环中逐步提高。和老师的沟通交流更使我从不懂3D游戏设计到编写这
样一个程序有了很大的进步,同时有了新的认识也对自己提出了新的要求,举个简单的
例子:3D场景的实现,天空盒技术,角色控制等等这些问题,都在本次毕业设计中,
我熟练了掌握了它们。通过这次毕业设计让我提前了解了这些知识,这是很珍贵的。
在设计过程中一些模型的设计让我很头痛,原因是由于建模是个很繁琐的事情,小
到每一天直线,大到每一个图形,都要一点点的慢慢绘制出来,刚开始很烦躁,但是慢
慢的习惯了,这也使我对待一件事情的耐心,认真程度有了很大的提高,让我知道,干
一行爱一行的道理,人生不也和这个建模一样吗?
提高是有限的但提高也是全面的,正是这一次设计让我积累了无数实际经验,使我
的头脑更好的被知识武装了起来,也必然会让我在未来的工作学习中表现出更高的应变
能力,更强的沟通力和理解力。
从不知道毕业论文怎么写,到顺利如期的完成本次毕业设计,这给了我很大的信心,
让我了解专业知识的同时也对本专业的发展前景充满信心,这些我在毕业论文结束语中
都提起过。事实上,设计一个好的3D游戏的道路是很艰辛的,并不是任何一个人自己
能完成的,所以这就叫我们看到软件开发过程中的团结合作性,一个好的软件一定是一
个好的团队开发出来的,这点是不容质疑的吗,最后我选择这个题目,是想叫大家知道
中国游戏产业很落后,落后的不仅是几年,我们应该静下心来想想,为什么魔兽世界能
够这么红,为什么国产游戏开了几天就变成鬼服。为什么我国游戏产业会落后,这一切
的根源都是人,技术,只有大量的人掌握了先进技术,那么这项事业才能振兴。所以作
为程序员的我们,有责任来壮大振兴我国的游戏产业,这不仅关系到个人,也关系到国
家,想想一下,中国一个这么大的国家开发不出好游戏,外国人怎么看,所以通过这个
毕业设计我也呼吁我们这个时代的人,“以振兴中华而读书”这句话是永远都不会变的!
本研究是在我的指导教师的悉心指导下完成的。他严肃的科学态度,严谨的治学精
神,精益求精的工作作风,深深地感染和激励着我。从课题的选择到项目的最终完成,
指导老师都始终给予我们细心的指导和不懈的支持。从刚开始设计以来,指导老师就在
学业上给予我们精心的指导,直到设计结束。在此谨向指导老师致以诚挚的谢意和崇高
的敬意。
在此,我还要感谢和我一起完成毕业论文设计的同组同学,虽然我们不是做的一个
题目,但是正是由于他们的帮助和支持,我才能克服一个一个的困难和疑惑,直至本文
31
四川师范大学本科毕业设计
的顺利完成。特别感谢王老师给我们提供了很多3D方面的丰富资料,这让我在完成此
毕业论文的过程中能够快速获取知识,起到事半功倍的效果。在此,我谨以书面的方式
向他们表示我忠心的感谢!
32
四川师范大学本科毕业设计
参考文献:
[1] Samuel :3D计算机图形学,清华大学出版社,2006.10,P3-P9
[2] Kayshav Dattatri:C++面向对象高效编程,人民邮电出版社,2000.7,P32-P40
[3] Julio Sanchez Maria Canton:DirectX 3D图形编程宝典,电子工业出版社,
2000.10,P54-P58
[4] 乔林、杨志刚:Visual C++6.0高级编程技术-DirectX篇,中国铁道出版
社,2000.8,P102-P110
[5] André LaMothe:Windows游戏编程大师技巧,中国电力出版社,2004.2,P56-P62
[6] Kenneth :3D游戏开发大全,清华大学出版社,2007.11,P21-P26
[7] 孙家广:计算机图形学基础教程,清华大学出版社,2009.8.1,P112-P120
[8] 和青芳:计算机图形学原理及算法教程,清华大学出版社,2010.1,P70-P84
[9] 叶至军:Visual C++/DirectX9 3D游戏开发导引,人民邮电出版社,2006.2,P86-P92
33
四川师范大学本科毕业设计
2024年4月5日发(作者:历梦寒)
四川师范大学本科毕业设计
基于DirectX的小游戏的设计与实现
学生姓名
学 号
所 在 系
专业名称
班 级
指导教师
**********
计算机科学与技术系
计算机科学与技术
2008级计科(网络)1班
四川师范大学
二○一二年五月
四川师范大学本科毕业设计
基于DirectX的小游戏
学生: 指导教师:
内容摘要:
开发一款好的游戏成为了目前IT界关注的主题,目前游戏产业属欧美,
韩国做的最好,人们对国产游戏产生了怀疑,它们为什么能开发出好的游戏来了,究竟
怎么设计一款游戏,怎么制作开发一款游戏,成为了一个热门话题,所以作为对游戏感
兴趣的我,利用微软推出的DirectX 图形开发库来进行DirectX的D3D打斗小游戏的
设计与实现,整个过程重点阐述了DirectX游戏开发过程中所有的重要环节,包括了
3D游戏制作过程中的3D建模,碰撞检测,打斗机制,场景渲染,智能NPC等等技术,
从而实现逼真的场景渲染,英雄角色和NPC的打斗的一个小游戏。玩家可以通过鼠标和
键盘进行游戏,有很高的可玩性。同时也向大家揭开3D游戏的面纱,使大家了解3D游
戏的简单开发过程,消除游戏制作的神秘感,让每个人都了解3D游戏开发,使每个人
都能开发3D游戏,并对实现D3D游戏技术难点和关键手段作了详细的分析和研究,提
出了系统设计方案,明确了本课题实现的功能和目标。
关键词:
DirectX 碰撞检测 打斗机制 智能NPC
I
四川师范大学本科毕业设计
Based on the DirectX small game
Abstract:
Develop a good game will become the main subject of the current IT
sector, the best of the current game industry is Europe and the United States,
South Korea ,people in the domestic game had doubts. Why they develop so such
good game, how to design a game, how making a game development has become a hot
topic, as for my interest of game i describes the design and achievement process
of a fighting game based the D3D DirectX which Microsoft release, it contain
all of the important parts,including the 3D game production process of 3D
modeling, collision detection, fighting mechanism, scene rendering, smart NPC
and other technologies,to achieve realistic rendering, heroic characters and
NPC's fighting in the game. players can play games by using mouse and keyboard,
have a high playability. And it open the veil of 3D game ,so that we can understand
the simple 3D game development process, eliminate the mystery of game
production,so that everyone can develop 3D games, and D3D games to achieve key
technical problems and means of detailed analysis and research, and system
design, specifically the function of this task and goals to achieve.
Keywords:
DirectX Collision detection Fighting mechanism Smart NPC
II
四川师范大学本科毕业设计
目 录
前言 .................................................................................................................................................. 1
1相关知识简介 ............................................................................................................................. 2
2总体设计 ...................................................................................................................................... 7
2.1概述 ....................................................................................................................................... 7
2.2程序开发步骤 ...................................................................................................................... 7
2.2.1三维建模........................................................................................................................ 7
2.2.2读取模型文件,并进行D3D编程 ........................................................................... 7
2.2.3设计程序所需的类 ....................................................................................................... 7
2.2.4实现类,完成程序的编写 .......................................................................................... 8
2.3系统框图 ............................................................................................................................... 8
2.4功能需求 ............................................................................................................................... 9
3详细设计 ................................................................................................................................... 10
3.1地形模拟,自然环境模拟 .............................................................................................. 10
3.1.1地形模拟..................................................................................................................... 10
3.1.2自然环境模拟 ............................................................................................................ 10
3.2雾效 .................................................................................................................................... 11
3.3角色 .................................................................................................................................... 12
3.4人物控制 ............................................................................................................................ 12
3.5摄像机控制 ....................................................................................................................... 12
3.6碰撞检测 ............................................................................................................................ 13
III
四川师范大学本科毕业设计
3.7打斗机制实现 ................................................................................................................... 14
3.8项目详细类设计 ............................................................................................................... 15
3.8.1游戏主逻辑类 ............................................................................................................ 16
3.8.2摄像机类..................................................................................................................... 17
3.8.3地形类 ......................................................................................................................... 18
3.8.4天空盒类..................................................................................................................... 19
3.8.5角色类 ......................................................................................................................... 20
3.8.6雾效类 ......................................................................................................................... 22
3.8.7静态模型类 ................................................................................................................ 23
3.8.8Input类 ...................................................................................................................... 24
3.8.9WindowClass类 ...................................................................................................... 25
4系统测试 ................................................................................................................................... 26
4.1场景的真实感测试 ........................................................................................................... 27
4.2人物基本的控制情况测试 .............................................................................................. 27
4.3碰撞检测测试 ................................................................................................................... 28
4.4NPC的智能性测试........................................................................................................... 29
5结束语 ....................................................................................................................................... 29
5.1程序的不足 ....................................................................................................................... 29
5.2心得与体会 ....................................................................................................................... 30
参考文献 ...................................................................................................................................... 33
IV
四川师范大学本科毕业设计
DirectX打斗小游戏设计与实现
前言
随着多媒体技术、Internet技术的飞速发展,生活水平的提高,人们开始追求精
神生活的享受,近年来游戏的快速发展,迎合了人们的这一需求,可以说游戏给人们现
实生活中感受不到的东西,人们的方方面面都离不开游戏,从单机游戏发展到网络游戏,
人们对游戏软件的需求日益扩大,将是21世纪具有广阔前景的一门产业。
从目前来看,不管是在游戏开发的技术上还是在设计思想方面,我国和其他发达国
家在游戏开发上还有很大的差距。这主要表现在两个方面:
新闻出版总署近期查处了一批低俗网游,其中充斥着暴力、色情、赌博等不健康内
容,令人触目惊心。关闭了45款未经审批的境外网络游戏;查处了26款存在低俗内容
的网络游戏。警告了27家网络游戏企业,并勒令其限期整改;还有10家网络游戏企业
负责人被诫勉谈话。
当《赤壁》、《诛仙》、《超级舞者》等国产网游在海内外受欢迎时,大量的速成产品
也在垂死挣扎很多公司在推出一款成功的产品之后,就会接着推出第二代、第三代,而
游戏的内容是完全一样的。另外还有很多厂商也会对成功的产品进行大规模的抄袭,换
一个故事、换一个形象就拿去赚钱了。
当今游戏界谁人不知《魔兽世界》,《魔兽争霸》?它的成功激发了欧美网络游戏开
发商把自己的产品尽可能的让东方文化与西方文化相结合欲望。中国玩家正把希望和兴
趣转向欧美优秀的网络游戏产品,同时逐渐的适应和接受欧美网络游戏。
所以综上所述,我国在游戏开发领域还处于初级阶段当前,我们游戏产业发展的当
务之急就是壮大自己的实力,国外游戏发展较为迅猛,它们掌握着先进的技术,从而开
发出来的游戏从可玩性,可观赏性都比国产游戏要好的多。在看下国内,虽然我国游戏
产业这几年有良好的发展,但是相比国外,还有一定差距,这就驱使一些人对游戏开发
产生了动力,可观未来的10年内,游戏产业必将掀起腥风血雨,我国的游戏开发产业
将是一片大好趋势,这也就给我们这些程序员创造了良好的机会,游戏开发将是你最理
智的选择。
目前比较流行的图形开发API是OpenGL和DirectX两种,OpenGL的前身是高端图
形工作站厂商SGI在80年代所开发的IRIS G,它在90年代初期成为了开源的标准。
当时微软在它的Windows 95中发布了DirectX,将它作为OpenGL的竞争对手。而在90
年代末,微软曾经和SGI进行了Fahrenheit项目的开发,试图将两者结合起来,但是
1
四川师范大学本科毕业设计
没有成功。之后微软继续开发DirectX并与GPU厂商合作,留下OpenGL任其发展。OpenGL
之后几乎逐渐消失,直到90年代末Apple放弃了自己的QuickDraw 3D,将OpenGL作
为Mac OS X的官方3D库。Apple的系统给OpenGL程序带来了不少拥护者。之后OpenGL
正式被Linux采用,现在主流的游戏平台,包括PSP,PS3和Wii都支持该技术。
Microsoft推出的DirectX,是专门用于游戏开发和高性能多媒体应用软件开发的
低层API。DirectX是一种应用程序接口,它可让以windows为平台的游戏或多媒体程
序获得更高的执行效率,加强3d图形和声音效果,并提供设计人员一个共同的硬件驱
动标准,让游戏开发者不必为每一品牌的硬件来写不同的驱动程序,也降低用户安装及
设置硬件的复杂度。这样说是不是有点不太明白,其实从字面意义上说,Direct就是
直接的意思,而后边的X则代表了很多的意思,从这一点上我们就可以看出DirectX的
出现就是为了为众多软件提供直接服务的。利用DirectX可以使程序员很容易的开发出
具有高质量的游戏来。随着DirectX不同版本的不断更新,它所包含的东西越来越多,
开发出来的游戏也越来越好,总之DirectX包括DDraw,D3D,DInput,DSound等很多部分,
而OpenGL仅为3D图形接口,OpenGL简单易学,另外OpenGL是跨平台的,最后DirectX
的速度略快,OpenGL的稳定性更高,但表现的都不是很明显。所以我们选择DirectX
来开发这个格斗游戏,因为它包含内容比较全面。而且就是编程方便,很容易控制程序,
其中包含的函数也很容易调用。
本论文以开发一个基于DirectX的游戏作为切入点,讲述利用DirectX开发一个简
单的3D游戏的基本步骤,其中包含的功能有:3D模型驱动、3D骨骼模型驱动、角色控
制器、地形生成器、绚丽的魔法效果、采用ATL(Active Template Library)编写的游
戏脚本解析引擎等等。本设计创建一个游戏场景,场景中的地形高低起伏,带有天空效
果。在场景中有两个角色,一个玩家角色,由用户控制,以实现一个简单的3D游戏。
本毕业设计是一个D3D打斗小游戏的设计与实现,其中包含了D3D游戏实现的重要
环节,我所以选择这个题目,是想学习3D游戏的制作,锻炼自己的动手开发能力,增
加自己的专业知识,同时这款游戏也有一定的发展空间,具有一定的实际意义。
1相关知识简介
DirectX是一种应用程序界面(api),可让以Windows为平台的游戏或多媒体程序
获得更高的执行效率,加强3d图形和声音效果,并提供设计人员一个共同的硬件驱动
标准,让游戏开发者不必为每一品牌的硬件来写不同的驱动程序,也降低用户安装及设
置硬件的复杂度。
2
四川师范大学本科毕业设计
下面我们来举个例子说明DirectX的作用:以前我们玩Dos游戏的时候,都必须设
置声卡的品牌,然后再设置它的irq、i/o、dma,其中有一项设置不对游戏就发不出声。
这部分设置不但让玩家伤透脑筋,对游戏设计者开说也非常头痛!因为游戏设计者做游
戏之初便需要把市面上所有声卡硬件数据都收集过来,然后根据不同的api来写不同的
驱动程序。
现在我们玩Windows游戏,并不会做这些设置,因为DirectX提供了一个共同的应
用程序界面,其实只要这个游戏是依照DirectX来开发的,不管你是什么显卡、声卡、
统统都能玩,而且还能发挥比Dos下更佳的效果。当然,前提是你的显卡、声卡的驱动
程序也必须支持DirectX才行。
前面所说的只是提供一致的应用程序界面,其实要深入了解DirectX的各个组件你
就会更加明白为什么游戏都要支持DirectX了。DirectX由许多API组成,我只介绍几
个重要的部分:
DirectDraw:这是DirectX中非常重要的部分。它担任图形处理的关键。以往在实
地址的Dos下设计游戏时,为了游戏速度的考虑,都让程序直接操作硬件。而在
Windows98这种保护模式下,所有图形的访问动作都必须gdi这个图形处理中心来处理,
而不能直接对硬件下命令,而gdi对连续的画面处理不佳,游戏一旦通过gdi来处理的
话,那么效果会差强人意。
▲ DirectDraw就是来帮助windows程序也能直接进行硬件操作,更进一步还能加
速显卡的速度,使游戏更为流畅。另外DirectDraw还支持mmx、3dnow、agp等技术,
还能处理多屏幕显示,让窗口环境的游戏更加多姿多采。
▲ DirectSound这是用来处理声音的api,除了播放声音和处理混音之外,还加强
了3d音效,并提供了录音功能。前面所举的声卡兼容的例子,就是利用了DirectSound
来解决的。
▲ DirectInput这用来处理游戏的一些外围装置,例如游戏摇杆、gamepad、方向
盘、vr手套、力反馈的各种设备等。以往要在Dos下用方向盘来玩赛车游戏,就要先
调整好irq、dma等各种设置。而现在DirectInput则使这些设备与游戏配合良好,不
需要做特别配置。
▲ DirectPlay这是为了满足近来流行的网络游戏而开发的api,支持多通信协议,
让玩家可以用各种连网方式来进行对战,此外也提供网络对话功能及保密措施。
▲ Direct3D(D3D):d3d的大名相信谁都听过吧!对现在的游戏来说d3d实在是
太重要了!由于3d游戏的兴起,各大厂商纷纷推出3d加速卡为了避免重蹈声卡的覆辙,
3
四川师范大学本科毕业设计
微软从Directx3.0后加入d3d这个api,让3d游戏有一个共同的开发标准。这样当游
戏再执行时若需要绘图时就会通过d3d向显卡驱动程序提出要求从而完成绘图。
▲ DirectX已经经历了很多个版本下面如下:
目前最新版本是DirectX11, 在微软刚刚发布的Windows 7 Beta版本中,一些已
经安装使用的用户的发现了DirectX 11已经包含其中了。DirectX 11作为3D图形接
口,不仅支持未来的DX11硬件,还向下兼容当前的DirectX 10和10.1硬件。DirectX
11增加了新的计算shader技术,可以允许GPU从事更多的通用计算工作,而不仅仅是
3D运算,这可以鼓励开发人员更好地将GPU作为并行处理器使用。
DirectX 1.0:第一代的DirectX很不成功,推出时众多的硬件均不支持,当时基
本都采用专业图形API-OpenGL,缺乏硬件的支持成了其流行的最大障碍。DirectX 1.0
版本是第一个可以直接对硬件信息进行读取的程序,它提供了更为直接的读取图形硬件
的性能(比如:显示卡上的块移动功能)以及基本的声音和输入设备功能(函数),使
开发的游戏能实现对二维(2D)图像进行加速。这时候的DirectX不包括现在所有的
3D功能,还处于一个初级阶段。
DirectX 2.0:DirectX 2.0在二维图形方面做了些改进,增加了一些动态效果,
采用了Direct 3D的技术。这样DirectX 2.0与DirectX 1.0有了相当大的不同。在
DirectX 2.0中,采用了“平滑模拟和RGB模拟”两种模拟方式对三维(3D)图像进行加
速计算的。DirectX 2.0同时也采用了更加友好的用户设置程序并更正了应用程序接口
的许多问题。从DirectX 2.0开始,整个DirectX的设计架构雏形就已基本完成。
图1.1-1 生化危机
4
四川师范大学本科毕业设计
DirectX 3.0:DirectX 3.0的推出是在1997年最后一个版本的Windows95发布后
不久,此时3D游戏开始深入人心,DirectX也逐渐得到软硬件厂商的认可,97年时应
用程序接口标准共有三个,分别是专业的OpenGL接口,微软的DirectX D接口和3dfx
公司的Glide接口。而那时的3dfx公司是最为强大的显卡制造商,它的Glide接口自
然也受到最广泛的应用,但随着3dfx公司被NVIDIA的收购、Voodoo显卡的衰败,Glide
接口逐渐从人们眼中消失了。
图1.1-2 Counter-Strike
DirectX 8.0:DirectX 8.0的推出引发了一场显卡革命,它首次引入了像素渲染
引擎(Vertex Shader)与顶点渲染引擎(Pixel Shader)的概念,反映在特效上就是动态
光影效果。同硬件T&L仅仅实现的固定光影转换相比,VS和PS单元的灵活性更大,它
使GPU真正成为了可编程的处理器。这意味着程序员可通过它们实现3D场景构建的难
度大大降低。通过VS和PS的渲染,可以很容易的宁造出真实的水面动态波纹光影效果。
此时DirectX的权威地位终于建成,代表产品:GeForce4 Ti系列。
DirectX 9.0:2002年底,微软正式发布DirectX9.0,DirectX 9中PS单元的渲
染精度已达到浮点精度,传统的硬件T&L单元也被取消。全新的VertexShader(顶点着
色引擎)编程将比以前复杂得多,新的VertexShader标准增加了流程控制,更多的常量,
每个程序的着色指令增加到了1024条。另外,DX9增加对浮点数据的处理功能,以前
只能对整数进行处理,突破了以前限制PC图形图象质量在数学上的精度障碍,它的每
条渲染流水线都升级为128位浮点颜色,让游戏程序设计师们更容易更轻松的创造出更
漂亮的效果,让程序员编程更容易。
5
四川师范大学本科毕业设计
Visual studio 2005知识简介
开发工具我们选择Visual studio 2005集成开发环境。
Visual Studio 是一套完整的开发工具集,用于生成 Web 应用程序、XML
Web Services、桌面应用程序和移动应用程序。Visual Basic、Visual C++、Visual C#
和 Visual J# 全都使用相同的集成开发环境 (IDE),利用此 IDE 可以共享工具且有助
于创建混合语言解决方案。另外,这些语言利用了 .NET Framework 的功能,通过此框
架可使用简化 ASP Web 应用程序和 XML Web Services 开发的关键技术。
该框架为开发人员提供了统一的、面向对象的、分层的和可扩展的类库集 (API)。
目前,C++ 开发人员使用 Microsoft 基础类,而 Java 开发人员使用 Windows 基础类。
该框架统一了这些完全不同的模型,还为 Visual Basic 和 JScript 程序员提供了对
类库的访问。通过创建跨所有编程语言的公共 API 集,公共语言运行库使得跨语言继
承、错误处理和调试成为可能。从 JScript 到 C++ 的所有编程语言具有对框架的相似
访问,开发人员可以自由选择它们要使用的语言。
2005 年,微软发布了 Visual Studio 2005。.NET 字眼从各种语言的名字中被抹
去,但是这个版本的 Visual Studio 仍然还是面向 .NET 框架的(版本2.0)。它同时
也能开发跨平台的应用程序,如开发使用微软操作系统的手机的程序等。总体来说是一
个非常庞大的软件,甚至包含代码测试功能。这个版本的 Visual Studio 包含有众多
版本,分别面向不同的开发角色。同时还永久提供免费的 Visual Studio Express 版
本。
3D Studio Max知识简介
建模工具我们选择Autodesk公司开发的3D Studio Max,3D Studio Max,常简称
为3ds Max或MAX,是Autodesk公司开发的基于PC系统的三维动画渲染和制作软件。
其前身是基于DOS操作系统的3D Studio系列软件,最新版本是2011。在Windows NT
出现以前,工业级的CG制作被SGI图形工作站所垄断。3D Studio Max + Windows NT
组合的出现一下子降低了CG制作的门槛,首选开始运用在电脑游戏中的动画制作,后
更进一步开始参与影视片的特效制作,例如X战警II,最后的武士等。
在应用范围方面,广泛应用于广告、影视、工业设计、建筑设计、多媒体制作、游
戏、辅助教学以及工程可视化等领域。拥有强大功能的3DS MAX被广泛地应用于电视及
娱乐业中,比如片头动画和视频游戏的制作,深深扎根于玩家心中的劳拉角色形象就是
3DS MAX的杰作。在影视特效方面也有一定的应用。而在国内发展的相对比较成熟的建
筑效果图和建筑动画制作中,3DS MAX的使用率更是占据了绝对的优势。根据不同行业
6
四川师范大学本科毕业设计
的应用特点对3DS MAX的掌握程度也有不同的要求,建筑方面的应用相对来说要局限性
大一些,它只要求单帧的渲染效果和环境效果,只涉及到比较简单的动画;片头动画和
视频游戏应用中动画占的比例很大,特别是视频游戏对角色动画的要求要高一些;影视
特效方面的应用则把3DS MAX的功能发挥到了极至。
2总体设计
2.1概述
D3D打斗小游戏主要是利用微软的DirectX API来制作一款打斗小游戏,其中包括
了游戏制作的重要过程,3D建模,碰撞检测,打斗机制等等。
2.2程序开发步骤
2.2.1三维建模
3Ds max是一套用于制作三维动画的应用软件,其三维建模功能十分强大,所以利
用3Ds max能够建立很好的模型出来,并且生成的 3DS文件是一种非常普遍的数据格
式,用它建模不仅大大缩短建模时间而且提高建模效率.
本项目需要建立的模型有房子,树,木车子,小狗,英雄,NPC等。
2.2.2读取模型文件,并进行D3D编程
根据第一步用3ds max进行建模,之后把 3DS文件转换成 .X格式的可以被DirectX
识别的文件,之后程序载入这些模型,因为转换了格式所以图形都变成了一些顶点的集
合,这样程序就能很好的对图形进行控制,以便于实现对模型的控制,从而达到所要达
到的目的。
2.2.3设计程序所需的类
本程序包括16个类,他们都是D3D程序的基本类,比如,摄像机类,可以说它是
说有3D项目中都有的类,因为你必须在场景中架设一个摄像机,这样才能实现观察场
景,漫游场景的目的,还有控制类,对于有好的用户交互的程序时良好的,控制类提供
了键盘响应方法,这样就可以让运行者很好的控制角色。等等的这些都是D3D程序所必
须包含的,所以很有研究价值。
本项目的类都具有一定联系,他们都是相互依赖的,下面是项目中的一些类关系图,
从图中我们可以很清楚的看出它们之间具有很大的联系性:
7
四川师范大学本科毕业设计
图2.2.3-1 系统类图
上图表现了程序的大体框架,表现为3层:
第一层:首先是由CFloor,CSkyBox,CFog类来创建程序的场景框架,地面,天空,
和雾效,
第二层:这一层主要是CCamera类和碰撞检测类CmeshObject,摄像机类是程序中
的重要类,因为它是想外部展现程序的窗口,我德项目中用的是CFreeCamera类,它是
由CCamera类继承等到的,里面添加了很多新的功能,再有就是碰撞检测类,有了碰撞
检测类,使程序变得更加智能。
最后一层就是:游戏主类,由于第一层,第二层的成功创建,游戏基本环境就被模
拟出来,而且是十分良好的,所以在这些基础上就可以最主角色类进行设计,里面有
CRole,CNpc,CDirectinput类等等,这些类都是用来支持响应用户输入以及英雄的动作
的,比如英雄的响应鼠标事件,英雄的碰撞检测等等。
2.2.4实现类,完成程序的编写
设计算法,实现类中的成员方法,以完成程序。
由于D3D为我们提供了很强大的API所以我们就可以真对想要达到的想过来实现类
中的方法,比如可以用向量和矩阵之间的点乘和叉乘,来改变向量或者矩阵的状态,从
而改变图形或者物体的状态,例如人物的行走等等。
2.3系统框图
系统框图是表现整个程序的架构图。
如图2.3-1所示:
8
四川师范大学本科毕业设计
图2.3-1 系统框图
从图2.3-1可以看出,系统设计大致分为两大块。
第一:场景的构建,场景构建主要就是模型的构建,其中就包括为例材质,比如要
构成树木的图片,天空盒的图片。还有就是些其他模型的构建,人物模型,道具模型等,
这些需要准备的东西有了之后就可以建立我们的3D场景了。
第二:角色的控制。也就是和用户的交互,用户可以通过输入来控制人物模型已达
到一定的目的。这部分大致就是利用D3D为我们提供的函数接口,来实现对人物的控制,
于此同时场景调度,碰撞检测,地形匹配也是很重要的,所以在这部分也要实现它们,
有了它们我们的程序才会十分的智能,也就是人物不可能穿过建筑物,或者人物能够爬
上山坡等等。
2.4功能需求
本程序的功能大体上就是在运行程序以后D3D可以成功载入我们的模型文件,成功
渲染场景,之后用户能够通过鼠标和键盘的操作来控制英雄的移动,比如可以爬到山坡
来俯瞰场景,漫游整个场景,可以去牵着小狗一同行走,还有就是能够和NPC进行对战,
其中W,S,A,D是人物进行前,后,左,右移动,C是踢脚,F是出拳,鼠标左键改变摄
像机的视角方向,鼠标右键改变人物的行走方向。程序流程图如下:
9
四川师范大学本科毕业设计
图2.4-1 系统流程图
3详细设计
3.1地形模拟,自然环境模拟
3.1.1地形模拟
在本项目中,利用高度图和均匀网格算法来生成地形,高度图可以有两个作用:一
方面,通过高度图存储每个地形节点的高度信息,另一方面,通过高度图的尺寸决定地
形网格的顶点数目。
本项目中,使用一张“128*128”像素的BMP格式的位图作为高度图。在高度图中
地形高度最低的部分,即颜色最深的部分为地平面,白色为山坡。
图3.1.1-1 地形纹理图
3.1.2自然环境模拟
三维场景里的天空并不是“真正”的天空,而是用图片拼起来的,欺骗我们眼睛。
10
四川师范大学本科毕业设计
通常把大家所在的场景用一个几何体包裹起来,再在里面贴上从各个角度的风景图,之
后把摄像机放到场景里面,这样视角就被盒子包围起来,就好像一个真正的环境一样。
想想CS之类的天空,是不是有点印象?
本程序采用最常见的天空盒的方法,天空盒是一个六面体的盒子,通过给6个面添
加无缝连接的纹理,形成天空的效果。天空盒的优势在于盒子只有12个三角形面,渲
染所占用的资源少,速度快。天空盒纹理:
图3.1.2-1 天空纹理图
3.2雾效
在场景中,除了应用天空盒和太阳光晕来烘托场景的气氛;还可以为场景添加雾效,
以模拟出一种景深效果雾化效果能增加场景的真实感,纵深感和距离感,创造环境氛围。
微软的Direct3D提供两种类型的雾:定点雾和像素雾。雾化结果不仅可以用于模拟雾,
也能减少远处场景的清晰度。产生一种雾里看花,水中望月的朦胧美。雾效是通过景物
颜色与雾的颜色,以随物体和观察点距离增加面衰减的混合因子混合实现。本项目中,
11
四川师范大学本科毕业设计
提供了三种雾效分别为:线性雾化、指数雾化、平方指数雾化。由于雾化是通过硬件实
现,不会增加过多的系统资源消耗,所以在场景中只使用了平方指数雾化。
3.3角色
在游戏中,玩家角色和NPC角色使用绑定骨骼的三维模型。玩空控制的角色需要接
收玩家的输入控制来产生相应的行为,面NPC角色则添加人工智能(AI)进行简单的行为
活动。
3.4人物控制
人物移动控制是单机和网游中比较重要的部分,但前单机游戏使用动力学以及IK
动画已经达到了非常逼真的地步,在大型网络游戏中这样的物理模拟同步是很实现的,
因此在目前多数网游中仍旧是采取使用一个包围体(盒子或者胶囊)来模拟人物。
本程序中玩空控制的角色需要接收用户输入,因此,需要添加用户控制的模块。通
常情况下都是通过鼠标和键盘来工同操作。
项目中,对角色的控制使用键盘的“W”、“S”、“A”、“D”分别表示上、下、左、右
4个方向上的移动,而攻击行为为“F”、“C”,同时鼠标的右键控制角色的旋转。
3.5摄像机控制
游戏中摄像机为尾随摄像机,另外使用鼠标左键对摄像机作俯、仰、旋转视角的相
应处理,可以对玩家控制的角色在不同方位上的观察。DirectX提供了一个摄像机基类
如下:
图3.5-1 摄像机类图
12
四川师范大学本科毕业设计
从上面的类中可以看出,摄像机类是很全面的,其中它用4个向量成员变量分别表
示right,up,look方向以及摄像机当前位置pos,这其中还有几个重要的成员函数,
strafe表示摄像机可以左右移动,fly表示摄像机上下移动,这个函数在有飞行的程序
中是很重要的,walk表示前后移动,pitch表示在right向量上的步长或者缩短,roll
则表示在视角方向的旋转。其他的就是些控制摄像机对象状态的方法。
3.6碰撞检测
在本项目中,使用最简单的碰撞检测,只对玩家与NPC或者场景的静态模型是否发
生碰撞的相应处理,而NPC之间没有进行碰撞检测,主要采用的技术是包围盒检测。
实现碰撞检测是十分必要的,在本系统中拟采用包围盒技术,包围盒的各线段与坐
标轴平行,最大好处是可以实现快速碰撞检测,特别是在证明两个物体并不相交时是非
常有效的。
碰撞检测算法在图形学中已经很成熟了,大致就是判断物体运动方向是否有多边
形,之后判断多边形的类型,不如山坡和建筑物都是多边形,但是处理这两种类型的碰
撞的方法是不同的,碰撞检测算法流程图如图表3.6-1:
图3.6-1 碰撞检测流程图
从图3.6-1我们看出在虚拟环境中,由于用户的交互和物体的运动,此时为保持环
境的真实性,需要及时检测到这些碰撞,并计算相应的碰撞反应,更新绘制结果,否则
物体会发生穿透现象,破坏虚拟环境的真实感和用户的沉浸感 在碰撞检测中,第一是
检测到碰撞的位置;第二是计算碰撞后的反应。考虑碰撞检测方法以及虚拟漫游测的特
13
四川师范大学本科毕业设计
殊要求本漫游引擎中采用基于视点向前线段探测的碰撞检测方法,如图3.6-2所示:
图3.6-2 碰撞检测原理图
▲ 视点为V(在漫游系统中是虚拟人的头部位置);
▲ 取视线上沿运动方向距离为d的点M这是因为某一时刻只有在虚拟人运动的方
向才有可能产生碰撞;
▲ 连接V和M形成线段;
▲ 计算求得与线段V2L4相交的物体,若其不与任何物体相交,则判断为无碰撞;
若线段与多个物体相交,则存在多个交点.此时求得与视点最近的交点C1即为碰撞检
测点,这个最短距离就是碰撞距离.为了找到碰撞点,最核心的运算是求交.由于在漫
游系统中,各种实体模型都是由多边形组成的,所以线段和物体之间的求交运算,可以
从2个方面考虑:第一,线段与长方体相交;第二,线段与多边形相交;但是,当视点
与物体的距离大大超过线段的长度时,只需判断出它们不可能相交,而不必求它们的交
点.因此,系统只对视点与物体包围盒的相交进行运算,以减少不必要的求交运算.一
旦发生了视点与虚拟物体之间的碰撞,输入设备给出的前进或后退的指令将立刻被忽
略,这是在漫游引擎中给出的简单碰撞响应。
在现实中,并不是所有的面都会阻挡角色的前进,例如,楼梯的竖面和平缓的山坡
斜面,这些面在碰撞检测中都可以检测到,但是在现实生活中这样的面不会阻挡人的前
进.因此,当碰撞到这种面时,系统应该能做出正确判断和适当处理,让视点能继续前
进.采用的方法是,在漫游系统中给这样的实体设置一个共同的属性,如果与这些实体
碰撞时,则对它们进行特殊处理。
3.7打斗机制实现
14
四川师范大学本科毕业设计
程序中英雄可以和NPC进行打斗,玩家可以通过W,S,A,D,F,C来进行上,下,左,
右,出拳,踢脚来对英雄进行控制,在CNpc类和CRole类中有记录NPC和英雄血量值,
魔法值的变量m_HP,m_MP,所以程序在打斗过程中伴随着英雄出招的动作就会对NPC和
英雄对象中的变量进行读取,同时做相应的运算,直到有一方的血量不大于零位置,若
是NPC对象,则程序撤销NPC对象,若是英雄对象,则程序显示英雄死亡,游戏结束,
同时结束程序。
图3.7-1 打斗流程图
3.8项目详细类设计
首先,设计一个Cgame类,作为整个场景的逻辑类。同时在类中,定义其他具体的
实现类的对象,进行调用,以实现整个场景。
场景中每个要素都可以封装在单独的类,在Cfloor类中封装了地形的实现;在
CskyBox类中封装了天空盒的实现;在Cfog类中封装了雾效的实现;在CmeshObject
类中封装了静态模型的实现;在CNpc类中封装了角色的实现;在CFreeCamera类中封
装了摄影机的实现;在CdirectInput类中封装了键盘和鼠标输入的实现。
由于玩家控制的角色行为跟其它NPC的行为操作不一样,其它的属性都是相同的,
因此,定义CNpc类作为CRole类的基类。
在场景中可能有多种摄像机,项目中是以CFreeCamera类为基类,它的属性集合了
其它摄像机的相同属性,因此,定义Ccamera继承以CfreeCamera类。
15
四川师范大学本科毕业设计
图3.8-1 项目类关系图
图3.8-1表示了在项目中所有类都是为CGame类提供服务的。
在本项目中,还有其它的TXT文件读取类等。它们在此项目中只作为辅助类使用。
3.8.1游戏主逻辑类
CGame
- m_pCamera:CCamera*
- m_floor:CFloor*
- m_lpfog:CFog*
- m_lpskybox:CSkyBox*
- m_pHero:Role*
- m_pMonster:CRole*
- m_pDog:CRole*
- m_meshObj:vector
- m_timeFrame:float
- m_timeNow: float
+ CGame(in devicePointer: IDirect3DDevice9*,in hWnd: HWND,in hInst:
HINSTANCE)
+ ~Cgame()
+ IntiGame():BOOL
16
四川师范大学本科毕业设计
+ KeyPressManage()
+ CollisionTest():BOOL
+ CDisplay()CGame是程序的主类,它是组织程序框架的关键类,它包括了构成场
景对象的指针,比如摄像机对象,地形对象,天空盒对象,角色对象等等。它还负责初
始化工作,初始化游戏,初始化键盘管理,初始化碰撞检测,最后显示程序界面。
3.8.2摄像机类
CFreeCamera
- m_position: D3DXVECTOR3
- m_up: D3DXVECTOR3
- m_look: D3DXVECTOR3
- m_right: D3DXVECTOR3
- m_fMaxPitch: float
- m_fMinPitch: float
- m_fPitchAdd: float
- m_fMinNear: float
- m_fMaxFar: float
- m_scrWidth: UINT
- m_scrHeight: UINT
+ CFreeCamera(IDirect3DDevice9* devicePointer)
+ ~CFreeCamera()
+ Strafe(float units)
+ Fly(float units)
+ Walk(float units)
+ Pitch(in angle: float)
+ Yaw(in angle: float)
+ Roll(in angle: float)
+ GetViewMatrix(in veiw: D3DXMATRIX*)
+ GetProj(in nProj: D3DXMATRIX*)
CCamera
- m_distance: float
- m_minDistance: float
17
四川师范大学本科毕业设计
- m_maxDistance: float
- m_fYaw: float
- m_fPitch: float
- m_vDeltaPos: D3DXVECTOR3
- m_vLastPos: D3DXVECTOR3
+ CCamera(in devicePointer: IDirect3DDevice9*)
+ ~CCamera()
+ SetCameraY(in y: float): BOOL
+ SetLookAt(in vLastPos: D3DXVECTOR3*)
+ SetDeltaPos(in vNewPos: D3DXVECTOR3*)
+ TransformYawPitch(in nYaw: float,in nPitch: float)
+ NearFarMove(in fMove: float)
+ UpdateCamera()
CFreeCamera类是摄像机类,它是由CCamera派生得到的,摄像机类是向外展示场
景的重要类,其中有几个重要的方法,Strafe,Fly,Walk,Pitch,Yaw,Roll它们是
控制视角的重要方法,比如Strafe是控制摄像机左右移动的方法,想象在游戏中人物左
右移动用的就是这个方法,Roll方法是视角转动方法,调用摄像机对象的此方法就可
以改变场景的观察视角。
3.8.3地形类
CFloor
- m_vertexBufferPointer: IDirect3DVertexBuffer9*
- m_indexBufferPointer: IDirect3DIndexBuffer9*
- m_texturePointer: IDirect3DTexture9*
- m_pHeightMap: IDirect3DTexture9*
- m_HeightMapDesc: D3DSURFACE_DESC
- m_floorPos: D3DXVECTOR3
- m_border: float
- m_col: DWORD
- m_row: DWORD
- m_NumVertexs: WORD
- m_pHeightData: BYTE*
18
四川师范大学本科毕业设计
- pVertex: CVertex*
+ CFloor(in border: float)
+ ~CFloor()
+ CSetDevicePointer(in devicePointer: IDirect3DDevice9*)
+ TextureHeightMap(in FloorMap: char*,in mapPathHead: char*): HRESULT
+ LoadHeightMap(in FloorMap: char*,in mapPathHead: char*,in hInstance:
HINSTANCE): BOOL
+ CSetVertexBuffer(): HRESULT
+ CSetIndexBuffer(): HRESULT
+ CSetTexture(): HRESULT
+ CSetTranslation()
+ GetHeight(in hPos: D3DXVECTOR3*)
+ CSetUp()
+ CPrintPrimitive()
地形模拟类CFloor,地形模拟类是构建场景地形环境的类,类中的成员标量定义
了地形的顶点缓存和顶点索引缓存,有了这两个成员我们就可以把地形数据化成一些列
连续的数据块,之后通过输送到显卡现存中进行地形渲染,以构造地形环境。
3.8.4天空盒类
CSkyBox
+ m_boxVertexBuffer: IDirect3DVertexBuffer9*
+ m_boxIndexBuffer: IDirect3DIndexBuffer9*
+ m_skyVertexBuffer: IDirect3DVertexBuffer9*
+ m_skyIndexBuffer: IDirect3DIndexBuffer9*
+ m_textures[7]: IDirect3DTexture9*
+ m_texNumIndex: int
+ m_segment: int
+ m_size: float
+ m_skyTile: float
+ m_uSpeed: float
+ m_vSpeed: float
+ m_angle: float
19
四川师范大学本科毕业设计
CSkyBox(in devicePointer: IDirect3DDevice9*,in nSize: float,in nSegment:
int,in skyTile: float)
~CSkyBox()
+ InitBox():HRESULT
+ InitSky():HRESULT
+ LoadSkyBoxTexture(in skybox: char*,in imagePathHead: char*): HRESULT
+ SetMatrix(in pos: D3DXVECTOR3)
+ RenderSkyBox(in pos: D3DXVECTOR3,in framTime: float)
和地形模拟类CFloor类似,自然环境类我们用一个天空盒类CSkyBox表示,它的
重要成员变量依旧是又顶点缓存和顶点索引缓存构成,用来记录天空盒的顶点信息,其
中还有定义天空盒大小的m_size变量,天空盒包围和片数的m_skyTile变量,方法
InitBox()和InitSky()用来初始化天空盒RenderSkyBox()用来渲染天空盒,即绘制天
空盒。
3.8.5角色类
CNpc
- m_Angle: float
- m_Scale: float
- m_LifeTime: float
- m_Speed: float
- m_attackBound: float
- m_fSeeing: float
- m_vPos: D3DXVECTOR3
- m_vDirection: D3DXVECTOR3
- m_vMin: D3DXVECTOR3
- m_vMax: D3DXVECTOR3
- m_Action: ROLEACTION
- m_pMesh: CSkinMesh*
CNpc(IDirect3DDevice9* devicePointer,char* strFileName)
~CNpc()
+ SetSpeed(in speed: float)
+ SetNpcPos(in nPos: D3DXVECTOR3)
20
四川师范大学本科毕业设计
+ SetNpcDirection(in nDirection: D3DXVECTOR3*)
+ SetNpcScal(in nScal: float)
+ SetNpcRot(in nAngle: float)
+ GetAction():ROLEACTION
+ SetMinAndMaxPoint()
+ GetMinPoint(in vMin: D3DXVECTOR3*)
+ GetMaxPoint(in vMax: D3DXVECTOR3*)
+ GetPosition():const D3DVECTOR*
+ GetDirection():const D3DVECTOR*
+ GetPos(in vPos: D3DVECTOR*)
+ GetAngle():float
+ SetAction(in action: ROLEACTION)
+ SetNpcY(float y)
+ NpcMove(in vPos: D3DXVECTOR3*)
+ AABBCollision(in vMin: D3DXVECTOR3*,in vMax: D3DXVECTOR3*): BOOL
Render(in nTime: float)
CRole
- m_Level: UINT
- m_HP: LONG
- m_MP: LONG
- m_Experiece: LONG
- float m_DirAngle
- float m_tempAngle
- m_bWalk: BOOL
- m_bRun: BOOL
+ CRole(IDirect3DDevice9* devicePointer,char* strFileName);
+ ~CRole();
+ SetRoleDirection(in angle: float)
+ GetRole(D3DXVECTOR3* vPos)
+ GetRoleAngle():float
+ RoleRoll(in angle: float)
21
四川师范大学本科毕业设计
+ RoleLogic(in nInput: CDirectInput*)
+ Update(in fTime: float)
+ Render(in nTime: float)
程序中有两种角色,第一是英雄,第二个就是和英雄打斗的NPC,但是英雄又属于
特殊的NPC所以可以构造NPC类之后派生出英雄类,只是在NPC基类的基础上再添加些
方法或者属性罢了,CNpc类中定义了NPC的叫声,生存时间,速度,攻击范围等基本
状态变量,还有一些改变状态的成员方法比如: SetSpeed()用来设定NPC的速度,
SetAction(),用来设置NPC的动作,当然还提供了获取状态的方法,如GetPosition()
获取NPC的位置等方法。在派生类中添加了生命值,魔法值,经验等成员变量,同时也
添加了RoleRoll()角色翻滚,RoleLogic()角色逻辑等方法。使NPC特殊化,赋予更多
的功能。
3.8.6雾效类
CFog
- m_fogType: int
- m_fogColor: D3DCOLOR
- m_OffOn: bool
- m_start: float
- m_end: float
- m_density: float
+ CFog(in devicePointer: IDirect3DDevice9*,in fogType: int,in fogColor:
D3DCOLOR,in nStart: float,in nEnd: float,in nDensity: float,in off_on: bool)
+ ~CFog(){}
+ SetStartDis(in nStart: float)
+ SetEndDis(in nEnd: float)
+ SetDensity(in nDensity: float)
+ SetFogType(in fogType: int)
+ SetFogState(in fogState: bool)
+ SetFogColor(in fogColor: DWORD)
+ GetFogState():bool
+ activationFog()
+ SetFogEffect()
22
四川师范大学本科毕业设计
雾效类CFog是用来使程序显得更加逼真的类,在类中有保存雾何时开始,何时结
束的变量m_start和m_end,还有雾的密度变量m_density,雾的颜色变量m_fogColor,
雾的类型变量m_fogType,等还有用来改变状态的方法如SetStartDis()用来设定雾何
时开启,SetDensity()用来设定雾的密度的方法等等。
3.8.7静态模型类
CMeshObject
- m_meshPointer: ID3DXMesh*
- m_materials:vector
- m_textures:vector
- m_loadModel:CLoadModel*
- m_position:D3DXVECTOR3
- m_vMin:D3DXVECTOR3
- m_vMax: D3DXVECTOR3
- m_scal: float
- m_rot: float
- m_center: D3DXVECTOR3
- m_radius: float
+ CMeshObject(in devicePointer: IDirect3DDevice9*)
+ CMeshObject(in ld: CLoadModel*)
+ CMeshObject(in cmo: const CMeshObject&)
+ CMeshObject& operator=(in cmo: const CMeshObject&)
+ ~CMeshObject()
+ SetLoadModelPointer(in ld: CLoadModel*)
+ SetTransformPos(in pos: D3DXVECTOR3)
+ SetScalSize(in nScal:float)
+ SetRotationAngle(in nAngle: float)
+ SetModelY(in y: float)
+ GetColBoxMin(in nMin: D3DXVECTOR3*)
+ GetColBoxMax(D3DXVECTOR3* nMax)
+ GetModelPos(vPos: D3DXVECTOR3*)
+ LoadModel(in fileName:char*,in texPathHead: char*)
23
四川师范大学本科毕业设计
+ CreateCollisionBox()
+ CreateCollisionSphere()
+ MeshCollision(in vMin: D3DXVECTOR3*,in vMax: D3DXVECTOR3*): BOOL
+ SphereCollision(in vMin: D3DXVECTOR3*,in vMax: D3DXVECTOR3*): BOOL
+ SetTranslation()
+ DrawModel()
+ safeRelease()
静态模型类CMeshObject是用来设定程序中静态模型的状态方法的类,它实例化出
来的就是某个静态模型的对象。类中有保存模型对象状态的变量,比如m_materials模
型材料,m_textures模型质感, m_position模型位置等变量。还有就是控制模型状态
的成员函数,SetScalSize()设置模型大小,SetRotationAngle设置模型旋转角度,
CreateCollisionBox()创建碰撞检测,DrawModel()绘制模型,safeRelease()安全释放
模型等等。
3.8.8Input类
CDirectInput
- m_pDInput: LPDIRECTINPUT8
- m_pKeyboard: LPDIRECTINPUTDEVICE8
- m_pMouse: LPDIRECTINPUTDEVICE8
- m_mState: DIMOUSESTATE
- m_mStateOld: DIMOUSESTATE
- m_dwFlags: DWORD
- m_strKeyState[256]: char
- m_bImmedi: BOOL
- m_mX: LONG
- m_mY: LONG
- m_mZ: LONG
+ CDirectInput()
+ ~CDirectInput()
+ InitInputDevice(in hInst: HINSTANCE,in hWnd: HWND): HRESULT
+ CreateDirectInputObject(in hInst: HINSTANCE): HRESULT
+ CreateKeybaordDevice(in hWnd: HWND): HRESULT
24
四川师范大学本科毕业设计
+ CreateMouseDevice(in hWnd: HWND): HRESULT
+ GetDeviceInput()
+ GetKeybaordInput():HRESULT
+ GetMouseInput():HRESULT
+ GetKeyValue(in keyValue: DWORD): HRESULT
+ CMouseKeyValue(in keyIndex: UINT): HRESULT
+ GetDirectInputObject():LPDIRECTINPUT8*
+ GetKeyboardObject():LPDIRECTINPUTDEVICE8*
+ GetMouseObject()
+ GetMouseState():DIMOUSESTATE
CDirectInput类是程序用来与用户交互的类,通俗的说就是响应鼠标键盘事件的
类,在类中定义了鼠标句柄m_pMouse,键盘句柄m_pKeyboard,状态变量m_mState,可
以记录键盘是否被按下,是否被放开的标志变量m_dwFlags, InitInputDevice()用来初
始化设备, GetKeyValue()获取键盘值,CMouseKeyValue()获取鼠标值,
GetLX(),GetLY(),GetLZ()获取光标的X.Y.Z坐标等等。
3.8.9WindowClass类
程序中的WindowClass类调用windows API来绘制一个窗口,以显示程序的内容设
计如下:
图3.8.9-1 WindowClass类图
25
四川师范大学本科毕业设计
项目在VS2003或者更高的版本中开发,大致的类视图如下:
图3.8.9-2 项目类概览图
4系统测试
本程序在windows平台,vs2005下编译通过,其中主要测试部分:
▲ 场景的效果是否达到要求,真实性良好;
▲ 人物基本的控制情况,可以响应键盘鼠标事件;
▲ 碰撞检测;
▲ 人物动作,可以打斗;
▲ NPC是否智能等等;
由于本程序是一个windows 应用程序,所以测试过程不能像类似网站那样截图以
显示效果,所以尽量使用关键截图,以说明测试结果。
程序运行结果如下图:
26
四川师范大学本科毕业设计
图4.1-1 场景测试图
4.1场景的真实感测试
从上图可以看出本程序可以满足测试点1,场景还算真实。
场景采用蓝天绿草作为基本背景,是画面显得更加生动,场景中还添加了树木以及
房屋,也是场景显得更加真实。
4.2人物基本的控制情况测试
人物基本的控制情况,可以响应键盘鼠标事件。这个可以根据运行中的程序自行测
试,即键盘的W,S,A,D角色分别向前,后,左,右行走。F为出拳,C为踢脚。
图4.2-1 打斗测试图
27
四川师范大学本科毕业设计
上图展示为人物可以和NPC进行打斗,F出拳,C为踢脚,图中显示的英雄正在用
脚踢打NPC。
4.3碰撞检测测试
3D场景中进行碰撞检测是十分必要的,因为现实生活中的碰撞时时刻刻的,3D场
景若要逼真,就必须有好的碰撞检测。
图4.3-1 建筑物碰撞检测测试图
上图显示了建筑物不可穿越,这个是碰撞检测的最基本部分,从图中可以清楚的看
出建筑物不可穿越,程序有良好的检测机制,还有一种检测就是形如山坡的检测,即人
物可以在形如山坡的地形中行走,而不掉进山坡里面:
图4.3-2 山坡碰撞检测测试图
28
四川师范大学本科毕业设计
上图表示人物可以走到山坡上来俯瞰全场景,而不至于掉进坡中。
4.4NPC的智能性测试
下图展示的为NPC的智能性,场景中有一个小狗,他可以跟着英雄一起行走,体现
了智能性。这点很像网游中的宠物,随时跟着主人走一样。
图4.4-1 NPC智能测测试图
以上就是基本的测试结果,可以说都是正常的,到此测试完毕,程序可以按照前面
功能要求的正常运行。
5结束语
毕业论文是本科学习阶段一次非常难得的理论与实际相结合的机会,本论文从建
模、动画到光影、粒子特效,从物理系统、碰撞检测到文件管理、网络特性,还有专业
的编辑工具和插件,几乎涵盖了Directx游戏开发过程中所有的重要环节。
5.1程序的不足
通过系统测试程序中还有很多不足表现为:
▲ 打斗过程中如果添加人物血条,这样可以使游戏显得更真实,有待提高。
▲ 人物被打之后没有反应效果,如果能够添加反应效果这样可以使游戏更真实,
有待改进。
▲ 角色行走上面有些毛病,就是如果没有鼠标的帮助,角色只能按照十字形方向
行走,这点需要改进,以使角色能够按照任意方向行走。
▲ 天空的云彩可以让其流动,这样可以使场景更加逼真。
29
四川师范大学本科毕业设计
这个程序只是一个简单的打斗模型,所以各方面都做的不是很好,有很广阔的研究
前景,如果有时间可以研究代码,以添加自己的一些心得的东西,是此小游戏更加丰富。
5.2心得与体会
通过此次毕业设计我总结了以下几点体会:
▲ 有利于基础知识的理解
通过本毕业设计,使我对计算机编程有了更好的锻炼,对编程的语言也有了更深的
理解,对语言的使用能力也有了很大的提高,比如可以用C++进行面向对象编程程序设
计。
▲ 有利于逻辑思维的锻炼
程序设计是公认的、最能直接有效地训练学生的创新思维,培养分析问题、解决问
题能力的学科之一。即使一个简单的程序,从任务分析、确定算法、界面布局、编写代
码到调试运行,整个过程学生都需要有条理地构思,这中间有猜测设想、判断推理的抽
象思维训练,也有分析问题、解决问题、预测目标等能力的培养。
▲ 有利于与其他学科的整合
在程序设计中,我们可以解决其它学科有关问题,也利用其它课程的有关知识来解
决信息技术中比较抽象很难理解的知识。在信息技术课中整合其它学科的知识,发挥信
息技术的优势。例如,我们在程序开发中使用了图形学知识,这就使计算机和图形学这
两大学科有利的联系在一起,等等这些都有利于知识的汇总。
▲ 有利于治学态度的培养。
程序设计中,语句的语法和常量变量的定义都有严格的要求,有时输了一个中文标
点、打错了一个字母,编译就不通过,程序无法正常运行。因此,程序设计初学阶段,
学生经常会犯这样的错误,可能要通过几次乃至十多次的反复修改、调试,才能成功,
但这种现象会随着学习的深入而慢慢改观。这当中就有一个严谨治学、一丝不苟的科学
精神的培养,又有一个不怕失败、百折不挠品格的锻炼。
过程是艰辛的,但结果是美好的,在本次设计过程中我摆脱了单纯的理论知识学习
状态,和实际设计的结合锻炼了我的综合运用所学的专业基础知识,解决实际工程问题
的能力,同时也提高我查阅文献资料、设计手册、计算机编程,设计规范以及3DsMax
建模等其他专业能力水平,而且通过对整体的掌控,对局部的取舍,以及对细节的斟酌
处理,都使我的能力得到了锻炼,经验得到了丰富,并且意志品质力,抗压能力及耐力
也都得到了不同程度的提升。这是我们都希望看到的也正是我们进行毕业设计的目的所
在。
30
四川师范大学本科毕业设计
虽然毕业设计内容繁多,过程繁琐但我的收获却更加丰富。出现问题,解决问题,
经历了无数的这样的循环过程,我的自身能力,对知识的理解,对自己动手能力的提高
统统都在这些循环中逐步提高。和老师的沟通交流更使我从不懂3D游戏设计到编写这
样一个程序有了很大的进步,同时有了新的认识也对自己提出了新的要求,举个简单的
例子:3D场景的实现,天空盒技术,角色控制等等这些问题,都在本次毕业设计中,
我熟练了掌握了它们。通过这次毕业设计让我提前了解了这些知识,这是很珍贵的。
在设计过程中一些模型的设计让我很头痛,原因是由于建模是个很繁琐的事情,小
到每一天直线,大到每一个图形,都要一点点的慢慢绘制出来,刚开始很烦躁,但是慢
慢的习惯了,这也使我对待一件事情的耐心,认真程度有了很大的提高,让我知道,干
一行爱一行的道理,人生不也和这个建模一样吗?
提高是有限的但提高也是全面的,正是这一次设计让我积累了无数实际经验,使我
的头脑更好的被知识武装了起来,也必然会让我在未来的工作学习中表现出更高的应变
能力,更强的沟通力和理解力。
从不知道毕业论文怎么写,到顺利如期的完成本次毕业设计,这给了我很大的信心,
让我了解专业知识的同时也对本专业的发展前景充满信心,这些我在毕业论文结束语中
都提起过。事实上,设计一个好的3D游戏的道路是很艰辛的,并不是任何一个人自己
能完成的,所以这就叫我们看到软件开发过程中的团结合作性,一个好的软件一定是一
个好的团队开发出来的,这点是不容质疑的吗,最后我选择这个题目,是想叫大家知道
中国游戏产业很落后,落后的不仅是几年,我们应该静下心来想想,为什么魔兽世界能
够这么红,为什么国产游戏开了几天就变成鬼服。为什么我国游戏产业会落后,这一切
的根源都是人,技术,只有大量的人掌握了先进技术,那么这项事业才能振兴。所以作
为程序员的我们,有责任来壮大振兴我国的游戏产业,这不仅关系到个人,也关系到国
家,想想一下,中国一个这么大的国家开发不出好游戏,外国人怎么看,所以通过这个
毕业设计我也呼吁我们这个时代的人,“以振兴中华而读书”这句话是永远都不会变的!
本研究是在我的指导教师的悉心指导下完成的。他严肃的科学态度,严谨的治学精
神,精益求精的工作作风,深深地感染和激励着我。从课题的选择到项目的最终完成,
指导老师都始终给予我们细心的指导和不懈的支持。从刚开始设计以来,指导老师就在
学业上给予我们精心的指导,直到设计结束。在此谨向指导老师致以诚挚的谢意和崇高
的敬意。
在此,我还要感谢和我一起完成毕业论文设计的同组同学,虽然我们不是做的一个
题目,但是正是由于他们的帮助和支持,我才能克服一个一个的困难和疑惑,直至本文
31
四川师范大学本科毕业设计
的顺利完成。特别感谢王老师给我们提供了很多3D方面的丰富资料,这让我在完成此
毕业论文的过程中能够快速获取知识,起到事半功倍的效果。在此,我谨以书面的方式
向他们表示我忠心的感谢!
32
四川师范大学本科毕业设计
参考文献:
[1] Samuel :3D计算机图形学,清华大学出版社,2006.10,P3-P9
[2] Kayshav Dattatri:C++面向对象高效编程,人民邮电出版社,2000.7,P32-P40
[3] Julio Sanchez Maria Canton:DirectX 3D图形编程宝典,电子工业出版社,
2000.10,P54-P58
[4] 乔林、杨志刚:Visual C++6.0高级编程技术-DirectX篇,中国铁道出版
社,2000.8,P102-P110
[5] André LaMothe:Windows游戏编程大师技巧,中国电力出版社,2004.2,P56-P62
[6] Kenneth :3D游戏开发大全,清华大学出版社,2007.11,P21-P26
[7] 孙家广:计算机图形学基础教程,清华大学出版社,2009.8.1,P112-P120
[8] 和青芳:计算机图形学原理及算法教程,清华大学出版社,2010.1,P70-P84
[9] 叶至军:Visual C++/DirectX9 3D游戏开发导引,人民邮电出版社,2006.2,P86-P92
33
四川师范大学本科毕业设计