本章目的

  • 使用炮筒来确定坦克目前的方向
  • 让坦克发射多发炮弹问题

一、画出炮筒


一般坦克初始位置是不同的,但是我们目前的射击方向是与移动方向一致的

这就导致比较怪异,我们应该是初始时有一个射击方向,比如说:右边

class Tank{//省略其他关键性代码....//默认设计方向为右边private Direction ptdir = Direction.R;
}

而我们的射击方向有了,还需要与移动时方向一致同步并且画出来

这里我们只需要画出一条直线即可,可以使用drawLine方法

我们需要知道两点来确定一条直线,而在坐标中由横(X)、纵坐标(y)确定一个点。

而这drawLine方法的四参数实际就是确定两个点,要画的直线的起始点横纵坐标和终点的横纵坐标

X1,Y1是确定直线的起始点,即横坐标为x1,纵坐标为y1的点。

同理x2,y2确定直线的终点。

例:

A(x1,y1) B(x2,y2) 就可以画出直线AB了。
参数:

x1 - 第一个点的 x 坐标。

y1 - 第一个点的 y 坐标。

x2 - 第二个点的 x 坐标。

y2 - 第二个点的 y 坐标。

而我们的坦克中,想要画出对应方向的直线,则可以使用公式计算相应的坐标

class Tank{//省略其他关键性代码....//添加方法完成坦克的绘画public void draw(Graphics g) {//省略其他关键性代码....switch (ptdir) {case L:g.drawLine(x + Tank.WIDTH/2,y + Tank.HEIGHT/2,x,y + Tank. HEIGHT/2);break;case LU:g.drawLine(x + Tank.WIDTH/2,y + Tank.HEIGHT/2,x,y);break;case U:g.drawLine(x + Tank.WIDTH/2,y + Tank.HEIGHT/2,x + Tank.WIDTH/2,y);break;case RU:g.drawLine(x + Tank.WIDTH/2,y + Tank.HEIGHT/2,x + Tank.WIDTH,y);break;case R:g.drawLine(x + Tank.WIDTH/2,y + Tank.HEIGHT/2,x + Tank.WIDTH,y + Tank. HEIGHT/2);break;case RD:g.drawLine(x + Tank.WIDTH/2,y + Tank.HEIGHT/2,x + Tank.WIDTH,y + Tank. HEIGHT);break;case D:g.drawLine(x + Tank.WIDTH/2,y + Tank.HEIGHT/2,x + Tank.WIDTH/2,y + Tank. HEIGHT);break;case LD:g.drawLine(x + Tank.WIDTH/2,y + Tank.HEIGHT/2,x,y + Tank. HEIGHT);break;}}
}

这时我们运行起来就发现,我们的坦克炮筒已经出来了

但是为什么它没有随着我们的移动方向而改变射击方向呢?

那么因为我们没有根据移动方向来进行调整,我们现在添加调整一下看看

class Tank{//省略其他关键性代码....void move() {//省略其他关键性代码....    if(this.dir !=Direction.STOP){this.ptdir = dir;}}
}

而之前我们根据坦克的方向进行发射炮弹,会有一个问题不知道大家发现没有

比如说当我们不动的时候,是无法发射炮弹出来的

那么现在我们根据射击方向进行发射,就可以解决这个问题

class Tank{//省略其他关键性代码....//坦克发射子弹.....public Missle fire(){//省略其他关键性代码....Missle missle = new Missle(x,y,ptdir);return missle;}
}

这时即使我们不动,也可以发射炮弹了

步骤总结

  • ✧Tank类增加新的属性ptDir
  • ✧每次move后根据Tank新的方向确定炮筒的方向
  • ✧将炮简用直线的形式表现出来

二、让坦克发射多发炮弹


目前我们的坦克按下Ctrl键时,就会发射一发炮弹

但是当我们再按下Ctrl键时,就会发现坦克发出的炮弹又从头开始了

这是因为我们目前只维护了一发炮弹的发射状态

那么怎么解决这个问题呢?

我们想想能不能将发出去的炮弹用一个容器将它装起来呢?

public class TankClient extends Frame {//使用集合容器管理炮弹List<Missle> missles = new ArrayList<Missle>();@Overridepublic void paint(Graphics g) {//画出容器里的子弹for ( int i = 0; i < missles.size();i++){Missle m = missles.get(i);m.draw(g);}//画出坦克mytank.draw(g);}//省略其他关键性代码....
}

同时当我们按下Ctrl键时,我们就将炮弹放入集合容器中

class Tank{//坦克发射子弹.....public Missle fire(){//省略其他关键性代码.......Missle missle =new Missle(x,y,ptdir);tc.missles.add(missle);return missle;}
}

这时我们运行起来就可以发现,我们可以连续打出多发炮弹了

但是有一个小问题:假如一直按住Ctrl键发出的炮弹就会没有间隔

这样的情况我们有两种解决方式:

  • 第一种:每一枚炮弹设置间隔时间
  • 第二种:将发射炮弹改为按下抬起释放Ctrl键发射炮弹

