3D射击游戏 设计文档

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

3D射击游戏项目论文
3D射击游戏项目论文 (1)
一、项目背景 (2)
二、项目目的及主要内容 (3)
三、主要类图 (3)
四、系统用例及分析 (4)
五、系统分析与设计 (5)
六、主要负责部分 (6)
七、参考资料 (11)
一、项目背景
随着计算机硬件的急速发展以及3D技术的兴起,2D游戏已经不能引起玩家的兴趣,3D游戏已经成为趋势。

现在很多3D游戏很具有娱乐性,但是其操作复杂,使玩家将娱乐变成一种竞技,因此,本论文致力于开发一款高娱乐性,且操作简单的3D游戏。

其特点为:
1、游戏的场景为模拟现实的3D场景,具有碰撞检测,从而实现高度真实感,使玩家容易融入游戏之中。

2、游戏操作简单,鼠标左键射击,鼠标控制准星,键盘控制人物。

3、游戏玩家为普通大众,无年龄,技术等要求。

二、项目目的及主要内容
本项目的目的为建立至少一个3D游戏场景,加载人物模型,是玩家能控制游戏中的一个角色与计算机控制是机器人进行火拼,玩家可以切换武器(同时携带冲锋枪及手枪)。

游戏模拟一种真实的战斗场面,使玩家有身临其境的感觉。

1、游戏场景的创建。

使用OpenGL绘制3D场景,至少创建一个,如果有多个则可供玩家选择。

2、人物模型的控制。

游戏模型分为MDL和MD2两种格式。

玩家使用的角色为MDL格式的骨骼模型,该模型具有高仿真性。

机器人为MD2格式模型,该模型不具有MDL格式的高仿真性,但因其格式规范,便于统一控制。

3、游戏为了具有高度真实性,应实现碰撞检测,包括(任务与场景边界、障碍物的碰撞检测,子弹与人物的碰撞检测,子弹与场景边界的碰撞检测),检测到碰撞后应产生一定效果。

三、主要类图
本项目采用面向对象的方法开发,为达到项目目标,项目使用了多个类,主要类图如下:
图一、类图
四、系统用例及分析
玩家是本项目的参与者,玩家在游戏中可以实现漫游,射击,添加机器人等操作,也可以修改游戏设置,如游戏角色持枪方式(左手持枪或右手持枪),游戏中机器人最大数,鼠标的灵敏度等。

用例图如下:
退出游戏
图二、用例图
五、系统分析与设计
系统可划分为:基础框架模块,模型控制模块,碰撞检测模块。

结构图如下:
图三、系统模块图
六、主要负责部分
在本项目中,我主要负责三维场景搭建,模型载入与控制,游戏菜单及游戏设置部分。

1) 三维场景搭建 2) 本游戏场景如图所示:
图四、场景简图


⑤ ②



③ ⑤ ⑤ ⑤
⑤ ⑤
图例:
①小房间
②大房间
③集装箱1
④集装箱2 两种集装箱大小高度均不同
⑤木箱
注释:图中所有物体均在同一平面,只有③上面的两个④是放在③上面的。

基本思路:将场景绘制封装成类,该类通过Init()函数调用纹理贴图类的成员函数,将绘制场景所需的所有位图载入并生成纹理ID。

使用OpenGL库中绘制平面的函数绘制所有物体,并贴上相应的纹理。

在绘制场景的时候把所有物体的底面定点坐标以及物体高度保存为文件,用于以后的碰撞检测。

场景搭建及与场景相关碰撞检测封装为类,其主要成员函数有:
V oid Init(); //载入绘制场景需要的位图
V oid DrawLongBox(float xPos, float yPos, float zPos); //绘制集装1
V oid DrawLongBox1(float xPos, float yPos, float zPos); //绘制集装箱2
V oid DrawTextureCube(float xPos, float yPos, float zPos); //绘制木箱子
V oid DrawHouse(); //绘制中间的大房间V oid DrawSmallHouse(float xPos, float yPos, float zPos); //绘制两端的房子V oid Render(); //对外接口,调用绘制函数,完成场景绘制
void SetPlane(int i, float x1, float z1, float x2, float z2, float hei);
//读取地图文件,用于做碰撞检测
Bool CollisionCheck_Model(Vector3 New_Pos,Vector3 OldPos, float hei, float ModSize); //模型与场景的碰撞检测
V oid Zangan_Model(Vector3 *NewPos,Vector3 *OldPos, float hei, float ModSize); //检测到碰撞后的绕行策略
float GetHeight(Vector3 Pos); //获取场景某一位置的高度
3)模型载入与控制
在本项目开发过程中,最开始载入的是MD2格式的模型,载入模型的代码是从网上下载的案例中精简出来的。

由于后来发现MDL格式骨骼模型具有更高的仿真性(现在市面上的游戏基本上都是使用MDL格式的模型),因此放弃了对MD2模型的控制,改为对MDL模型的控制。

但是MDL格式模型的缺点是不具有统一的存储风格(不同模型的统一状态保存的顺序不同),无法进行多个模型的统一控制,所以最终选择机器人为MD2格式的,玩家角色为MDL格式的。

a)机器人控制:
基本思路:游戏中的机器人为MD2模型,因为其具有统一的存储风格,所以即使武器和人物是不同的模型,也可以统一控制。

玩家可以使用“+”来增加游戏中的机器人数量,游戏中机器人出现位置随机,每隔5秒钟随机产生状态,当模型与场景发生碰撞后产生随机角度,模型旋转该角度。

当机器人被玩家角色击中后,状态为死亡。

为了是玩家可以动态增加机器人,所以存储机器人使用容器,便于动态增加和删除。

该算法封装成类,该类的主要成员函数有:
void NewMD2Model();
void DisplayRobot(Terrain &m_Terrain, Fire &m_Fire);
void CheckCollide_Model(Fire &m_Fire, vector<Solider>::iterator iteMod);
主要控制函数为:void DisplayRobot(Terrain &m_Terrain, Fire &m_Fire);
该算法的流程为:
图五、机器人控制流程图
b)玩家角色控制:
基本思路:因为玩家可以跟换武器,但是武器被载入时会被初始化一个位置,在坐标原点。

如果采用临时加载模型的话会出现闪烁,所以在最开始的时候同时加载两种武器的模型,他们的位置实时更新,且永远相同,但是只绘制出来一个,当玩家使用哪种武器时则显示哪种武器模型。

玩家角色模型之能看见手部动作,所以,模型的状态主要为手部动作的状态,其他的跳跃等状态通过调整模型的位置来实现。

模型状态有:换弹夹;掏枪(用于切换武器),射击。

实现算法为:void PlayerCtrl(); 算法实现流程:
图六、玩家角色控制流程图
七、参考资料
[1]《UML面向对象建模与设计(第2版)》巴拉赫、兰宝人民邮电出版社
[2]《C++ Primer中文版(第4版)》Stanley B.Lippman、Josée Lajoie、Barbara
E.Moo、人民邮电出版社
[3]张海藩:《软件工程导论》[M].第4版.北京:清华大学出版社,2005.7
[4]侯俊杰:《深入浅出MFC》[M].第1版. 华中科技大学出版社,2001.1
[5]《OpenGL编程指南(第七版)》机械工业出版社
[6]《OpenGL游戏编程》徐明亮卢红星机械工业出版社。

相关文档
最新文档