本章目的

  • 解决坦克出界问题
  • 让坦克发射多发炮弹问题

一、解决坦克出界问题


我们发现现在当前版本,如果控制这个坦克一直往左或者往右的话是会移出边界的

那么怎么解决这个问题呢?其实与子弹有异曲同工之处

public class Tank {void move() {//省略其他关键性代码.......if (x < 0){ x = 0;}//若坦克x小于0则等于0//小于30 是因为要考虑标题的宽度if (y < 30){ y = 30;}//若坦克y小于30则等于30//当坦克的x坐标加上坦克的宽度大于游戏窗口的宽度if (x + Tank.WIDTH > TankClient.GAME_WINDTH ) {x = TankClient.GAME_WINDTH - Tank.WIDTH;}//当坦克的y坐标加上坦克的高度大于游戏窗口的高度if (y + Tank.HEIGHT > TankClient.GAME_HEIGHT ) {y = TankClient.GAME_HEIGHT - Tank.HEIGHT;}}//省略其他关键性代码.......
}

这时我们的坦克则无法再跑到外面了

但是我们发现当前这个版本只有我们一个坦克,那么我们能不能加点坦克进来玩呢?

二、添加机器坦克


一般我们玩坦克大战都会有一个阵营的标识符区分是好是坏的坦克

public class Tank {//区分阵营好坏private boolean camp = false;public Tank(int x, int y, TankClient tc, boolean camp) {this.x = x;this.y = y;this.tc = tc;this.camp = camp;}//省略其他关键性代码.......
}

这时我们修改一下方法,并且创建多一个坦克

public class TankClient extends Frame {//阵营:好的坦克Tank mytank = new Tank(50,50,this,true);//阵营:坏的坦克Tank enemytank = new Tank(100,100,this,false);//省略其他关键性代码.......@Overridepublic void paint(Graphics g) {//省略其他关键性代码.......//画出 好的 坦克mytank.draw(g);//画出 坏的 坦克enemytank.draw(g);}
}

这时机器坦克就出来了,如果你觉得不好区分颜色,可以在绘制方法里区分

public class Tank {//添加方法完成坦克的绘画public void draw(Graphics g) {//省略其他关键性代码.......if(camp){//将阵营好的坦克颜色为红色g.setColor(Color.red);}else{//将阵营坏的坦克颜色为蓝色g.setColor(Color.blue);}}//省略其他关键性代码.......
}

步骤总结

  • ✧加入区别敌我的变量camp
  • ✧根据敌我的不同设置不同的颜色
  • ✧更新Tank的构造函数,加入camp
  • ✧TankClient中new 出敌人的坦克并画出

这时我们就有一个新的想法出来了:怎么将这个坦克给干掉呢?

三、击毙机器坦克


在我们发射炮弹的时候,那么如何检测到是否击中坦克呢?我们称为碰撞检测

游戏中的碰撞检测方式有很多,不同的算法之间主要是在精度和速度之间权衡

我们这里介绍一个类:Rectangle,它指的是坐标空间中的一块区域,通过坐标空间中Rectangle对象左上方的点 (x,y)、宽度和高度可以定义这个区域

下面是其比较常用的几个方法://-->判定点(x,y)是否包含在指定区域内
boolean contains(int x,int y)//-->判定指定区域是否在其指定区域内
boolean contains(int x,int y,int width,int height)

而我们只需要判断子弹与坦克之间是否碰撞到一块来确定是否击中

public class Tank {//创建子弹的坐标空间区域public Rectangle getRect(){return new Rectangle(x,y,WIDTH,HEIGHT);}//省略其他关键性代码.......
}
class Missle{//创建子弹的坐标空间区域public Rectangle getRect(){return new Rectangle(x,y,WIDTH,HEIGHT);}public boolean hitTank(Tank t){if(this.getRect().intersects(t.getRect())){return true;}return false;}//省略其他关键性代码.......
}

那么我们怎么让这个坦克消失呢?回想一下我们子弹是怎么消失的?

是不是有一个变量控制着存活状态呀?所以我们坦克也添加一个变量控制

public class Tank {//用于判断控制坦克存活变量private boolean live = true;public boolean isLive() {return live;}public void setLive(boolean live) {this.live = live;}//添加方法完成坦克的绘画public void draw(Graphics g) {//死掉的坦克不用绘制if(!live){return;}//省略其他关键性代码.......}//省略其他关键性代码.......
}

同时当我们的子弹与坦克进行碰撞时,则将它修改为false状态即可

class Missle{public boolean hitTank(Tank t){if(this.getRect().intersects(t.getRect())){t.setLive(false);return true;}return false;}//省略其他关键性代码.......
}

当我们运行起来的时候,还需要调用该方法完成碰撞检测

public class TankClient extends Frame {//省略其他关键性代码.......@Overridepublic void paint(Graphics g) {//画出容器里的子弹for ( int i = 0; i < missles.size();i++){Missle m = missles.get(i);//将阵营坏的坦克放进来进行碰撞m.hitTank(enemytank);m.draw(g);}//省略其他关键性代码.......}
}

我们发现子弹与坦克发生碰撞后,坦克是消失了但是打中坦克的子弹没有消失

这是因为我们没有对这颗子弹也进行消亡,移出

class Missle{public boolean hitTank(Tank t){if(this.getRect().intersects(t.getRect())){t.setLive(false);this.live = false;return true;}return false;}//添加方法完成子弹的绘画public void draw(Graphics g) {if(!live){//若消亡则进行移出tc.missles.remove(this);}//省略其他关键性代码.......}//省略其他关键性代码.......
}

但是为什么这时我们打一堆子弹出去,也会一并消亡呢?为什么?

因为我们在判断碰撞的时候,并没有将坦克的存活状态考虑进去

class Missle{public boolean hitTank(Tank t){if(this.getRect().intersects(t.getRect()) && t.isLive()){t.setLive(false);this.live = false;return true;}return false;}//省略其他关键性代码.......
}

这时我们打中坦克则完成了子弹移出、消亡效果

步骤总结

