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.mzph.cn/news/602958.shtml

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

相关文章

《3D数学基础-图形和游戏开发》阅读笔记 | 3D数学基础 (学习中 1.6更新)

文章目录 3D数学基础矢量/向量什么是向量点与矢量的关系 向量基础运算 向量加法向量基础运算 数乘 线性组合 - 坐标系的基如果选择不同的基向量会怎么样?- 张成(Span)的空间三维向量的张成空间线性相关与线性相关 矩阵与线性变换矩阵-几何意义线性变换矩阵乘法与线性…

业务数据技术中台概念与相互关系

随着企业数字化转型和发展模式的转变,企业的应用架构建设模式主要为数据+中台(平台)+应用,这里的企业就涵盖互联网大企业和传统企业,大家都在开展必做的事情,即数字化时代的企业数字化转型 。同时,正好最近在做顶层设计和数字化转型整体应用架构设计,就梳理了一下中台发展…

Kafka消息存储

一、层次结构 具体到某个broker上则是, 数据目录/分区名/日志相关文件集合。其中日志文件集合内包括.log文件, index索引文件和.timeindex时间戳索引文件。 二、.log 结构 .log中记录具体的消息。一般消息由header和body组成, 这点儿在Kafka消息中也同样适用。 message MES…

qt自定义控件的封装

刚学了一个很有意思的东西,前面学了list,Tree,Table三大控件和一部分常用基础控件,但感觉没啥意思,就是用别人的直接用,刚学了一个自定义控件的封装,流程如下: 想把两个不相关的组件封装在一块,直接用ui不行,所以先新添加了qt设计师页面,新添加了一个SmallWidget *ui 在smal…

Mongodb使用指定索引删除数据

回顾Mongodb删除语法 db.collection.deleteMany(<filter>,{writeConcern: <document>,collation: <document>,hint: <document|string>} ) 删除语法中&#xff0c;除了指定过滤器外&#xff0c;还可以指定写入策略&#xff0c;字符序和使用的索引。 …

【Leetcode】230. 二叉搜索树中第K小的元素

一、题目 1、题目描述 给定一个二叉搜索树的根节点 root ,和一个整数 k ,请你设计一个算法查找其中第 k 个最小元素(从 1 开始计数)。 示例1: 输入:root = [3,1,4,null,2], k = 1 输出:1示例2: 输入:root = [5,3,6,2,4,null,null,1], k = 3 输出:3提示: 树中…

字节跳动基础架构SRE-Copilot获得2023 CCF国际AIOps挑战赛冠军

近日&#xff0c;2023 CCF国际AIOps挑战赛决赛暨“大模型时代的AIOps”研讨会在北京成功举办&#xff0c;活动吸引了来自互联网、运营商、科研院所、高校、软硬件厂商等领域多名专家学者参与&#xff0c;为智能运维的前沿学术研究、落地生产实践打开了新思路。决赛中&#xff0…

看图识熊(二)

使用Tools for AI封装onnx模型并推理 进行这一步之前&#xff0c;请确保已正确安装配置了Visual Studio 2017 和 Microsoft Visual Studio Tools for AI环境。 项目的代码也可以在这里找到&#xff0c;下面的步骤是带着大家从头到尾做一遍。 界面设计 创建Windows窗体应用(…

双向数据绑定详细解析(超详细)

文章目录 一、什么是双向绑定二、双向绑定的原理是什么理解ViewModel 三、实现双向绑定实现编译Compile依赖收集 参考文献 一、什么是双向绑定 我们先从单向绑定切入单向绑定非常简单&#xff0c;就是把Model绑定到View&#xff0c;当我们用JavaScript代码更新Model时&#xf…

QML —— 使用Qt虚拟键盘示例(附完整源码)

示例效果 使用"虚拟键盘"注意 &#xff08;例子的Qt版本:5.12.4&#xff09; 注意一&#xff1a;      /* 必须在main.cpp开始处加入如下代码&#xff0c;否则无法使用"虚拟键盘" */      qputenv(“QT_IM_MODULE”,QByteArray(“qtvirtualkeybo…

