自从若干年前研究了古老的Java Swing,就决定要用Swing做点有意思的东西出来,一方面自娱自乐,另一方面也锻炼锻炼编码技术。
这个坦克大战游戏的立项看了一下记录是2021.12.25,应该是圣诞节那天确定的,然而比较尴尬的是时间过去了一年半多了,当时吹下的牛(立下的flag),至今还没有实现,作为一名码农(程序员or爱码士),实在惭愧,是时候兑现了,2023年8月份我就把当时实现的项目重新熟悉了起来,可怜巴巴的几个类,只实现了游戏主体循环,内容还要一点点的来。
这个项目的框架依然和之前开发打砖块游戏Java Swing制作古老的打砖块游戏所用框架一模一样,没有区别,是在JFrame基础上实现双缓冲绘制和交互,其实这样比较麻烦,不如直接使用JPanel类,系统已经实现了双缓冲,不用自己再实现一遍了。自己当时还自己琢磨了一个非常简单的爆炸效果,[破涕为笑]。
争取尽快实现并发布到某hub上吧。至于游戏原理大致是怎么回事儿,打砖块那篇文章有说,下面就直接进入正题了
玩家坦克和敌军坦克,一开始代码手绘了坦克,矩形+圆形+矩形,非常简陋,先表示这么个意思,后续再优化,看能不能找人做个坦克图片啥的。顺便实现了圆形炮弹发射。
后来从游戏视频中截图,然后使用gimp软件抠图,实现了敌军坦克的美化,顺带练习了抠图。
玩家坦克,按方向键进行控制,实现坦克4个方向的移动,按ctrl键发射炮弹。
敌军坦克,在游戏循环中自主移动、发射炮弹,遇到障碍物或墙拐弯。
地图是用瓦片拼接实现的,瓦片是最小,不可分割的地图单位,共5种,砖块、草地、铁块、雪地、河流。目前缺少雪地,取色并绘制矩形实现,草地略复杂。
(1)刚开始,tile瓦片尺寸50*50,后来经过对游戏的仔细观察和开发实践,发现这样不好实现只有一半瓦片、混合瓦片的情况,比如一半砖头,一半砖头加一半钢铁。
(2)再有游戏中砖块按5050情况,如果只剩下5025,那么坦克是可以走到空白的50*25的,可是也不太好实现。
(3)豪华版的游戏中玩家坦克三颗星发射炮弹消除钢铁的1/4的小块钢铁也是有的,才发现自己这思路是不能满足这个需求的,于是决定重新修改地图的实现逻辑,瓦片的大小需要改称4块钢铁中一块钢铁大小尺寸才是合适的,这样即可满足需求。
看了b站一个大佬的坦克大战开发视频讲解(Windows平台使用C语言调用系统绘图API进行的实现),感觉这么做确实不妥,如上一些需求实现起来很麻烦,于是改为25*25。
另外由于Java Swing Graphics对float支持不是太方便,后续可能改为24*24。
敌军坦克之间,相互碰撞和拐弯掉头已经实现
坦克被消灭,敌军坦克有一些需要多枚炮弹才能消灭。
一直找不到好的解决办法。已经解决,在坦克停止移动后,将坦克强制对齐到下一个网格线。
道具功能,由于时间的仓促和功能的取舍,目测要放到二期工程了。
道具对坦克外观的影响,道具对炮弹火力的影响
初级坦克发射一发炮弹,只能消除1/4的方块层级,每个砖头方块有4层,当炮弹升级到某个级别一发可以消除2层,铁块的话,一共2层,一发消除1层。
炮弹消除砖块;已经实现。地图被击中的处理,这个处理感觉略显复杂,尤其砖头方块,被击中后,需要考虑强弱火力,击中后还剩多少,处理起来略复杂一些。
炮弹消除铁块,铁块消除,玩家已经吃了3个星星,这时候火力很猛,可以消除铁块了;
另外当玩家吃了2个星星或2个以上,这时候炮弹可以消除2层砖块。目前缺少星星道具,目测二期实现。
炮弹击中坦克:消灭坦克。已经实现。
炮弹击中炮弹,相互抵消已经实现。(玩家和敌军的炮弹,敌军炮弹相互是不抵消的)
炮弹击中基地,或玩家生命为0,game over
目前觉得在方块tile被击中后应该记录状态,根据状态进行重绘,状态改变和绘制的过程可能有些复杂。后来发现不用记录也行,直接在图形上表现出来即可,不过还是记录状态更好,通过状态值可以了解瓦片的形状。
有一个问题,音效播放数量错误,每一个音效播放不完整,只有最后面的音效完整。Mac上面音效却是完整的。在间隔时间很短,连续消灭2辆敌军坦克的时候,敌军坦克爆炸音效第二声没播放出来,这是一个问题。
基地老家被消灭或玩家坦克全被消灭,游戏结束。
后续再说吧
二期工程再说,暂时不做。
代码都在这里了,大家根据需要自取吧。
https://github.com/ximen502/WarOfTank
https://gitee.com/ximen502/WarOfTank
学习了Java Swing知识后,就开发了打砖块游戏,也叫弹球游戏,详情请看Java Swing制作古老的打砖块游戏,自己觉得效果还行[敝帚自珍/doge],不过看过这篇文章的人却不多,不过某一天我在文章底部推荐里面看到一篇文章JAVA 实现《JAVA打砖块》游戏,相似度不高,不过看代码相似度贼高,目测99.9%,人家的阅读人数突破了4万,我的源码被传到下载里面明码标价30¥,暑期还搞了一波促销活动11.9¥,我简直不能相信,[捂脸]。为啥差距有几十倍。也不知道代码是否有人下载,他赚了多少钱……