【JAVA学习笔记】64 - 坦克大战1.4,限制坦克发射子弹,敌方击中我方坦克爆炸

news2024/11/24 0:04:51

项目代码

https://github.com/yinhai1114/Java_Learning_Code/tree/main/IDEA_Chapter18/src/com/yinhai/tankgame1_3

增加功能

1.我方坦克在发射的子弹消亡后,才能发射新的子弹. =>扩展(发多颗子弹怎么办)(其实已经解决了,在62章我们已经实现了多颗子弹,如果想要限制设置列表大小即可)

2.让敌人坦克发射的子弹消亡后,可以再发射子弹.(同理增加列表判断,还有大小我就加进去)

3.当敌人的坦克击中我方坦克时,我方坦克消失,井出现爆炸效果.
 

一、限制发射的子弹

目前,我们的子弹是无限制发射的然后存入bullets列表内 

也就是手够快,线程时间内我们可以发射一排子弹

现在要做的是把他限制在3颗子弹,并且消亡后可以再发射新的子弹,我们可以直接在shot方法内写一个判断的规则

checkBullets方法里面调用了heroBullets的集合,维持了列表不包含空元素和删除已经消亡的bullet,如果说子弹都存活,走到下一个语句块,判断现在的列表大小是否为3或者更大,如果是就return ture 返回bullets已满

    public void shotBullet() {
        if (checkBullets()) {
            return;
        }
    public boolean checkBullets() {
        Bullet bullet;
        for (int i = 0; i < heroBullets.size(); i++) {
            bullet = heroBullets.get(i);
            if (bullet == null) {
                heroBullets.remove(null);
            }
            if (!bullet.isLive()) {
                heroBullets.remove(bullet);
            }
        }
        if (heroBullets.size() >= 3) {
            return true;
        }
        return false;
    }

同理,可以限制敌人的子弹,需要在Enemy的check方法内更改子弹列表的大小即可

public boolean checkBullets() {
        Bullet bullet;
        for (int i = 0; i < enemyBullets.size(); i++) {
            bullet = enemyBullets.get(i);
            if (bullet == null) {
                enemyBullets.remove(null);
            }
            if (!bullet.isLive()) {
                enemyBullets.remove(bullet);
            }
        }
        if (enemyBullets.size() >= 1) {
            return true;
        }
        return false;
    }

二、消亡之后可以再发射子弹

同上,我们已经写了检测方法,那么就在需要的地方调此方法即可,该方法也保证了消亡的时候移除该子弹对象,保证列表的空余

三、敌方击中我方坦克时产生爆炸效果

因为我们已经添加了一个Bomb类,也在Mypanel里写了判断是否击中敌方坦克,稍加更改

该方法调用了hitTank,判断子弹是否接触坦克,hitHero传入了hero参数和enemis参数,取出敌人的子弹对象,然后进行hitTank的判断

public void hitHeroIf(Hero hero,Vector<Enemy> enemies){
        Enemy enemy = null;
        Bullet enemyBullet = null;
        for (int j = 0; j < enemies.size(); j++) {
            enemy = enemies.get(j);
            for (int i = 0; i < enemy.getBullets().size(); i++) {
                enemyBullet = enemy.getBullets().get(i);
                hitTank(enemyBullet,hero);
            }
        }
    }

hitTank修改了63章笔记的击中敌人坦克爆炸,只要子弹碰到坦克,我就把调用setLive置为fasle,,然后在代渲染列表添加一个炸弹,传入的Tank对象让我们可以不写那么多方法(动态绑定)

public void hitTank(Bullet b, Tank tank) {
        switch (tank.getDirect()) {
            case 0:
            case 2:
                if (b.getX() > tank.getX() && b.getX() < tank.getX() + 40
                        && b.getY() > tank.getY() && b.getY() < tank.getY() + 60) {
                    b.setLive(false);
                    tank.setLive(false);
                    bombs.add(new Bomb(tank.getX(), tank.getY()));
                }
                break;
            case 1:
            case 3:
                if (b.getX() > tank.getX() && b.getX() < tank.getX() + 60
                        && b.getY() > tank.getY() && b.getY() < tank.getY() + 40) {
                    b.setLive(false);
                    tank.setLive(false);
                    bombs.add(new Bomb(tank.getX(), tank.getY()));
                }
                break;
        }
    }

为了方便就没写hero消亡的代码,可以加

1.添加主坦克消失

在击中判断中,如果击中,就将hero指向HERO,虽然本质上还是在,但是感官上已经不存在了,所以就当做不存在吧。

在drawTank中判断,如果是这个HERO就不画了

缺点就是用户还能操作,但无法移动因为speed为0,

如果放到画板内还能看到爆炸效果

                

至此 1.4版本的坦克大战完成了——绘出坦克,监听事件移动坦克,引入列表发射保存多个多线程的子弹对象,敌人发射子弹,敌人随机移动,击中坦克并消失,以及本章的限制发射子弹,击中我方坦克后爆炸的功能

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

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

相关文章

【科普】电脑屏幕刷新率:了解和选择需要的刷新率

在日常使用电脑的过程中&#xff0c;我们经常会听到刷新率这个词&#xff0c;但是你了解它的意义和作用吗&#xff1f;接下来&#xff0c;让我们一起来深入了解一下吧。 01 什么是刷新率 首先&#xff0c;我们要解释一下什么是刷新率。刷新率就是屏幕在一秒内能刷新的次数&…

微信小程序之自定义组件开发

1、前言 从小程序基础库版本 1.6.3 开始&#xff0c;小程序支持简洁的组件化编程。所有自定义组件相关特性都需要基础库版本 1.6.3 或更高。开发者可以将页面内的功能模块抽象成自定义组件&#xff0c;以便在不同的页面中重复使用&#xff1b;也可以将复杂的页面拆分成多个低耦…

践行“人人可用”:更轻量、更好用、更优雅、更全面,DataEase开源数据可视化分析平台发布v2.0版本

2023年11月6日&#xff0c;DataEase开源数据可视化分析平台正式发布v2.0版本。DataEase开源项目创立于2021年1月&#xff0c;于2021年6月发布v1.0版本。相比v1.x版本&#xff0c;DataEase v2.0版本采用了更加轻量级的架构设计&#xff0c;功能模块在保留原有“仪表板”模块的基…

领域认知智能走向落地,B端企业还缺些啥?

大模型如何为我所用&#xff1f; 这是当下B端众多企业都在深入思考的一个问题。今年以来&#xff0c;大模型在办公、对话、搜索等领域所展现出的强大能力&#xff0c;让越来越多B端企业意识到大模型对于业务的巨大价值。 因此&#xff0c;领域认知智能迅速成为B端企业关注的焦…

rhcsa-压缩和解压缩

.zip: zip 程序压缩打包的档案;(很常见&#xff0c;但是因为不包含文档名编码信息&#xff0c;跨平台可能会乱码).rar: rar 程序压缩打包的档案:(在windows上很常见&#xff0c;但是是商业软件。gz: gzip 程序压缩的档案;(linux目前使用最广泛的压缩格式).bz2: bzip2 程序压…

Linux之Nignx及负载均衡动静分离

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是君易--鑨&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的博客专栏《LInux实战开发》。&#x1f3af;&#x1f3af; …

这可能是全网最晚的低代码技术总结

低代码的发展一向结伴着质疑前行&#xff0c;一些人认为低代码平台限制了开发人员的创新能力&#xff0c;使得开发过程变得过于简单&#xff0c;缺乏深度的定制和灵活性。他们担心&#xff0c;低代码平台可能只适合于简单的应用程序&#xff0c;无法满足复杂业务需求。另一面&a…

Android codec2 视频框架 之应用

文章目录 应用流程外部主动获取输入和输出buffer外部设置回调 内部流程 应用流程 外部主动获取输入和输出buffer 解码的调用流程&#xff0c;以android原生的一个bin来说明 android 原生代码位置&#xff1a; frameworks/av/cmds/stagefright/codec.cpp frameworks/av/cmds/st…

在Windows 10中共享打印机,以便其他用户可以访问,发挥打印机的最大作用

知道如何在Windows 10中共享打印机是非常宝贵的。如果没有打印机共享&#xff0c;多个用户从单个设备进行所有打印的唯一方法就是手动连接自己的计算机。在本指南中&#xff0c;我们将向你展示一种更简单的方法。 通过网络共享打印机&#xff0c;只需连接一台PC或笔记本电脑。…

svn使用图形化界面从trunk目录下创建下的分支

1、svn目录 要从trunk目录右键创建一个新的目录出来。Branch/tag下创建&#xff1a; 然后源目录和提交目录的编写&#xff1a; 这样新的分支目录chuanqi_4就创建好了。要注意:这样创建要确保目标目录在svn目录下不存在。

ROS中MPC局部路径规划器使用方法及源码流程解读

本文主要介绍ROS中Navigation导航框架中MPC局部路径规划器mpc_local_planner的使用方法&#xff0c;并对源码进行解读&#xff0c;梳理其规划流程等&#xff0c;具体包含MPC模型预测控制算法简介、mpc_local_planner使用方法、mpc_local_planner源码解读与规划流程梳理三部分内…

微信小游戏软件开发手机微信休闲游戏

当今&#xff0c;微信已经成为了中国最受欢迎的社交媒体平台之一&#xff0c;拥有数亿活跃用户。随着微信的不断发展&#xff0c;微信小游戏成为了一个热门的应用领域&#xff0c;吸引了许多开发者和玩家。微信小游戏是一种小型游戏&#xff0c;可以直接在微信内嵌入和玩&#…

【JavaEE初阶】 TCP服务器与客户端的搭建

文章目录 &#x1f332;前言&#x1f334;ServerSocket API&#x1f384;Socket API&#x1f340;TCP中的长短连接&#x1f38d;建立TCP回显客户端与服务器&#x1f6a9;TCP搭建服务器&#x1f6a9;TCP搭建客户端&#x1f6a9;通信过程展示&#xff1a; &#x1f333;多个客户端…

offsetof宏的使用、模拟实现及 (size_t)(((struct_type*)0)->mem_name)的解释

宏原型&#xff1a;offsetof(type,member) 作用&#xff1a;返回数据结构或联合体类型中成员的偏移量&#xff0c;以字节为单位 返回值&#xff1a;size_t类型的无符号整数 使用案例&#xff1a; #include <stdio.h> #include <stddef.h> struct foo {ch…

爬取东方财富股票信息

爬取股票信息 爬虫爬取信息&#xff0c;一般有两种大的思路&#xff0c;分别是&#xff1a; 模拟header信息&#xff0c;发送请求&#xff0c;得到相应的数据&#xff08;html文件 或者 json数据&#xff09;使用selenium模拟打开浏览器&#xff0c;然后利用selenium提供的函…

高防CDN:企业网络安全的坚强后盾

随着互联网的快速发展&#xff0c;企业的网络面临着越来越多的安全威胁。在这种背景下&#xff0c;高防CDN&#xff08;Content Delivery Network&#xff09;已经成为了企业网络安全的坚强后盾。本文将理性分析高防CDN对于企业发展的影响&#xff0c;强调其在维护网络稳定性、…

内核态内存映射

内核态的内存映射机制&#xff0c;主要包含以下几个部分&#xff1a; 内核态内存映射函数 vmalloc、kmap_atomic 是如何工作的&#xff1b;内核态页表是放在哪里的&#xff0c;如何工作的&#xff1f;swapper_pg_dir 是怎么回事&#xff1b;出现了内核态缺页异常应该怎么办&am…

MySQL(10):创建和管理表

基础知识 在 MySQL 中&#xff0c;一个完整的数据存储过程总共有 4 步&#xff0c;分别是&#xff1a;创建数据库、确认字段、创建数据表、插入数据。 要先创建一个数据库&#xff0c;而不是直接创建数据表&#xff1a;从系统架构的层次上看&#xff0c;MySQL 数据库系统从大到…

Android 10.0 SystemUI启动流程

1、手机开机后&#xff0c;Android系统首先会创建一个Zygote&#xff08;核心进程&#xff09;。 2、由Zygote启动SystemServer。 3、SystemServer会启动系统运行所需的众多核心服务和普通服务、以及一些应用及数据。例如&#xff1a;SystemUI 启动就是从 SystemServer 里启动的…

浅谈前端自定义VectorGrid矢量瓦片样式

目录 前言 一、VectorGrid相关API介绍 1、VectorGrid 2、 LayerStyles样式详解 二、样式自动配置 1、页面定义 2、地图及PBF瓦片引入 3、矢量瓦片样式定义 4、鼠标事件交互 三、最终效果 1、自定义样式展示 2、鼠标交互 总结 前言 在上一篇博客中&#xff0c;详细讲…