《坦克大战》系统分析设计Word文档下载推荐.docx
- 文档编号:4543239
- 上传时间:2023-05-03
- 格式:DOCX
- 页数:12
- 大小:110.72KB
《坦克大战》系统分析设计Word文档下载推荐.docx
《《坦克大战》系统分析设计Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《《坦克大战》系统分析设计Word文档下载推荐.docx(12页珍藏版)》请在冰点文库上搜索。
1.6积分模块4
1.7作弊模块5
1.8道具模块5
2.面板绘图模块5
3.事件处理模块6
二、程序关键类说明7
1.Tank类7
2.Missile类8
3.TankLocal类9
4.BloodTool类10
一、系统功能模块
整个游戏系统利用面向对象语言Java编写,程序可大致分为以下几个大模块:
更详细可将战斗模块做以下分解:
1.1移动模块
●模块描述:
使玩家与电脑坦克能够自由并且匀速流畅的进行移动,通过按下和松开键盘上的方向键来实现移动和停止移动。
●设计方案:
我们对传统的坦克四向移动方式其进行了完善,将原本的四向移动完善为八向移动,即除了传统的上下左右移动之外,还增加了斜向移动,也就是左上、左下、右上、与右下。
除了可以按住单个方向键进行四向移动之外,还可以同时按住两个互不相反方向键来进行斜向移动的实现,松开方向键之后坦克停止移动,同样,电脑控制的坦克也是八向的移动方式,这样就增加了更多的不确定因素,游戏的耐玩性和挑战性得到了提高。
●关键技术介绍:
在tank类中定义一个枚举类表示方向,其中包括9个固定方向对象:
八个方向+stop静止,方便直接调用这些固定对象;
对主站坦克,即玩家的坦克设置布尔类型的方向标志位,再通过switch...case...语法对玩家按键情况进行检测,于是可以检测出玩家按下的两个键,最后通过调用位移方法达到移动的目的。
1.2射击模块
使玩家与电脑控制的坦克能够流畅并且自由但是有限制的发射子弹,通过按下和松开键盘上的空格键来实现射击和停止射击,子弹弹道以直线匀速的形式飞出。
我们对传统的坦克四向射击方式进行了完善,将原本的四向完善为八向射击,即除了传统的可以上下左右射击之外,还增加了斜向射击,也就是说在八向移动的基础上,按下键盘上的空格键,玩家控制的坦克就可以朝着当前的朝向发出子弹,如果玩家按住空格键不放,坦克将只会发出一颗子弹,而不是不停的射击。
在八个方向移动的基础上,通过监听玩家按下的按键,在绘制子弹前,获取当前坦克的移动方向标志位的值dir,就可以知道即将打出的子弹朝哪个方向飞行,并绘制它即可。
飞出的子弹不改变方向直线匀速(大于坦克的移动速度)飞行,直到撞到障碍物或边界或击中坦克,子弹消亡。
1.3生命值模块
让玩家和电脑控制的坦克都具有一定量的生命值,在受到攻击之后生命值减少,电脑控制的坦克生命值减少完之后就会被摧毁,玩家的坦克生命值减少完之后游戏结束,增加游戏的可玩性与玩家容错率。
将生命值用血条的方式呈现出来,即在玩家和电脑控制的坦克的图标上方显示代表当前生命值的血条,电脑控制的每辆坦克可以承受4次攻击,然后被摧毁,玩家控制的坦克可以承受6次攻击然后被摧毁,游戏结束。
每次受到攻击之后血条就会有相应的减少来响应被攻击。
利用到Java中的内部类,这样的好处是可以直接与tank对象融为一体,坦克移动血条就会跟着移动;
在tank类里定义一个内部类,bloodbar血条,里面包括自身的draw方法,画出血条,血条长度通过获取坦克当前的血量进行绘制。
这样就可以实现坦克的生命值的图形化。
1.4碰撞检测模块
游戏中,坦克与坦克之间,坦克与墙之间,子弹与坦克之间,子弹与墙之间等都需要进行碰撞检测,撞墙不能前进,坦克之间也不能相互穿透,子弹也不能穿透墙壁。
通过获取被测对象的当前坐标,并对两个对象的坐标进行比较检验是否发生碰撞;
坦克与坦克之间,通过从坦克集合里遍历取出坦克,判断是否存活,然后依次与被测对象进行碰撞检测,其他情况的碰撞如子弹与坦克可同理实现。
利用Java中最简单的矩形碰撞检测,先引入publicRectanglegetRect()方法,被测的两个对象直接调用getRect()方法得到自身所在的矩形表框,通过intersects()方法比较两个对象的所在矩形框是否相交来判断是否发生碰撞。
1.5对象创建模块
游戏中所有可视化对象的创建过程与方法,有的简单的逐一创建,有点群体创建。
对主坦克、墙障碍进行单独创建,对敌人坦克、子弹、爆炸效果等对象进行群体创建,并合理地对它们进行添加、删除等操作。
利用Java中的集合中ArrayList来实现对象的群体控制,对子弹、敌人坦克、爆炸效果各定义一个ArrayList,并在各自应该创建的地方利用add()方法添加到数组中即可,最后在主类中遍历取出每个对象,调用各自的draw()方法就可以创建并绘制出多个对象。
1.6积分模块
由于本游戏的核心就是玩家控制坦克去摧毁电脑控制的敌方坦克之后获得积分的增加,因此积分模块用于显示玩家当前的积分,每摧毁一辆敌方坦克都会获得一定量的积分,增加游戏的挑战性同事具备了一定的攀比性。
玩家的当前积分显示在游戏界面的右上角,当玩家控制坦克通过射击摧毁了一辆电脑控制的坦克之后,积分会增加10,直到玩家控制的坦克被摧毁之后游戏结束,每一局游戏的开始玩家的积分都会重置归零。
在主类中定义有grade静态变量,同时在tank的draw()方法里,判断若坦克为敌人坦克,且存活情况为死亡,则对此变量进行加10操作;
在玩家按下F2键时监听操作,并在重置游戏后,将grade重置为0即可。
1.7作弊模块
该模块的功能是可以让玩家通过按下特殊的作弊按键使其控制的坦克朝八个方向进行子弹发射,以体验全面摧毁敌方坦克的爽快感,并且降低游戏难度。
玩家按下键盘的ctrl键(所谓的“作弊按键”)时,玩家控制的坦克可以朝8个方向进行射击,与普通攻击键空格键类似,按住不放时只能攻击一次,不停的按则会不停的射击。
在tank类中定义一个与枚举类Direction的数组,然后循环8次得到8个方向的值,并调用单颗子弹发射的方法fire()方法。
1.8道具模块
游戏内设置有障碍墙、障碍河流、草丛以及补血道具,提高游戏的可玩性。
障碍墙能挡住坦克和子弹,障碍河流只能挡住坦克,子弹从上方飞过,草丛可以遮住坦克,而补血道具可以补满主坦克的血量。
将电脑控制的坦克与玩家控制的坦克用不同的模型来表现,游戏中加入障碍物的元素,即电脑与玩家控制的坦克均无法通过。
添加血瓶道具,并沿着固定路径不断来回移动,当玩家控制的坦克经过道具的时候,获得生命值增加的效果。
建立BloodTool类,并在类中定义一个二维数组来存储它的运动轨迹,定义好初识坐标和道具大小,同样定义好draw()方法以及move()方法,并定义道具的运动为满一个周期就继续下一步移动,若满一个周期就重置位置。
2.面板绘图模块
此模块主要对游戏主面板进行实时绘制,包括游戏中所有的具体的对象(坦克、子弹、道具、障碍物)并重绘,以使游戏能正常运行,同时利用有关技术使重绘时,坦克移动、子弹飞行等操作不会出现闪烁现象。
模块主要在主方法里面实现,在主类里面实现面板重绘的线程以到达实时绘制画面,并利用画笔在paint方法里面画出所有的可视化对象,将需要先绘制的对象绘制到虚拟图片上即update方法内,最后再绘制到主面板上;
同时在面板上绘制出,剩余敌人坦克数量、主坦克生命值、得分等信息。
另外在Tank、Missile、Bomb、Wall、River、Grass等类中都有各自的draw()方法,均用图片代替画笔进行对象的形象绘制。
每个类中采用Toolkit来导入外部图片资源,并通过反射机制来通过资源的URL来找到资源的位置;
主面板采用了Java中的“双缓冲”技术,双缓冲即在内存中创建一个与屏幕绘图区域一致的对象,先将图形绘制到内存中的这个对象上,再一次性将这个对象上的图形拷贝到屏幕上,这样能大大加快绘图的速度。
双缓冲实现过程如下:
1.在内存中创建与画布一致的缓冲区
2.在缓冲区画图
3.将缓冲区位图拷贝到当前画布上
4.释放内存缓冲区
3.事件处理模块
玩家通过键盘上按下松开相应功能按键的方式来对坦克的移动、射击进行操作,或按下功能键,进行特定功能操作;
比如玩家死亡,按下F1坦克重生等。
在主类里设置监听类,监听键盘按键事件,并在坦克类里,对按键事件的反馈进行处理;
玩家通过键盘上的方向键来操作坦克的移动,按下上、下、左或右键坦克能进行普通的四向移动,同时按下左上、左下、右上或右下方向键,坦克能斜向移动。
按下空格键坦克能发射一颗子弹,按下ctrl键坦克能进行爆发射击,朝八个方向同时射击,同时按下移动键和射击键则可以实现一边移动一边攻击。
松开各个按键之后坦克会停止相应的动作,
利用在主类里设置好监听器KeyMoniter,对键盘的按下、释放操作进行监听,并在tank类里进行事件的处理,用switchcase来对上下左右,空格,ctrl
F1、F2等按键识别并反馈。
二、程序关键类说明
游戏程序中总共涉及到6个类,以下给出其中部分关键类的类图,并加以简要说明,包括Tank类、Missile类、TankLocal类、BloodTool类
1.Tank类
属性:
坦克类是最主要的类,包含了坦克的一些基本的属性,如初始坐标、移动速度、存活情况、正义或反派,也包括了一些特殊用途的变量,如frontX,frontY用来判断坦克是否撞墙的,step则是用于产生敌人坦克移动的随机步数。
方法:
1 两个参数不同的构造方法、自身的draw()方法,绘制坦克
2 locate()方法用于确定判断坦克移动的方向,主要判断是否为斜向移动
3 move()方法则是控制坦克坐标移动
4 fire()方法用来构建子弹对象并加入到子弹集合中
5 另外还有事件处理方法KeyPressed()和KeyReleaes()
6 impactOnWall()用来判断坦克是否撞墙(省略impactOnTank()原理相同
7 superFire()则是用来实现八个方向的子弹发射的
8 stayMove()用于处理坦克撞墙的坐标变换
9 eat()方法用来判断主坦克是否与补血道具碰撞及处理
内部类:
坦克类中还拥有一个内部类BloodBar,用于绘制坦克的血条
2.Missile类
子弹的初始坐标x、y,子弹的存活情况、正义或反派以及方向,还定义着主面板TankLocal的引用tl。
1 两个不同参数构造方法,子弹自身的draw()方法,绘制子弹
2 move()控制子弹的移动
3 hitTank()判断子弹是否击中坦克及处理,并遵循相同justice值的子弹与坦克不能发生碰撞
4 getRect()用于返回子弹的坐标、宽度和高度,以便进行碰撞检测
5 hitWall()用于判断子弹是否撞墙及处理
3.TankLocal类
主面板中属性较少,主要是一些对象创建的工作,也有一些全局变量,如有grade,记录玩家的分数。
1 paint()方法是最重要的方法之一,所有的可视化对象都必须在此方法中实例化,并绘制。
包括坦克,子弹,墙壁,以及信息栏的文字信息,都需要在此方法中随主面板实时刷新,也因此能看到对象的移动。
2 update()方法是双缓冲技术的实现,主要画出一张虚拟图片,将要加载的内容绘制好,再拷贝到当前画板中。
3 startFrame()负责创建主面板,并初始化一些面板数据,如标题、背景色、可见性、窗口尺寸可更改性,还负责启动主线程。
4 main()启动程序
1 paintThread线程内部类,用于重绘面板
2 KeyMoniter监听内部类,用于监听主坦克的按键事件
4.BloodTool类
道具的初始坐标x、y,宽高w、h,记录移动的步数step,存活情况isLive,主面板引用tl,移动的轨迹数组postion[][]
1 构造方法BloodTool(),道具自身的draw()方法,绘制道具
2 move()控制道具的不断移动
3 getRect()得到当前道具的坐标及宽度和高度,用于坦克对其的碰撞检测,从而判断坦克是否“吃”到道具。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 坦克大战 坦克 大战 系统分析 设计