我们采用Ctrl键按下抬起发射炮弹来解决这个问题

class Tank{//省略其他关键性代码....//坦克键盘按下抬起监听器public void keyReleased(KeyEvent e) {int key = e.getKeyCode();switch (key) {case KeyEvent.VK_CONTROL:fire();break;}//省略其他关键性代码.......}
}

步骤总结

  • ✧使用容器装炮弹
  • ✧每当抬起Ctr键就往容器中加入新的炮弹
  • ✧逐一画出每一发炮弹

三、让炮弹消亡


由于我们目前采用集合容器的方式来管理发射的炮弹

若我们对于这个游戏一直玩个几小时,那么就会造成很多很多的炮弹积累在里面

我们现在在游戏的窗口中将我们当前的炮弹数量显示出来

public class TankClient extends Frame {//省略其他关键性代码....@Overridepublic void paint(Graphics g) {//省略其他关键性代码....//展示炮弹容器当前数量g.drawString("missiles count:" + missles.size()+"",10,50);}
}

这下我们当前容器里的子弹数量就能显示出来了

刚刚我们说到若我们对于这个游戏一直玩个几小时,那么就会造成很多很多的炮弹积累在里面

那么我们什么时候就要让子弹消亡呢?

  • 击中敌方坦克时
  • 超出游戏边界时

我们为Missle子弹类添加属性区别存活状态、并且当超出边界时设置为消亡状态

class Missle{//区分子弹的存活private boolean live = true;public boolean isLive() {return live;}void move() {//省略其他关键性代码....//当子弹的x、y坐标小于0 或者大于游戏窗口的宽度与高度则消亡状态if (x < 0 || y < 0 || x > TankClient.WIDTH || y > TankClient.HEIGHT) {live = false;}}//省略其他关键性代码....
}

而在我们的游戏界面中的绘画方法,对于消亡的子弹我们从容器中里去除

class Missle{//引入TankClient管理子弹容器private TankClient tc;public Missle(int x, int y, Tank.Direction dir, TankClient tc) {this.x = x;this.y = y;this.dir = dir;this.tc = tc;}void move() {//省略其他关键性代码....//当子弹的x、y坐标小于0 或者大于游戏窗口的宽度与高度则消亡状态if (x < 0 || y < 0 || x > TankClient.GAME_WINDTH || y > TankClient.GAME_HEIGHT) {this.live = false;tc.missles.remove(this);}//省略其他关键性代码....
}

同时当我们发出炮弹的时候,将tc传给炮弹,让炮弹在消亡的时候自己去除

class Tank{//省略其他关键性代码....//坦克发射子弹.....public Missle fire(){//省略其他关键性代码.......Missle missle =new Missle(x,y,ptdir,tc);tc.missles.add(missle);return missle;}
}

步骤总结

  • ✧加入控制炮弹生死的量Live ( Missle )
  • ✧当炮弹已经死去就不需要对其重画
  • ✧当炮弹飞出边界就死亡
  • ✧当炮弹死亡就从容器中去除

参考资料


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


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

相关文章:

  • seo关键字_SEO最佳关键字研究技术
  • android new file 产生重复文件 ~2,Android Gradle在打包httpmime期间生成重复文件
  • Fortran—格式化输入输出控制
  • Restful 风格的通信接口
  • 安卓手机来电防火墙_手机号变“广告号”?来电显示暗藏黑色利益链!你可能也被卷入其中...
  • 悬镜安全 | 第八期 全球一周安全情报(9.10-9.16)
  • 分众Q卡:免费领取的“维络卡” 基于此对SOLOMO模式的思考;
  • 社群运营:从100个社群中选出有特色的8个分享给你
  • 女学霸考692分想当“程序媛”,女生到底要不要学计算机?
  • 互联网思维不重要,重要的是玩法变了
  • 互联网思维不重要,重要的是玩法变了!
  • 【​观察】六脉神剑第六式-管家式之面面俱到
  • “特别难”的外卖运营,如今有了免费管家
  • 移动互联网,一场思维与市场的变革
  • 《Docker系列》Docker安装Hadoop
  • 《Docker系列》Docker安装Hadoop集群
  • 一个简单的多任务内核实例
  • 一、2440裸机点亮led
  • 归并排序(常数空间复杂度的一个变体)
  • 一站式linux0.11内核head.s代码段图表详解
  • 计算机二级编程题特殊解法,2012年全国计算机二级VF笔试专家密押试卷一
  • 进程管理(一)
  • 内核该怎么学?Linux进程管理工作原理(代码演示)
  • oracle 查找非中文,Oracle中如何判断一个字符串是否含有汉字
  • linux内核进程状态,深入理解 Linux 内核学习笔记(一):进程
  • 逆向基础(一)
  • linux创建pc目录,在linux汇编语言中创建一个目录
  • Linux内核学习笔记——内核页表隔离KPTI机制(源码分析)
  • L1-050 倒数第N个字符串 (15 分)andL1-054 福到了 (15 分)
  • L1-043 阅览室 (20 分)andL1-048 矩阵A乘以B (15 分)

