二维小游戏制作
一、课题内容和要求
1.课题内容:
(1)学生需要针对游戏类应用软件(如数独,扫雷,飞机大战,贪食蛇,青蛙过河等,鼓励自己设计开发游戏)的开发,使用互联网信息检索工具,查找和学习游戏类软件开发相关理论,分析和研究开放源代码;选择合适的JAVA开发工具完成软件项目的创建,代码编写,调试和测试。
(2)学生需要以软件开发团队的方式,完成一个软件的开发,覆盖软件开发工程的全部过程(需求分析,软件设计、实现、测试)。学生需要在理解课题的基础上合理地设计项目,在规定时间内完成项目的开发,实现项目中的各项要求。
2.课题要求:
设计一种二维游戏,完成界面设计和必要的游戏功能(如分数统计,难度调节等)
3.课题理解:
基于此课题,我们决定运用JAVA开发一款坦克大战的游戏,可以支持单、双人模式的选择,坦克的移动、射击,建筑物的破坏、剩余敌人的计数等功能,对于这种构想,我们需要从网络上大量汲取资料,学习相关理论,在代码的编写方面,一步一步走,也方便发现错误,纠正,在后期我们还要对代码进行不断测试、改正,达到完善。
二、需求分析
1.目标任务:
制作坦克大战小游戏
2.实现软件:
Eclipse
3.如何实现:
(1)设计用户界面,支持单、双人模式的选择,并提示如何进行选则、以及坦克的操作。
(2)坦克:坦克分为两种,敌人坦克和我的坦克。我的坦克和敌人的坦克均可以发射子弹,可以改变行走路径。坦克受到到子弹的攻击就会死亡,游戏就会结束。
(3)方向:坦克和子弹都有方向,可以选择上下左右四个方向,并且子弹的方向从属于坦克的方向。
(4)子弹:子弹可以由敌方和我的坦克发出,发射的子弹以直线方式发射,直到子弹超过边界或击中敌方坦克就会消失。
(5)基地:基地的设计,是为了给我们的游戏玩家,带来游戏的紧张与刺激,更快进入游戏氛围。基地被敌人子弹击中,游戏就会结束。
(6)墙体:设计了墙体,分别用来拦住敌人,和保护我们的基地,但可以被我们和敌人的子弹击中,击中后就会消失,坦克可以正常通行。
(7)爆炸效果:坦克被子弹击中后会产生爆炸效果。
(8)敌人数量显示:在界面的左上角,实时显示敌人坦克所剩数量。
4.预期成果:
(1)在游戏模式选择界面,我们可以进行游戏模式的选择,设定按下“1”时为单人模式、按下“2”为双人模式,在单人模式、和双人模式前会出现一个图标,可以提示玩家当时的选定是哪一个模式,敲击回车进入。
图1 游戏模式选择界面
(2)在游戏界面,有总体的部署图:玩家一与玩家二的出生位置,敌人出生位置,墙体位置,基地位置。在此界面我们可以通过键盘对坦克进行操作,移动或发射子弹。
设定:“WSAD”为玩家一的上下左右移动键;
“Blank Space”为玩家一的子弹发射键。
“↑↓←→”为玩家二的上下左右移动键;
“K”为玩家二的子弹发射键。
图2 游戏界面
(3)在游戏结束界面,会出现游戏结果的提示,如果我们消灭所有的敌人并且守卫基地不受攻击,就会获得游戏胜利,否则就会游戏失败。
图3 游戏结束界面
三、概要设计
1. 主要功能的流程图
2. 主要类及类之间的UML图
四、测试数据及其结果分析
1.窗口界面、文字的绘制,模式选择的图标提示
图6 游戏界面图
运行代码发现,可以出现窗口、图标及文字,经检测键盘输入1和2时,会选中相应的模式,坦克图标也会相应变换。
2.玩家坦克、敌人坦克、墙体、基地的初始化
图7 游戏元素的初始化
运行代码,选择单人模式,所需出现的元素都正常出现。
3.实现玩家坦克的移动和敌人坦克的随机移动,玩家家子弹的射出、以及敌人坦克子子弹的随机射出,敌方坦克的随机生成。确定子弹发射时间的间隔
图8 子弹发射
图9 敌方坦克随机生成
通过检测,玩家子弹发射功能正常,移动控制功能正常,敌人坦克实现随机移动、子弹的随机射出,以及坦克的随机生成。子弹的发射时间间隔在合适范围范围。
4.实现碰撞检测
敌人子弹与玩家坦克碰撞时,游戏结束;玩家子弹与敌人坦克碰撞时,坦克消失;当子弹与墙体碰撞时,墙体消失;当子弹与基地碰撞时,游戏结束,当坦克与墙壁碰撞时,不能再向前进行移动(即墙体不可穿越);玩家坦克与边界碰撞时,不能再向前进行移动;敌人坦克与边界碰撞时,随机改变方向。
图10 碰撞检测
经过检测发现,碰撞检测各项功能均可正常实现。
5.实现双人模式、显示游戏规则提示、实时显示敌人剩余数量
图11 文字显示、玩家二写入
依照于玩家一的程序可以简单编写出玩家二的代码,经过检测,游戏的规则在界面的两边可以正常显示,敌人数量的实时显示在界面左上角正常显示,且显示结果正确。玩家二正确写入,可以进行移动和子弹发射。
6.实现敌人坦克被击中后的爆炸效果
图12 爆炸效果
关于爆炸效果,是通过8张照片,按照顺序出现完成的。(由于出现时间较短,很难抓取图片,采用了录像截图,清晰度不是很高)通过对录像的0.1倍速的查看, 8张图片按顺序出现。爆炸效果正常。
7.实现游戏暂停、游戏结果显示
图13 游戏暂停
图14 游戏结果显示
通过测试,当按下P键时,游戏会暂停,并跳出文字提示,再次按下游戏就会继续。
当被敌人消灭或基地被子弹击中后,游戏结束,并显示“游戏失败”;当消灭所有敌人时,游戏结束,并显示“游戏胜利”。
五、调试过程中的问题
1.图片闪动问题;
在界面面绘制时,当模式切换,坦克图标进行改变时,发现出现屏幕闪动,并且当快速按下“1”、“2”时,图标无法及时改变位置。于是,查阅资料了解到,如果使用双缓冲,就可以很好的解决这个问题。
问题解决:重新创建一个空的图片,把所有自建先绘制到空图片上,再把绘制好的图片一次性绘制到窗口中。通过应用双缓存,再次运行代码,进行检测,发现屏幕不再闪动,模式改变图标能够及时跟随。
2.游戏结果显示问题:
在界面上显示的文字,对不同的提示文字,需要修改不同的文字颜色,以及合适的大小。于是对开始界面、游戏规则提示、游戏暂停、游戏结果等所显示的文字进行了修改,修改后发现,开始界面的文字达到预期效果,敌人剩余、游戏暂停、游戏结果所显示的文字,并没有显示出来。程序也没有进行报错。
问题解决:经过检查发现,一开始在进行文字绘制时,整体文字运用一种文字参数,当在进行各部分细化修改后发现,对整体的文字参数设计全部删掉,仅是添加了对开始界面文字参数设置,只起到部分的作用涉及不到其余部分,于是及时进行了填补。运行代码,通过检测,发现所有文字均可正常显示。
3.jar文件生成问题:
在eclipse中按照常规的导出操作,生成一个Jar文件,点击打开,发现图片均不显示。
问题解决:上网查阅后发现,其一可以通过使用内部资源文件的方式解决:把所用的图片文件放在项目使用的包中,打包时把图片文件同时打进Jar文件中;其二可以使用外部资源文件的方式解决,把项目打包生成Jar后,再新建一文件夹,把项目中所有使用的图片文件和生成Jar文件放在该目录下,只要代码对图片文件的引用路径正确。为方便解决,选用使用外部资源文件的方式解决,将生成的Jar文件与images文件夹放在一起。之后我们再次运行Jar文件,发现图片成功显示,各功能正常。
六、课程设计总结
通过本次,我对Java面向对象编程有了一定的认识了解,把一个游戏分成几个对象编程。这次作业说实话还是很充实的,因为一步步下来,每一步自己动手做出来会有成就感,当然更多的是是挫败感啦。但是这次经历很好的把Java这门课程的知识点巩固,纸上学来终觉浅,绝知此事要躬行。这些相关知识的学习巩固通过本次的实际操作得到进一步的认识强化,也让我对Java面向对象编程产生较为浓厚的学习兴趣。还是想多学一点关于这门课的知识,因为实践起来很有趣。尤其是开发一个自己小时候喜欢玩的游戏,让我觉得不可思议。
通过该游戏的设计,我对Java有了更进一步的了解,不仅提高了我个人的编程能力,还形成了良好的编程习惯,希望在今后不断学习的过程当中,能够进一步完善该系统,增加其可玩性。
在今后的工作中,还会做更多更复杂的的项目,这次坦克大战单机版游戏的开发使得我认识到了自己的不足,今后一定认真学习专业知识,将理论与实践相结合,使得自己在该领域有更大的作为!