苹果MacOS12系统 Monterey最新正式版下载 MacOS12系统镜像包

macOS 12 Monterey是苹果公司最新发布的操作系统&#xff0c;为Mac用户带来了更强大、更智能的功能和体验。 这个版本引入了许多令人兴奋的新特性&#xff0c;其中包括革命性的Universal Control功能&#xff0c;让你可以无缝地在Mac和iPad之间进行操作。只需将iPad放在Mac附近…

OpenCV的安装和vscode的配置

在图像处理领域&#xff0c;OpenCV的使用是必不可少的&#xff0c;这里介绍一下OpenCV的安装及其在vscode中的配置 1.OpenCV的安装 &#xff08;1&#xff09;安装依赖 sudo apt-get install build-essentialsudo apt-get install cmake git libgtk2.0-dev pkg-config libavc…

GEE——土地利用分类种两个矢量集合中不同列进行相减的方式(利用join进行连接处理)

问题: 我有两个具有相同 ID 的特征集,我想从第二个特征集中减去第一个特征集的表格单元格。 我使用了这个函数,但它计算的是表 1 中第一个元素与表 2 中其他元素的减法。 我想逐个单元格计算减法。第一个表格中 id 为 1 的单元格减去第二个表格中 id 为 1 的单元格,2x2、…

主线程退出后子线程是否还会正常运行?

问题&#xff1a; 父子线程的关系 今天突然有感而发&#xff0c; 想要来探讨一下主线程和子线程之间的关系。 例一&#xff1a;子线程执行时间较父线程慢 public class ThreadTest {public static void main(String[] args) {// 测试主线程 和 子线程Thread sonThread new …

Python 教程 01:Python 简介及发展历史

ℹ️说明&#xff1a;关于本教程的一些约定 ① 教程后有&#xff08;选读&#xff09;的表示此教程为扩展内容&#xff0c;选读&#xff1b; ② 教程中涉及到的代码片段有时候并非代码块&#xff0c;而是图片&#xff0c;这是防止初学者直接复制代码粘贴的行为&#xff0c;想必…

应用OpenCV绘制箭头

绘制箭头函数 方法&#xff1a;函数cv2.arrowedLine( ) 语法格式&#xff1a;cv2.arrowedLine(img, pt1, pt2, color[, thickness[, line_type[, shift[, tipLength]]]]) 参数说明&#xff1a; img&#xff1a;要画的直线所在的图像&#xff0c;也称为画布。。 pt1&#x…

【CSS】文字描边的三种实现方式

目录 1. 可行的几种方式1.1. text-shadow 描边代码优缺点 1.2. text-stroke 描边实现优缺点 1.3. svg 描边实现优缺点 总结 1. 可行的几种方式 text-shadow–webkit-text-strokesvg 1.1. text-shadow 描边 MDN text-shadow 代码 <div class"text stroke">…

Ubuntu软件和vmware下载

https://cn.ubuntu.com/download/desktop VMware 中国 - 交付面向企业的数字化基础 | CN

HttpRunner自动化测试工具之获取响应数据extract提取值到变量

获取响应数据 extract: 提取 注&#xff1a;extract 应与request保持同一层级 1、响应行&#xff0c;响应头&#xff1b;通过 extract 提取响应的数据并存储到变量中&#xff0c;如下图&#xff1a; 注&#xff1a;变量名的前面要有 - # 获取响应数据: 响应行&#xff08;…

【比赛专题】江苏省信息安全管理与评估 理论题样题题库整理

GZ032 信息安全管理与评估赛题第1套 一、 单选题 &#xff08;每题 2 分&#xff0c;共 35 题&#xff0c;共 70 分&#xff09; 1、《中华人民共和国数据安全法》已由中华人民共和国第十三届全国人民代 表大会常务委员会第二十九次会议通过&#xff0c;现予公布&#xff0c;自…