我所知道坦克大战(单机版)之画出炮筒、让坦克发射多发炮弹、让炮弹消亡...相关推荐

  1. java画好看坦克_坦克大战第一节——画出自己的坦克(新手篇)

    刚刚开始学习java,对java不是很熟悉,但是自己的兴趣挺喜欢java.现在自己在自学java做一个小游戏,坦克大战. 自己现在完成了画出自己的坦克和坦克的移动方向.希望各位大神指导一下我这个刚刚学 ...

  2. 坦克大战第一节——画出自己的坦克(新手篇)

    刚刚开始学习Java,对Java不是很熟悉,但是自己的兴趣挺喜欢Java.现在自己在自学Java做一个小游戏,坦克大战. 自己现在完成了画出自己的坦克和坦克的移动方向.希望各位大神指导一下我这个刚刚学 ...

  3. java 坦克大战画坦克_Java坦克大战部分:画出界面,敌人坦克,我的坦克,不出界,键盘事件【诗书画唱】...

    含很多自己写的个理解和注释,想出的解决,建议,提示,注意事项等方法: package tankeGame; import java.awt.Color; import java.awt.Graphic ...

  4. 坦克大战java_清华毕业大佬用一个坦克大战项目讲完了23种设计模式

    先给大家讲述一下坦克大战是怎么进行运行的. 坦克大战第一节: new 出一个窗口: 设定标题栏内容: TankFrame从Frame继承+显示: 认识paint方法,重写: 坦克大战第二节 学习gra ...

  5. 100行JS代码实现❤坦克大战js小游戏源码 HTML5坦克大战游戏代码(HTML+CSS+JavaScript )

    坦克大战js小游戏源码 HTML5坦克大战游戏代码(HTML+CSS+JavaScript ) HTML5坦克大战网页小游戏,完美还原小霸王学习机效果,以坦克战斗及保卫基地为主题,属于策略型类游戏. ...

  6. 微信小游戏制作坦克大战(六)碰撞检测,主角坦克碰到敌方坦克、炮弹爆炸

    微信小游戏制作坦克大战(六)碰撞检测,主角坦克碰到敌方坦克.炮弹爆炸 导入坦克爆炸效果的图片和声音素材 给主角坦克添加事件 给爆炸动画添加事件 当主角坦克碰到敌方坦克或者炮弹时显示爆炸效果 下一篇文章 ...

  7. 微信小游戏制作坦克大战(七)碰撞检测,敌方坦克碰到主角坦克炮弹爆炸

    微信小游戏制作坦克大战(七)碰撞检测,敌方坦克碰到主角坦克炮弹爆炸 导入发生炮弹的音效素材 主角坦克发射炮弹或者敌方坦克发射炮弹时播放音效 修改敌方坦克积木 4.效果: 敌方坦克碰到主角坦克炮弹爆炸 ...

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

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

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

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

最新文章

  1. 【C++】多线程与异步编程【四】
  2. mysql 判断日期是否在某范围内_判断时间是否在某个区间内
  3. SpringBoot面试题(持续整理中……)
  4. Eclipse UML插件AmaterasUML的配置及使用
  5. Maven与IDEA结合
  6. PostgreSQL学习笔记4之常用数据类型
  7. C++ Qt全局异常处理器_异常处理
  8. Delphi中使用全局钩子
  9. 联合国为何 Pick 腾讯?
  10. 供应商与客户 连接平台 的谋合
  11. terminated 线程_一个 Java 线程生命周期,我竟然可以扯半小时
  12. 基本图像分类与目标检测网络要点总结
  13. Qt 之 QQ系统表情(一)
  14. html标题居中加背景色,如何设置CSS背景宽度后让文字居中?
  15. In-Place Scene Labelling and Understanding with Implicit Scene Representation
  16. 我过去的那些编程思想
  17. python关联分析库_使用Python进行数据关联分析
  18. IBM服务器代理商创业之路①
  19. Vert.x(vertx) Web开发-路由
  20. Ansible 下载模块get_url、解压缩模块unarchive(学习笔记十五)

热门文章

  1. 电视台,做直播别掉进这些坑,踩了这些雷
  2. vue 表单对象里还有对象,多层嵌套校验,制定校验规则
  3. 计算机课程设计答辩评语,【课程设计教师评语】_课程设计指导教师评语模板...
  4. Cause com.mysql.jdbc.exceptions.jdbc4.CommunicationsException:Communications link failure 问题解决 报错
  5. 2020大学生网络安全知识总决赛 NISP一级模拟题(07)
  6. 短链是什么原理?怎么实现呢?
  7. win7系统防火墙设置(转)
  8. 诗经与当代流行歌曲相通之处—重章叠句
  9. 最小环的几种解法(并查集、删边)
  10. C语言-两个单链表的合并