
tank大战
坦克大战游戏
没有女朋友的程序员
脑子不好使 记录使用过的东西 以及踩过的坑 归零学习 进军架构师 想要转行的同学可以多多关注
展开
-
边界检测,坦克不能抛出界面范围(18)(写代码如何减少垃圾器的回收)
边界检测,坦克不能抛出界面范围(18)(写代码如何减少垃圾器的回收) 移动的时候不能出边界: boundsCheck(); private void boundsCheck() { if (this.x < 0) {//坦克不能出左边界 this.x = 0; } if(this.x > (TankFrame.GAME_WEIGHT - Tank.getWIDTH())){//坦克不能出右边界 x=TankFrame.GAME_WEIGHT- Tank.getWIDTH(); } if(原创 2021-01-16 22:05:13 · 307 阅读 · 0 评论 -
敌方的坦克灵活走位(17)
敌方的坦克灵活走位(17) 因为是单机版,所以敌人的坦克是可以随机方向移动的。如何实现,请看代码: if(this.group == Group.BAD) {//敌人的坦克才随机发射子弹 if (random.nextInt(100) > 92) this.fire(); //敌人的坦克随机方向移动 方向变化太频繁 需要优化 改为只有百分之十的几率变方向 if (random.nextInt(100) > 90) randomDir(); } private void randomDir(){原创 2021-01-16 21:22:54 · 239 阅读 · 0 评论 -
敌军tank被干掉的动画效果(16)
敌军tank被干掉的动画效果(16) 爆照的效果是一张张图片。 将爆炸的图片加载到内存中: public static BufferedImage[] explodes = new BufferedImage[16]; for(int i=1;i<=16;i++){ explodes[i] = ImageIO.read(ResourceMgr.class.getClassLoader().getResourceAsStream(“images/e”+i+".gif")); } ...原创 2021-01-16 20:53:08 · 113 阅读 · 0 评论 -
敌人也可以射击15
考虑 一下 敌人在什么情况下才射击 总不能一直射击,所以得让坦克随机射击: 还要考虑一个问题,因为有碰撞检测,射击的时候不就自己把自己打死了么,所以要区分敌人的子弹还是自己的子弹。 所以要先分组: package com.tavon.tank; public enum Group { GOOD,BAD } GOOD是我方 BAD是敌方 我方: private Group group = Group.BAD; public Tank(int x, int y, Dir dir, TankFrame tankF原创 2021-01-15 00:47:06 · 118 阅读 · 0 评论 -
敌军坦克横空出世14(碰撞检测)
敌军的坦克是多个: 创建敌军坦克的集合在TankFrame类 List tanks = new ArrayList<>(); Starter类中初始化敌军,先初始化5个; for (int i = 0; i < 5; i++) { tankFrame.tanks.add(new Tank(200+i*60,200,Dir.DOWN,tankFrame)); } 别忘记画出坦克: for (int i=0;i<tanks.size();i++){ tanks.get(i).paint(原创 2021-01-15 00:24:58 · 148 阅读 · 0 评论 -
让子弹飞一会08
坦克可以跑了,也可以控制方向,也可以控制静止,就剩下可以开跑啦。 子弹可以出世了。 作为子弹,是一个类别,所以要建一个类,子弹要有啥属性呢? 大小, 要有速度 要有方向, 要有颜色 跟坦克一样,要会绘画自己,得有绘画的方法,要移动,得有自己的移动。 子弹是圆形的 如此这个类是这样的: package com.tavon.tank; import java.awt.*; public class Bullet { private static final int SPEED = 40; p原创 2021-01-14 23:38:06 · 154 阅读 · 1 评论 -
如何让子弹从坦克的炮筒打出来?(13)
子弹的图片和坦克的图片一样的做法,就不在赘述了。 子弹从炮筒打出 这个需要计算:首先获取坦克的宽度和高度,以及子弹的宽度和高度: 子弹的宽度和高度: public static final int WIDTH = ResourceMgr.bulletD.getWidth(); public static final int HEIGHT = ResourceMgr.bulletD.getHeight(); 坦克的宽度和高度: public static final int WIDTH = ResourceM原创 2021-01-12 23:16:38 · 229 阅读 · 1 评论 -
给坦克整整容,太丑了。加载image,并绘画出来,展示真正的坦克(12)
坦克太丑了,得给坦克整容啦,将整理好的图片放在项目的classpath目录下,然后在项目启动的时候加载到内存当中,代码如下: package com.tavon.tank; import javax.imageio.ImageIO; import java.awt.image.BufferedImage; import java.io.IOException; public class ResourceMgr { public static BufferedImage tankL,tankU,tankR,t原创 2021-01-12 22:55:25 · 258 阅读 · 0 评论 -
连续开火马力十足,导致内存泄漏(11)
一颗子弹肯定不行,得根据按键来造子弹哈。 List bulletList = new ArrayList<>();//子弹的集合装很多个子弹 for (Bullet b : bulletList){//把每个子弹都画出来 b.paint(graphics); } tankFrame.bulletList.add(new Bullet(this.x,this.y,this.dir));// 这样写可以实现功能,但是呢?子弹的数量一直在增加,不会减少,那么当子弹多到一定的时候, 内存就会爆满,导致内原创 2021-01-09 20:26:41 · 155 阅读 · 0 评论 -
坦克发射子弹10(对象之间的引用)
坦克发射子弹10(对象之间的引用) 监控键盘,当按键ctrl就要发射一个子弹,代码如下: @Override public void keyReleased(KeyEvent keyEvent) { int key = keyEvent.getKeyCode();//获取按键的ASC码。根据ASC来控制按键 switch (key) { case KeyEvent.VK_LEFT://如果是按左键 坦克向左移动10像素 bl = false; break; case KeyEvent.VK_UP://如果是原创 2021-01-09 19:51:18 · 115 阅读 · 0 评论 -
双缓冲解决,闪烁的问题09
双缓冲解决,闪烁的问题09。开发游戏中会出现的问题 当绘画的速度赶不上屏幕刷新的速度,换句话说就是每一帧画面都在变化,呈现的是不同的画面,就会出现闪烁的情况。 双缓冲就会解决这个问题,在内存中把画面画好后,在呈现在显示器上,这样就不会有闪烁的可能了。看代码: 窗口的大小使用全局变量,这样在多处使用,需要修改的时候,只用修改一个地方。 static final int GAME_WEIGHT = 800; static final int GAME_HIGHE = 600; 重写父类的update的方法:这个原创 2021-01-09 19:27:30 · 306 阅读 · 0 评论 -
坦克需要冷静07
在启动类,循环调用是为了让坦克不停的跑起来,让使用者不用按着键不放开,可以自己跑,敌人的坦克自由跑,我方的坦克可是要静止的,需要人工操控。 所以坦克需要静止的功能。 既然是坦克的属性,就应该加到坦克类中。 private boolean moving = false; //tank起始是静止的。 新增move方法,将移动的代码放入其中,增加是否静止的判断 public void paint(Graphics graphics){ move(); graphics.fillRect(x, y, 50, 50)原创 2021-01-09 14:42:21 · 76 阅读 · 0 评论 -
坦克大战 面向对象的编程06
坦克跑起来了,目前只有一个坦克,如果想制造多个坦克,不能定义多个坦克的相关的变量比如方向,位置等等。 这时候就需要面向对象的编程思想。 一个坦克有自己的位置,和方向。 将坦克翻译为一个对象代码如下: package com.tavon.tank; public class Tank { private int x, y; private Dir dir = Dir.DOWN; public Tank(int x, int y, Dir dir) { this.x = x; this.y =原创 2021-01-08 00:12:42 · 260 阅读 · 0 评论 -
坦克随心所欲的走05
接上一节,让坦克随心所欲走。 定义一个方向的枚举,上下左右: package com.tavon.tank; public enum Dir { LEFT , UP , RIGHT , DOWN } 初始方向随便给一个: Dir dir= Dir.DOWN; 设置为全局变量 在按上下左右的时候,就要变方向: 定义如下方法: private void setMainTankDir(){ if(bl) dir= Dir.LEFT; if(bu) dir= Dir.UP; if(br) dir= Dir.RIGH原创 2021-01-07 23:41:26 · 92 阅读 · 0 评论 -
按键让坦克飞起来(内部类的知识)04
承接上一篇,我们必须隐藏窗口才能让方块跑起来,如果按键让其跑起来呢。 这就要监听按键。 顺便说说匿名内部类,当一个类只有一个地方使用的时候,就可以写成内部类。 代码如下: package com.tavon.tank; import java.awt.*; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.awt.event.WindowAdapter; import java.awt.event.Wi原创 2021-01-06 23:22:33 · 184 阅读 · 3 评论 -
java初学-坦克大战-绘画,并且让其动起来03
废话不多说,上代码。 package com.tavon.tank; import java.awt.*; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; public class TankFrame extends Frame { int x=200; int y =200; public TankFrame(){ setSize(800,600);//设置这个窗口的原创 2021-01-05 00:17:25 · 179 阅读 · 0 评论 -
java初学-坦克大战-继承Frame的好处02
抛弃第一种创建窗口的方式,而是选择继承,这样有什么好处?这是java继承特性的好处之一。 废话不说上代码: package com.tavon.tank; import java.awt.*; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; public class TankFrame extends Frame { public TankFrame(){ setSize(800,60原创 2021-01-05 00:10:26 · 373 阅读 · 1 评论 -
java初学demo坦克大战1-展示一个窗口01
package com.tavon.tank; import java.awt.*; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; public class Starter { public static void main(String[] args) { Frame f = new Frame();//创建一个窗口实例 f.setSize(800,600);//设置这个窗口的大小 f.setResizabl原创 2021-01-04 23:43:40 · 359 阅读 · 4 评论