![](https://img-blog.csdnimg.cn/20201014180756757.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
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 · 256 阅读 · 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 · 211 阅读 · 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 · 94 阅读 · 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 · 100 阅读 · 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 · 136 阅读 · 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 · 103 阅读 · 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 · 190 阅读 · 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 · 231 阅读 · 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 · 107 阅读 · 0 评论 -
坦克发射子弹10(对象之间的引用)
坦克发射子弹10(对象之间的引用)监控键盘,当按键ctrl就要发射一个子弹,代码如下:@Overridepublic 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 · 93 阅读 · 0 评论 -
双缓冲解决,闪烁的问题09
双缓冲解决,闪烁的问题09。开发游戏中会出现的问题当绘画的速度赶不上屏幕刷新的速度,换句话说就是每一帧画面都在变化,呈现的是不同的画面,就会出现闪烁的情况。双缓冲就会解决这个问题,在内存中把画面画好后,在呈现在显示器上,这样就不会有闪烁的可能了。看代码:窗口的大小使用全局变量,这样在多处使用,需要修改的时候,只用修改一个地方。static final int GAME_WEIGHT = 800;static final int GAME_HIGHE = 600;重写父类的update的方法:这个原创 2021-01-09 19:27:30 · 272 阅读 · 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 · 60 阅读 · 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 · 220 阅读 · 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 · 73 阅读 · 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 · 152 阅读 · 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 · 147 阅读 · 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 · 296 阅读 · 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 · 306 阅读 · 4 评论