Java Swing手搓童年坦克大战游戏(II)

文章目录

  • 0.初衷
  • 1.创建游戏窗口
  • 2.创建坦克
  • 3.实现坦克移动和发射炮弹
  • 4.创建地图
    • 4.1关于地图瓦片的尺寸遇到的问题
  • 5.坦克与障碍物的碰撞处理
    • 5.1碰撞检测
    • 5.2坦克与地图中的瓦片碰撞
    • 5.3坦克相互碰撞
    • 5.4坦克碰见炮弹
    • 5.5坦克拐弯
  • 6.道具
    • 6.1星星
    • 6.2炸弹
    • 6.3钟表
    • 6.4城堡
    • 6.5坦克
    • 6.6无敌圈
  • 7.炮弹命中目标的处理
  • 8.连续发射炮弹
  • 9.游戏结束game over逻辑处理
  • 10.炮弹突破游戏窗口
  • 11.思路理顺
    • 11.1碰撞检测:
    • ~~11.2道具功能逻辑~~
    • 11.3待解决问题
    • 11.4代码仓库
  • 12.吐槽

0.初衷

  自从若干年前研究了古老的Java Swing,就决定要用Swing做点有意思的东西出来,一方面自娱自乐,另一方面也锻炼锻炼编码技术。

  这个坦克大战游戏的立项看了一下记录是2021.12.25,应该是圣诞节那天确定的,然而比较尴尬的是时间过去了一年半多了,当时吹下的牛(立下的flag),至今还没有实现,作为一名码农(程序员or爱码士),实在惭愧,是时候兑现了,2023年8月份我就把当时实现的项目重新熟悉了起来,可怜巴巴的几个类,只实现了游戏主体循环,内容还要一点点的来。

  这个项目的框架依然和之前开发打砖块游戏Java Swing制作古老的打砖块游戏所用框架一模一样,没有区别,是在JFrame基础上实现双缓冲绘制和交互,其实这样比较麻烦,不如直接使用JPanel类,系统已经实现了双缓冲,不用自己再实现一遍了。自己当时还自己琢磨了一个非常简单的爆炸效果,[破涕为笑]。

  争取尽快实现并发布到某hub上吧。至于游戏原理大致是怎么回事儿,打砖块那篇文章有说,下面就直接进入正题了

1.创建游戏窗口

创建一个JFrame即可,先上个效果图吧。
在这里插入图片描述

2.创建坦克

玩家坦克和敌军坦克,一开始代码手绘了坦克,矩形+圆形+矩形,非常简陋,先表示这么个意思,后续再优化,看能不能找人做个坦克图片啥的。顺便实现了圆形炮弹发射。

后来从游戏视频中截图,然后使用gimp软件抠图,实现了敌军坦克的美化,顺带练习了抠图。

3.实现坦克移动和发射炮弹

  1. 玩家坦克,按方向键进行控制,实现坦克4个方向的移动,按ctrl键发射炮弹。

  2. 敌军坦克,在游戏循环中自主移动、发射炮弹,遇到障碍物或墙拐弯。

4.创建地图

地图是用瓦片拼接实现的,瓦片是最小,不可分割的地图单位,共5种,砖块、草地、铁块、雪地、河流。目前缺少雪地,取色并绘制矩形实现,草地略复杂。
在这里插入图片描述

  • 在坦克大战的游戏地图上,宽有19个方块,高有15个方块,后来证明这个数量有问题。
  • 地图创建成功了,看来大家是一样的使用二维int数组,整个窗口是一个由若干行和列tile瓦片大小网格组成的规整的背景,每个网格可以存放不同数字来表示不同的瓦片,如砖块、草地、铁块、雪地、河流。