  • ✧Missle中 加入hitTank(Tank)方法,返回布尔类型
  • ✧碰撞检测的辅助类Rectangle
  • ✧为Tank 和Missle都加入getRect方法
  • ✧当击中敌人坦克时,坦克被打死,子弹也死去
  • ✧增加控制Tank生死的量live
  • ✧如果坦克死去就不画了

我们这里的碰撞检测采用的是最简单的方式,将子弹与坦克用Rectangle类生成的方框包装起来

判断这两个方框是否相交来判断证明是否击中,击中后进行相关处理

参考资料


尚学堂:坦克大战(马士兵老师)


http://www.taodudu.cc/news/show-5181448.html

相关文章:

  • 我所知道坦克大战(单机版)之 建造目录
  • Java版坦克大战游戏的分析与实现
  • EPLAN导入自带符号库
  • 在matlab中何为符号变量,在MATLAB中,把x、y定义成符号变量正确的的指令是( )...
  • 液压系统 外文翻译
  • java身份证号码校验工具类
  • Java校验身份证号工具类
  • Java验证身份证号是否合法
  • VBA 校验身份证号
  • 身份证号的尾数校验
  • js案例(身份证算法的实现)
  • rstudio中ECM 误差校正模型代码
  • 生成对话的主题与个性化——【AAAI 2018】《Emotional Chatting Machine》
  • 如何让聊天机器人懂情感?这是一篇来自清华的论文
  • Ubuntu 桥接模式连不上网的解决办法
  • 新安装的ubuntu20连不了网怎么办
  • Ubuntu20.04连不上网
  • 解决Ubuntu虚拟机NAT不能上网的几种方法
  • 树莓派3B(ubuntu mate)连不上网wifi解决
  • Ubuntu和Windows10双系统下Ubuntu连不上网的解决
  • VMware ubuntu连不上网/网络不可达解决方法
  • Ubuntu连不上网问题
  • Ubuntu虚拟机使用NAT连接 然后无法上网的情况
  • ubuntu连接不上网络问题解决
  • Ubuntu 20.04 没有DSL连接
  • VMware 12虚拟机下Ubuntu 16.04连不上网解决方法
  • 虚拟机中Ubuntu连不上网问题已解决
  • Ubuntu 17.04 连不上网
  • VM下的ubuntu连不上网的解决办法
  • VMware虚拟机下Ubuntu连不上网解决

我所知道坦克大战(单机版)之解决坦克出界问题、添加机器坦克、将机器坦克击毙...相关推荐

  1. 初学java 第一个java程序 坦克大战单机版

    网上坦克大战的游戏并不少,包括单机版,网络版.然而,作为一名程序员,学一门语言的最好方式莫过于写程序.在写的过程中,你会遇到很多的问题,这个时候你再去找原因,查帮助文档,谷歌百度等等,你的能力才会进步 ...

  2. java坦克大战爆炸效果_Java极致毁童年系列、你们火星的坦克大战这样的吧

