本篇文章目标
- 让子弹飞
- 让坦克管制子弹来发射
咱们后面实现了让坦克动起来,这次咱们须要让坦克进行开出炮弹的成果
一、让子弹飞
让子弹开炮,其实也就子弹,当咱们发射的时候,其实也相当于是一个圆在不听的动
class Missle{ int x;//子弹的x坐标 int y;//子弹的y坐标 Tank.Direction dir;//方向枚举 public Missle(int x, int y, Tank.Direction dir) { this.x = x; this.y = y; this.dir = dir; }}
同时当咱们坦克按下发射键的时候发射子弹,那么就须要将这个子弹画进去
class Missle{ //省略其余关键性代码....... //增加办法实现子弹的绘画 public void draw(Graphics g) { //获取默认的色彩Color Color c = g.getColor(); //将子弹色彩为红色 g.setColor(Color.black); //画一个子弹的大小 g.fillOval(x, y, 10, 10); //将原色彩填充回 g.setColor(c); }}
以及当咱们发射子弹的时候,子弹是依据坦克的方向进行发射挪动,那么也须要move办法
class Missle{ //省略其余关键性代码....... //每次挪动x坐标的步骤间隔 public static final int XSPEED = 10; //每次挪动y坐标的步骤间隔 public static final int YSPEED = 10; //增加办法实现子弹的绘画 public void draw(Graphics g) { //省略其余关键性代码....... //让坦克动起来 move(); } void move() { switch (dir) { case L: x -= XSPEED; break; case LU: x -= XSPEED; y -= YSPEED; break; case U: y -= YSPEED; break; case RU: x += XSPEED; y -= YSPEED; break; case R: x += XSPEED; break; case RD: x += XSPEED; y += YSPEED; break; case D: y += YSPEED; break; case LD: x -= XSPEED; y += YSPEED; break; } }}
那么咱们这时依据思路new一个子弹进去,让它飞起来
public class TankClient extends Frame { //省略其余关键性代码....... //创立子弹对象 Missle missle = new Missle(50,50, Tank.Direction.R); @Override public void paint(Graphics g) { //画出坦克.... mytank.draw(g); //画出子弹.... missle.draw(g); }}
步骤思路总结
- ✧增加Missile类
- ✧增加x,y,dir等属性以及常量
- ✧增加构造方法,draw办法等必要办法
- ✧依据不同方向,进行不同的静止
- ✧在TankClient中模仿一颗子弹
- ✧new 一颗子弹进去并让他动起来
二、让坦克开炮
刚刚咱们胜利让子弹在界面上飞起来了,然而它是不听指挥的
那么咱们如何实现当咱们按下某个键的时候,依据坦克方向发射子弹呢?
第一步:坦克增加发射步骤的办法
public class Tank { //省略其余关键性代码....... //坦克发射子弹..... public Missle fire(){ //依据坦克的坐标地位、方向、传给子弹 Missle missle =new Missle(x,y,dir); return missle; }}
第二步:增加Client关联坦克的发射子弹
之前咱们的子弹是固定的,当初咱们的子弹应该是由坦克来创立发射的
所以咱们这里的坦克须要获取到Client,并将创立的子弹传递绘画进去
public class Tank { TankClient tc; public Tank(int x, int y, TankClient tc) { this(x,y); this.tc = tc; } //省略其余关键性代码.......}
并且要由咱们的坦克按下Ctrl键,创立子弹时咱们从才进行绘画
public class TankClient extends Frame { //省略其余关键性代码....... Tank mytank = new Tank(50,50,this); //创立子弹对象 Missle missle = null; @Override public void paint(Graphics g) { //画出坦克.... mytank.draw(g); //画出子弹.... if(missle != null){missle.draw(g)} }}
第三步:增加坦克键盘按下Ctrl处理事件
public class Tank { //省略其余关键性代码....... //坦克键盘按下监听器 public void keyPressed(KeyEvent e) { int key = e.getKeyCode(); switch (key) { case KeyEvent.VK_CONTROL: tc.missle = fire(); break; case KeyEvent.VK_LEFT: BL = true; break; case KeyEvent.VK_UP: BU = true; break; case KeyEvent.VK_RIGHT: BR = true; break; case KeyEvent.VK_DOWN: BD = true; break; } locateDirection(); }}
这下咱们的子弹能够由坦克按下Ctrl键进行发射进去了
步骤思路总结
- ✧减少对Ctrl键的按键解决
- ✧依据坦克发射子弹的思路,创立办法fire,其返回值为Missle
- ✧增加构造方法,draw办法等必要办法
- ✧依据不同方向,进行不同的静止
- ✧在TankClient中模仿一颗子弹
- ✧new 一颗子弹进去并让他动起来
然而有没有发现咱们的子弹是由坦克的坐标左上角x,y的地位登程的
那么能不能由坦克的正中间登程呢?
三、优化坦克管制子弹开炮
将子弹、坦克的高度、宽度都设置为成员变量,给予固定
public class Tank { //坦克的宽度 public static final int WIDTH = 30; //坦克的高度 public static final int HEIGHT = 30; //增加办法实现坦克的绘画 public void draw(Graphics g) { //省略其余关键性代码....... g.fillOval(x, y, WIDTH, HEIGHT); } //省略其余关键性代码.......}
class Missle{ //子弹的宽度 public static final int WIDTH = 10; //子弹的高度 public static final int HEIGHT = 10; //增加办法实现坦克的绘画 public void draw(Graphics g) { //省略其余关键性代码....... g.fillOval(x, y, WIDTH, HEIGHT); } //省略其余关键性代码.......}
批改坦克的fire办法,从新定位子弹的起始地位
public class Tank { //坦克发射子弹..... public Missle fire(){ //依据坦克的坐标地位、方向、传给子弹 int x = (this.x + WIDTH / 2) - Missle.WIDTH/2; int y = (this.y + HEIGHT / 2) - Missle.HEIGHT/2; Missle missle =new Missle(x,y,dir); return missle; } //省略其余关键性代码.......}
参考资料
尚学堂:坦克大战(马士兵老师)