4.1关于地图瓦片的尺寸遇到的问题

  (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。

5.坦克与障碍物的碰撞处理

5.1碰撞检测

  • 在坦克与瓦片的碰撞判断上面遇到了很大的困难,自己思考一直解决不掉,使用矩形碰撞检测算法倒是可以检测出来然而砖块多了计算量很大、后来想了想可以将坦克行进方向一行或一列进行检测减少计算量,跨越砖块行进还得多一行或列,可是还是没能解决复杂的逻辑。
  • 后来查阅资料明白可以使用网格里面是否有瓦片阻挡,没有的话可以直接通过,否则就是无法通过除非用炮弹打碎才能通过。后来了解到有射线检测法解决这个问题。
  • 经过1天的尝试发现确实可以实现坦克和瓦片的碰撞检测逻辑,然而又出现了新的问题,在坦克跨网格进行移动的时候会出现bug,坦克会跑到瓦片tile上面去,很不合理。
  • 跨网格和不跨网格的逻辑都加上,坦克在地图上与障碍物位置关系就没有问题了,主要是考虑坦克所跨的网格下一批网格是否有障碍物,只要有一个存在障碍物,坦克就不能前进,这样才是合理的,这样就解决了上一条bug。不过又出现了新的问题,就是坦克在只有一个仅仅容纳自己通过的路口,很难对准入口,这个需要处理一下。
  • 这里瓦片尺寸的坑一直存在,直到后面不得不解决。

5.2坦克与地图中的瓦片碰撞

  • 坦克一边前进,一边检测前方的障碍物,如砖块、钢铁、河流,如果有,坦克不能继续前进。

5.3坦克相互碰撞

敌军坦克之间,相互碰撞和拐弯掉头已经实现

5.4坦克碰见炮弹

坦克被消灭,敌军坦克有一些需要多枚炮弹才能消灭。

5.5坦克拐弯

  • 问题:坦克在只能容纳一个坦克通过的路口,很难对准。
  • 尺寸变小以后,在坦克移动的过程中,判断坦克的左右转弯,改进思路,当坦克位于一个网格内,左右转向要快速直接转过去。
  • 当按下方向键,如果按键时间非常短,小于某个阈值,坦克移动速度修改,这样更方便的对准单个通道。
    坦克在通过一个刚好容纳一个坦克的身位的时候,如下图,坦克向上行走,需要左右转向,坦克必须可丁可卯的对准这个有空的通道,否则只差一个px,由于碰撞检测,坦克都无法通过。
    在这里插入图片描述
    思考良久,最终决定在坦克停止移动后,将坦克强制对齐到下一个网格线,这样就解决了难对准的问题。

一直找不到好的解决办法。已经解决,在坦克停止移动后,将坦克强制对齐到下一个网格线。

  • 终极解决方法:在拐弯的时候,对坦克坐标进行合理的调整,校准,坦克中心点,始终要对准一条网格线前进。

6.道具

道具功能,由于时间的仓促和功能的取舍,目测要放到二期工程了。

6.1星星

道具对坦克外观的影响,道具对炮弹火力的影响

6.2炸弹

6.3钟表

6.4城堡

6.5坦克

6.6无敌圈

7.炮弹命中目标的处理

初级坦克发射一发炮弹,只能消除1/4的方块层级,每个砖头方块有4层,当炮弹升级到某个级别一发可以消除2层,铁块的话,一共2层,一发消除1层。

  1. 炮弹消除砖块;已经实现。地图被击中的处理,这个处理感觉略显复杂,尤其砖头方块,被击中后,需要考虑强弱火力,击中后还剩多少,处理起来略复杂一些。

  2. 炮弹消除铁块,铁块消除,玩家已经吃了3个星星,这时候火力很猛,可以消除铁块了;
    另外当玩家吃了2个星星或2个以上,这时候炮弹可以消除2层砖块。目前缺少星星道具,目测二期实现。

  3. 炮弹击中坦克:消灭坦克。已经实现。

  4. 炮弹击中炮弹,相互抵消已经实现。(玩家和敌军的炮弹,敌军炮弹相互是不抵消的)

  5. 炮弹击中基地,或玩家生命为0,game over

  6. 目前觉得在方块tile被击中后应该记录状态,根据状态进行重绘,状态改变和绘制的过程可能有些复杂。后来发现不用记录也行,直接在图形上表现出来即可,不过还是记录状态更好,通过状态值可以了解瓦片的形状。

8.连续发射炮弹

有一个问题,音效播放数量错误,每一个音效播放不完整,只有最后面的音效完整。Mac上面音效却是完整的。在间隔时间很短,连续消灭2辆敌军坦克的时候,敌军坦克爆炸音效第二声没播放出来,这是一个问题。

9.游戏结束game over逻辑处理

基地老家被消灭或玩家坦克全被消灭,游戏结束。

10.炮弹突破游戏窗口

后续再说吧

11.思路理顺

11.1碰撞检测:

  1. 坦克移动中,撞墙,坦克互相碰撞、坦克碰到地图块(砖头、钢铁、河流)、碰到道具、被炮弹击中
  2. 炮弹击中坦克、地图块(砖头、钢铁)、大本营、玩家炮弹和敌军炮弹

11.2道具功能逻辑

二期工程再说,暂时不做。

  1. 星星增强火力,改变玩家坦克外观
  2. 城堡保护基地,砖块变为一圈钢铁,有时间长度限制
  3. 无敌圈可以无视发来的炮弹,有时间长度限制
  4. 坦克可以增加一条命
  5. 炸弹可以消灭地图中已出现的所有坦克
  6. 钟表可以一定时间长度内使敌军坦克静止

11.3待解决问题

  1. 当瓦片被消除一半的时候,坦克无法开过去,只能全部瓦片50*50被消除后坦克才能走过去。
  2. 转弯不好对齐的问题。
  3. 坦克每次移动瓦片1/4距离,这样方便坦克炮弹沿着分割线前进,可以保证消除和坦克同样宽度的瓦片
    随着后来瓦片尺寸的调整,拐弯的校准,这3个问题都解决了。

11.4代码仓库

代码都在这里了,大家根据需要自取吧。
https://github.com/ximen502/WarOfTank
https://gitee.com/ximen502/WarOfTank

12.吐槽

  学习了Java Swing知识后,就开发了打砖块游戏,也叫弹球游戏,详情请看Java Swing制作古老的打砖块游戏,自己觉得效果还行[敝帚自珍/doge],不过看过这篇文章的人却不多,不过某一天我在文章底部推荐里面看到一篇文章JAVA 实现《JAVA打砖块》游戏,相似度不高,不过看代码相似度贼高,目测99.9%,人家的阅读人数突破了4万,我的源码被传到下载里面明码标价30¥,暑期还搞了一波促销活动11.9¥,我简直不能相信,[捂脸]。为啥差距有几十倍。也不知道代码是否有人下载,他赚了多少钱……

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/328163.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

操作系统---期末应用综合题

目录 操作系统---期末应用综合题 操作系统---期末应用综合题 1. 若在一分页存储管理系统中,某作业的页表如表1所示。已知页面大小为1024字节,试将逻辑地址1011,5012(十进制数)转化为相应的物理地址。 表1…

【BIAI】lecture 3 - GD BP CNN Hands-on

GD & BP & CNN & Hands-on 专业术语 gradient descent (GD) 梯度下降 back propagation (BP) 向传播 Convolutional Neural Network (CNN) 卷积神经网络 forward propagation 前向传播 biologically symmetry 生物对称性 synaptic 突触 axon 轴突 课程大纲 The go…

RPC学习

RPC 远程过程调用 服务提供者 将服务提供到注册中心&#xff0c;消费者从注册中心获取需要i调用的服务&#xff0c;去进行调用 模块创建 消费者&#xff08;Consumer&#xff09; ** pom ** <?xml version"1.0" encoding"UTF-8"?> <project …

【萤火虫系列教程】2/5-Adobe Firefly 文字​生成​图像

文字​生成​图像 登录账号后&#xff0c;在主页点击文字生成图像的【生成】按钮&#xff0c;进入到文字生成图像 查看图像 在文字生成图像页面&#xff0c;可以看到别人生成的图像。 点击某个图像&#xff0c;就可以进入图像详情&#xff0c;可以看到文字描述。 生成图像 我…

Socket与TCP的关系

前言 相信大家对于TCP已经非常熟悉了&#xff0c;学习过计算机网络的同学对于它的连接和断开流程应该已经烂熟于心了吧。 那么Socket是什么&#xff1f; Socket是应用层与TCP/IP协议簇通信的中间软件抽象层&#xff0c;它是一组接口。在设计模式中&#xff0c;Socket其实就是…

python 写自动点击爬取数据

今天来点不一样的&#xff01;哥们 提示&#xff1a; 这里只是用于自己学习的 &#xff0c;请勿用违法地方 效果图 会进行点击下一页 进行抓取 需要其他操作也可以自己写 文章目录 今天来点不一样的&#xff01;哥们前言一、上代码&#xff1f;总结 前言 爬虫是指通过编程自动…

基于Java实现全功能电子商城

&#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩项目推荐订阅&#x1f447;&#x1f3fb; 不然下次找不到哟 基于SpringBoot的旅游网站 基于SpringBoot的MusiQ音乐网站 感兴趣的可以先收藏起来&#xff0c;还有大家在毕设选题&#xff0c;项目以及…

嵌入式培训机构四个月实训课程笔记(完整版)-Linux系统编程第四天-Linux管道练习题(物联技术666)

更多配套资料CSDN地址:点赞+关注,功德无量。更多配套资料,欢迎私信。 物联技术666_嵌入式C语言开发,嵌入式硬件,嵌入式培训笔记-CSDN博客物联技术666擅长嵌入式C语言开发,嵌入式硬件,嵌入式培训笔记,等方面的知识,物联技术666关注机器学习,arm开发,物联网,嵌入式硬件,单片机…

基础面试题整理2

1.抽象类与接口区别 语法&#xff1a; 抽象类用abstract定义&#xff1b;接口用interface定义抽象类被子类继承extends&#xff08;不可用final修饰&#xff09;&#xff1b;接口被类实现implements抽象类的属性访问无限制,方法不可用private修饰&#xff1b;接口中的方法只能…

性能分析与调优: Linux 使用ELRepo升级CentOS内核

目录 一、实验 1.环境 2.agent 服务器使用ELRepo升级CentOS内核 二、问题 1. RHEL-7, SL-7 或者 CentOS-7系统如何安装ELRepo 2.RHEL-8或者RHEL-9系统如何安装ELRepo 一、实验 1.环境 &#xff08;1&#xff09;主机 表1-1 主机 主机架构组件IP备注prometheus 监测 系…

【uniapp】APP打包上架应用商-注意事项

初雪云-uniapp启动图自定义生成&#xff08;支持一键生成storyboard&#xff09; 一、修改App端上传图片/视频 uni.uploadFile let thatthis; uni.chooseImage({count: 1,sourceType: [camera,album],sizeType: [compressed, original],success: rey > {uni.showLoading({ t…

欢乐钓鱼^^

欢迎来到程序小院 欢乐钓鱼 玩法&#xff1a;点击鼠标左键左右晃动的鱼钩&#xff0c;下方左右移动的鱼对准鱼的方向即可进行钓鱼&#xff0c; 不同的鱼不同的分数&#xff0c;快去钓鱼吧^^开始游戏https://www.ormcc.com/play/gameStart/241 html <div id"gamediv&qu…