    原标题:Java极致毁童年系列.你们火星的坦克大战这样的吧 这是使用java开发的一个单机版的小游戏 (未使用任何游戏引擎) 和经典版的坦克大战有些不同, 这里是纯坦克之间的战争, 英雄坦克并不用保护 ...

  3. Java 坦克大战单机版 源代码

    尚学堂版本的修改版 玩法: 方向键:控制走动 Ctrl:控制发弹 A:超级子弹 X:八方向发弹 =:添加敌方坦克 F2:重新开始 其他功能: 在头上实时显示血条 吃到血块时能补血 自动积分 敌方坦克过 ...

  4. JAVA项目学习之坦克大战单机版

    本科阶段尽管学过JAVA课程,却始终感觉在云里雾里.这段时间认真学习了马士兵老师JAVA基础教程,跟着写了TankWar的小项目,感觉对JAVA中类的使用有了许多新的认识,思路比原来也清晰多了,在此总 ...

  5. Unity学习第一周-物理引擎-项目——坦克大战单机版

    项目需求及策划

  6. 一、坦克大战单机版策划

  7. 我所知道坦克大战(单机版)之使用键盘控制改变坦克位置

    我们发现前两篇文章所造成的坦克,他只能固定一个方向进行移动 那么对于我们来说,一般要么使用鼠标,要么使用键盘控制 那么我们怎么实现这样的方式呢? 实现键盘监听 在java 中我们使用键盘监听的话有两种 ...

  8. 我所知道坦克大战(单机版)之 建造目录

    前言 小时候玩的坦克大战现在也可以制作一个出来,虽然是很简单的单机版 但是这种成就感也是很满足,毕竟以前是没有头绪的,感谢马士兵老师 接下来我对坦克大战的一些项目知识点进行不同的目录,方便针对学习 项 ...

  9. stg游戏c语言,坦克大战改版

    <坦克大战改>是一款国内玩家模仿FC经典游戏坦克大战所自制的小游戏,游戏中玩家将会控制坦克保卫基地,一旦基地失守关卡就会失败.游戏支持手柄震动 ,同时包含有关卡编辑器,让玩家能够自由编辑关 ...

  10. 坦克大战2.0,3.0,4.0版本

    1.坦克大战 0.3 在坦克大战游戏(0.2版)基础上添加如下功能:当玩家按一下j键,就发射一颗子弹. 编写Shot类 package com.yt.tankgame03;/*** 射击子弹*/ pu ...

最新文章

  1. ajax中的url如何传递变量_如何创建和参数化UDT数据类型中的变量及IN,OUT 等参数?...
  2. Attempted to access a cursor after it has been clo
  3. python和c语言的对比_类C语言与Python负数除法求值间的差异
  4. ajax on ture,细数Ajax请求中的async:false和async:true的差异
  5. 获取当前图层所处的坐标系统(C++)(ArcObject开发)
  6. 在HTML中插入回车换行
  7. mysql密码正确却提示错误,不使用密码反而能登录
  8. python学习笔记(11)--测验3: Python基础语法(下) (第7周)
  9. ExtJS学习之路第三步:理解引擎之下,ExtJS4中的类
  10. delphi制作上下开幕效果_显示产业国际盛会开幕,广州新型显示产值将突破2500亿...
  11. 职场三剑客,助你从容闯职场
  12. 环洋调研报告-2021年全球MEMS射频开关行业调研及趋势分析报告
  13. 自主安全国产虚拟化平台CNware
  14. 一个UE4崩溃问题以及解决方案
  15. MacW小编分享设计师们常用Sketch插件合集,让你效率翻倍!
  16. 201809CCF真题
  17. 老闪创业那些事儿(4)——A轮融资的选择
  18. 百度联盟百青藤app流量变现
  19. 雷达革命,截止日期以及到达第四维度
  20. ramdisk.img

热门文章

  1. 首席新媒体运营黎想教程:用户运营之用户行为分析
  2. 【vue3】vue3+vite动态导入路由出现The above dynamic import cannot be analyzed by Vite
  3. Substance 3D 视频学习笔记
  4. CodeForces - 540C Ice Cave
  5. supermap+openlayers地图打印
  6. Google Doodle 2015圣诞版背后的故事与十年圣诞回顾
  7. sqli-labs-基于报错的注入
  8. 关于state刷新界面的思考
  9. Default interface methods are only supported starting with Android N (--min-api 24): com.XXXX
  10. ElasticSearch 8.x 默认密码