天津理工大学2010届本科毕业设计说明书
引擎启动后第一件事件为创建游戏窗口,所以拥有游戏引擎设计后只需在initialize()中添加 窗口的创建代码即可。游戏循环时所有的消息都抛给HandleEvent()处理。
而一些具体的细节,如:AddSprite(Sprite* pSprite),DrawSprites(HDC hDC),UpdateSprites(),CleanupSprites()和IsPointInSprite(x,y)在相应的镭射机中都有相应的虚函数 ,会根据动态连编调用到相应的函数,所以那就是其他类设计的问题,所以游戏隐形可以很好的分离游戏运行方式和代码编写。
以下为引擎的一些属性(数据成员):
static GameEngine* m_pGameEngine; HINSTANCE m_hInstance; HWND m_hWindow; TCHAR m_szWindowClass[32]; TCHAR m_szTitle[32]; WORD m_wIcon, m_wSmallIcon; int m_iWidth, m_iHeight; int m_iFrameDelay; BOOL m_bSleep; UINT m_uiJoystickID; RECT m_rcJoystickTrip; vector
// //应用程序句柄 //窗口句柄 //窗口类名称 //游戏标题 //游戏图标
//游戏的宽度和高度 //帧延迟 //休眠状态
//子画面列表
3.3.5 AlienSprite类
此类为将子类,它的用途为在游戏中为玩家提供各种各样的帮助,如 一定时间内无敌 加一条命 或者 减一条命等等。
此类与坦克类的最大差别在于它是可以“自生”也可以“自灭”。所以添加了一个 保护的数据成员 m_iTime 。和一个功能函数(AddTime()) 两个访问函数。当奖子update()时自动调用AddTime(),当m_iTime大于300 时 自动销毁。
在游戏循环中可以根据游戏的难度来计算出奖子的频率,难度越大出现酱紫的几率越小。If((rand() % (200-g_iDifficulty)) == 0)。
游戏规则:获得无敌清除以前的无敌时间,重新开始计算不会累加。获得加一命,如果为满命则不会增加生命上限。获的减一条命,如果仅剩一条命则不会死亡。
- 12 -
天津理工大学2010届本科毕业设计说明书
第四章 详细设计
4.1 详细设计概述
详细设计是对设计结果进一步细化,给出系统的精确描述,以便在编码阶段直接翻译成计算机上能够运行的程序代码。详细设计虽然并不是用计算机程序设计语言编程,而是要细化总体设计的有关结果,形成软件详细规格,但与其编程思想、方法和风格有密切相关的。为了保证软件质量,软件详细设计既要正确,又要清晰易读,便于编码实现和验证。
在软件的生命周期中,设计测试方案和诊断程序错误,修改程序等等都必须首先读懂程序。实际上对于长期使用的软件系统而言,人读程序的时间可能比写程序的时间还要长得多。因此衡量程序的质量不仅要看它的逻辑是否正确,性能是否能满足要求,更主要的是要看它是否容易阅读和理解。详细设计的目标不仅仅是逻辑上的实现每个模块的功能,更重要的是设计出的处理过程应该尽可能简明易懂。结构程序设计技术是实现上述目标的关键技术,因此是详细设计的逻辑基础。
4.2 图形图像设计
本游戏所有图片均是采用PS制作,由于在图片显示时,每一个像素都要求色菜不变,也就是RGP不可变。所以采用像素图的方式来进行绘图。游戏中使用 :R:255 G:0 B:255 (粉红色)为透明色。
像素图(也叫点阵图、光栅图),顾名思义就是由点(一个点就是一个像素)构成的,如同用马赛克去拼贴图案一样,每个马赛克就是一个点,若干个点以矩阵排列成图案。这种图片在比较正常的情况下看不到像素点,但是当你把它放大到一定程度时便可以看到里面的小颗粒,即像素颗粒。与之相对的是矢量图。矢量图的内容是用数字化信息来存储的,可以无限放大,放大多少倍图形也不会丢失,即精度不变。
像素图是以最小的像素点为单位,通过人为的艺术加工,在有限的范围内,有规律的布局组合的图片,可以说,像素图必须是通过艺术者的加工才能产生的。通常用在特定的地方,如电脑图标,网页界面,游戏图片等。
位图则通常指包含成百上千万的复杂的颜色和坐标点的大图片,视觉上无法察觉像素点的存在,而是放大多倍后,实际上由大量看似无序的像素点组成,完整效果很精细的图片。通常指电子照片,电子图画等。
像素图和位图的区别就在于,前者是由有序的像素点组成的,图片小,而后者是超大量无序的像素点组成,图片大。而两者都属于点阵图。
- 13 -
天津理工大学2010届本科毕业设计说明书
4.3 算法详细
4.3.1 炮口瞄准鼠标算法
实现方法:得到gun 指向 mouse 的 向量 ,根据向量方向计算gun的当前帧。 当前帧数与向量范围对应关系如下:
第 1 象 限 第 2 象 限 第 3 象 限 第 4 象 限
表4.1 gun 方向表
方向 0->15 15->45 45->75 75->90 90->105 105->135 135->165 165->180 180->-165 165->135 135->105 105->90 90->75 75->45 45->15 15->0
tan范围 XX->3.732 3.732->1 1->0.268 0.268->0 0->0.268 0.268->1 1->3.732 3.732->XX 3.732->XX 3.732->1 1->0.268 0.268->0 0->0.268 0.268->1 1->3.732 3.732->XX 帧数 1 2 3 4 4 5 6 7 8 8 9 10 10 11 12 1 图4.1 炮口图
以下为第一象限的判定方法:
if(fRadion<100&&fRadion>3.732){g_pTankSprite->SetGunCurFrame(0);}
if(fRadion<3.732&&fRadion>1){g_pTankSprite->SetGunCurFrame(1);} if(fRadion<1&&fRadion>0.268){g_pTankSprite->SetGunCurFrame(2);} if(fRadion<0.268&&fRadion>0){g_pTankSprite->SetGunCurFrame(3);}
- 14 -
天津理工大学2010届本科毕业设计说明书
原点 X yy xx Y 图4.1 炮口 方向示意图
4.3.2炮弹的轨迹算法
已知运动的目标坐标和发射坐标,求出初始速度。也就是求发射坐标指向靶子坐标向量的方向。
运动大致上可以分为12个方向,所以把轨迹向量的方向分为12个区域,每一个区域的中分线方向就估计为速度的方向。
int xPoi=g_pTankSprite->GetPosition().left +g_pTankSprite->GetGunWidth() /2;
int yPoi=g_pTankSprite->GetPosition().top+g_pTankSprite->GetGunHeight()/2; int xx=x-xPoi; int yy=y-yPoi; float fRadion=1.0f;
fRadion=(float)xx/(float)yy; if(fRadion>100)fRadion=100; if(fRadion<-100)fRadion=-100;
- 15 -
天津理工大学2010届本科毕业设计说明书
6 3
5
6 4
4
6
6
图4.2 第一象限轨迹示意
表4.2 炮弹方向表
方向 第 1 象 限 第 2 象 限 第 3 象 限 第 4 象 限
tan范围 XX->3.732 3.732->1 1->0.268 0.268->0 0->0.268 0.268->1 1->3.732 3.732->XX 3.732->XX 3.732->1 1->0.268 0.268->0 0->0.268 0.268->1 1->3.732 3.732->XX 速度X 0 3 5 6 6 5 3 0 0 3 5 6 6 5 3 0 速度Y -6 5 3 0 0 3 5 6 6 5 3 0 0 3 5 6 0->15 15->45 45->75 75->90 90->105 105->135 135->165 165->180 180->-165 165->135 135->105 105->90 90->75 75->45 45->15 15->0 - 16 -