java实现经典版坦克大战(基本还原)

2019/7/6 15:00(持续会再更新内容)

闲来无事写写帖子,想想上次更新已经是一年前。源码里面附带注解。游戏效果展示给企业的老师看,反馈大体上还行。项目的历程很艰辛,因为本是三人的合作项目硬生生被我一个人包揽,一支独大到目前完成得比较壮阔,算是对所学交了一份满意的答卷。项目按照规范开发,冗余依然还是有的,因为毕竟是小试牛刀,不是算成熟,但还是有个模子出来。

谈谈众多课设题目里为甚偏偏对坦克大战情有独钟?这里的课设指的是java课程的大作业。但听前辈说java的swing做游戏开发不合适。我其实也暗暗赞同哈哈。坦克大战是我对过去翻篇的致敬,以前就是几个发小挤在小屋子里玩着游戏机,当时感觉还挺风靡的东西。现在十分感叹当时的纯真。好像扯远了,哈哈以上纯属自我的价值观,和技术无关。

代码的细节及其实现,现在还是有一些印象吧,整个项目历程时间一周,大部分时间忙在逻辑设计和抠图上。网上林林总总给了许多素材,但我感觉都没有原来的味道,然后自己重新修复。自己动手,丰衣足食。有一点小遗憾的是没有实现联网,哈哈因为技术不够成熟,我的短板本来想留给其他小伙伴弥补一下,最后发现理想很美好。但是在此基础上结合各位大牛所学改进,肯定能做出更好的东西。开发环境基于Eclipse photo,不知道其他编译器兼容与否,真香。先放一波动图:

我玩的很菜

java实现经典版坦克大战(基本还原)_第1张图片

简单地阐述一下功能(有些细节不懂可以问我鸭,文章底有联系方式,欢迎学术交流鸭):

java实现经典版坦克大战(基本还原)_第2张图片

游戏分为主界面和计数模板,玩家可以在主界面battle,计数模板记录关卡敌军数量和自己剩余命数,过关后积分板,可以看到自己当前得分,每关会累计。最高分会更新游戏最开始页面上面的分数。输掉了当然就回到主界面啦。双人没有实现,其实被其他小伙伴实现了,我没加到项目里,因为他也是在我的基础上做的,所以双人这块留给大佬们练手啦,能联网了要教教我鸭。

游戏规则大家都懂。游戏的地图是自己编辑的,我写了三个图。依葫芦画瓢,自己参照一下也可以编辑 more creative map,有必要说明,原理是按照左上角像素点(x,y)在画板上描图。所以在源码里map包里可以看到大量包含点坐标的类。地图里包含五种元素,砖块、铁块、海洋、草地、冰块(在原版,坦克行驶在冰块上会滑行,但能力有限,没实现,只是显示图片哈)。一些地图元素坦克不能直接穿越,比如海洋和砖块。如何实现呢?有必要先说明,我的整个窗口以像素为单位,长高固定 560*560。地图元素(砖块等)图片32*32。建立一个二维像素数组(Tank[560][560],初始每个坐标值为0),数组每个坐标(i,j)代表一个像素点,这里有个java swing小知识点(1.(0,0)坐标对应的是左上角,而不是左下角,这里不同与数学里的坐标轴。2.画图是在给定一个像素坐标,并以此为左上角绘制),Example:我想要在最左上角(0,0)绘制一块砖块,用循环把Tank数组里该图片所覆盖的点mark为1(可以利用这里的值不同标记不同的地图元素,比如1代表砖块,2代表海洋等以此类推),很明显这里需要修改的坐标区间是(i,j)且 i:0~32  j:0~32。然后在坦克移动前加上逻辑判断(还得分情况,上下一种,另一种为左右,逻辑难度不难但也不简单),根据不同的值做不同处理,比如 1表示要移动的方向上有砖块建筑,则坦克不能继续移动,即坦克的坐标不能修改。还有就是如何实现坦克履带会动,这些算体验优化啦,还是强调先做出摸具。判断坦克在移动,用gif替换静止的时候坦克的图片,哈哈不算技术活。源文件里有Building公共父类,是所有地图元素(Grass,Ice,Sea,Steel,Wall)父类。

接下来讲坦克和道具,这就相对比较复杂。源文件里有Tank公共父类,延申出Player(玩家)和Enemy(敌人)。坦克属性对应的类的字段有注解mark,属性比如有速度,移动方向,是否在移动,生命条数,还有一些逻辑需要额外添加的字段(比如:firstDraw,实现出生是有无敌光圈。fastBullet,吃到道具触发子弹加速等等啦)。Player类里显式的看到有个存子弹的ArrayList,便于画出飞行的子弹还有好多技术细节。Enemy坦克类比如有type字段,不同的值对应不同类型的坦克(肉盾坦克(血条2条),飞速坦克(速度快),普通坦克,哈哈就三种),还有就是用来实现坦克消亡后掉落道具的award字段,道具也是多种多样啦,坦克消亡要kill线程。项目里面有用到线程,一个子弹就是一个线程,坦克也是。道具出现则在二维数组也要修改对应的(i,j),道具有以下几种类型,Boom(屏幕上出现的全部Enmey坦克自爆),Clock(时间静止,敌军坦克不能移动),Star(给过关时加分),SteelHome(好像没有实现,就是基地护栏变成金属),Life(增加自己的命数),Shield(给自己增加无敌护盾)等。文章篇幅有限,还是老话:欢迎交流鸭。源码重中之重在StageBody这里类里面,paintComponent方法加载了整个游戏的音效和图片和游戏逻辑、元素。

运行的机器要配置好java运行环境,附带下载链接:https://download.csdn.net/download/i_am_a_hreo/11289796

总结心得(我觉得很宝贵): 1. 做游戏能增加编程乐趣。2. 如果你们写的游戏运行发现显卡处理占的比很高,然后程序崩溃,试试paintComponent(Graphics g)方法里加线程休眠(不要太久,要不游戏会严重卡顿,刷新率慢,试试10~100)。别说是因为我配置垃圾(1070 + i7-8700k)。3. 想打包成.exe,试试exe4j。不过游戏会和原来有点不一样,下面会留白边,而且窗口不知道怎得变大了。4. 想实现坦克从草地下面驶出,只要改变一下画图的顺序,先画草地,再画坦克(paintComponent(Graphics g)里面去实现)。5. foreach循环里不要进行remove和add操作(特别是多线程下),今天阿里开发手册看到的,开发项目的时候深有体会。

联系方式:[email protected] 

 

你可能感兴趣的:(java,swing,游戏)