解决前
/* * 功能:坦克大战1.1 * 1.画出坦克 * 2.坦克可以上下左右移动 */ package Tank1_1; import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.util.*; public class MyTankGame2 extends JFrame { MyPanel mp = null; public static void main(String[] args) { // TODO Auto-generated method stub MyTankGame2 mtg = new MyTankGame2(); } //构造函数 public MyTankGame2() { mp = new MyPanel(); this.setTitle("坦克大战1.1"); this.add(mp); this.addKeyListener(mp); this.setSize(400,300); this.setVisible(true); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } } //我的面板 class MyPanel extends JPanel implements KeyListener { //定义一个我的坦克 Hero hero = null; //定义敌人坦克组 Vector<EnemyTank> ets = new Vector<EnemyTank>(); int enSize = 3;//敌人坦克数量 //构造函数 public MyPanel() { hero = new Hero(150, 150); //初始化敌人坦克 for (int i = 0; i < enSize; i++) { //创建一辆敌人的坦克对象 EnemyTank et = new EnemyTank((i+1)*50, 0); et.setDirect(2); et.setColor(0); //加入 ets.add(et); } } //重写paint public void paint(Graphics g) { super.paint(g); //设置图象的背景颜色 g.fillRect(0, 0, 600, 400); //画出自己的坦克 this.drawTank(hero.getX(), hero.getY(), g, this.hero.direct, 1); //画出敌人的坦克 for (int i = 0; i < ets.size(); i++) { this.drawTank(ets.get(i).getX(), ets.get(i).getY(), g, ets.get(i).getDirect(), 0); } } //画出坦克的函数 public void drawTank(int x, int y, Graphics g, int direct, int type) { //判断是什么类型的坦克 switch(type) { case 0: g.setColor(Color.CYAN); break; case 1: g.setColor(Color.YELLOW); break; } //判断方向 switch (direct) { //向上 case 0: //1.坦克左履带 g.fill3DRect(hero.getX(), hero.getY(), 5, 30, false); //2.画出右履带 g.fill3DRect(hero.getX()+15, hero.getY(), 5, 30, false); //3.画出中间车身 g.fill3DRect(hero.getX()+5, hero.getY()+5, 10, 20, false); //4.画出炮楼 g.fillRect(hero.getX()+5, hero.getY()+10, 10, 10); //5.画出坦克炮 g.drawLine(hero.getX()+9, hero.getY()+15, hero.getX()+9, hero.getY()); break; //向右 case 1: //1.坦克左履带 g.fill3DRect(hero.getX()-5, hero.getY()+5, 30, 5, false); //2.坦克右履带 g.fill3DRect(hero.getX()-5, hero.getY()+20, 30, 5, false); //3.坦克车身 g.fill3DRect(hero.getX(), hero.getY()+10, 20, 10, false); //4.坦克炮楼 g.fillRect(hero.getX()+5, hero.getY()+10, 10, 10); //5.坦克炮 g.drawLine(hero.getX()+10, hero.getY()+15, hero.getX()+25, hero.getY()+15); break; //向下 case 2: //1.坦克左履带 g.fill3DRect(hero.getX(), hero.getY(), 5, 30, false); //2.画出右履带 g.fill3DRect(hero.getX()+15, hero.getY(), 5, 30, false); //3.画出中间车身 g.fill3DRect(hero.getX()+5, hero.getY()+5, 10, 20, false); //4.画出炮楼 g.fillRect(hero.getX()+5, hero.getY()+10, 10, 10); //5.画出坦克炮 g.drawLine(hero.getX()+9, hero.getY()+15, hero.getX()+9, hero.getY()+30); break; //向左 case 3: //1.坦克左履带 g.fill3DRect(hero.getX()-5, hero.getY()+5, 30, 5, false); //2.坦克右履带 g.fill3DRect(hero.getX()-5, hero.getY()+20, 30, 5, false); //3.坦克车身 g.fill3DRect(hero.getX(), hero.getY()+10, 20, 10, false); //4.坦克炮楼 g.fillRect(hero.getX()+5, hero.getY()+10, 10, 10); //5.坦克炮 g.drawLine(hero.getX()+10, hero.getY()+15, hero.getX()-5, hero.getY()+15); break; } } //键按下处理awsd public void keyPressed(KeyEvent e) { // TODO Auto-generated method stub if (e.getKeyCode() == KeyEvent.VK_W) { this.hero.setDirect(0); this.hero.moveUp(); } else if (e.getKeyCode() == KeyEvent.VK_D) { this.hero.setDirect(1); this.hero.moveRight(); } else if (e.getKeyCode() == KeyEvent.VK_S) { this.hero.setDirect(2); this.hero.moveDown(); } else if (e.getKeyCode() == KeyEvent.VK_A) { this.hero.setDirect(3); this.hero.moveLeft(); } //重新绘制窗口 this.repaint(); } @Override public void keyReleased(KeyEvent e) { // TODO Auto-generated method stub } @Override public void keyTyped(KeyEvent e) { // TODO Auto-generated method stub } }
改正后
/* * 功能:坦克大战1.1 * 1.画出坦克 * 2.坦克可以上下左右移动 */ package Tank1_1; import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.util.*; public class MyTankGame2 extends JFrame { MyPanel mp = null; public static void main(String[] args) { // TODO Auto-generated method stub MyTankGame2 mtg = new MyTankGame2(); } //构造函数 public MyTankGame2() { mp = new MyPanel(); this.setTitle("坦克大战1.1"); this.add(mp); this.addKeyListener(mp); this.setSize(400,300); this.setVisible(true); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } } //我的面板 class MyPanel extends JPanel implements KeyListener { //定义一个我的坦克 Hero hero = null; //定义敌人坦克组 Vector<EnemyTank> ets = new Vector<EnemyTank>(); int enSize = 3;//敌人坦克数量 //构造函数 public MyPanel() { hero = new Hero(150, 150); //初始化敌人坦克 for (int i = 0; i < enSize; i++) { //创建一辆敌人的坦克对象 EnemyTank et = new EnemyTank((i+1)*50, 0); et.setDirect(2); et.setColor(0); //加入 ets.add(et); } } //重写paint public void paint(Graphics g) { super.paint(g); //设置图象的背景颜色 g.fillRect(0, 0, 600, 400); //画出自己的坦克 this.drawTank(hero.getX(), hero.getY(), g, this.hero.direct, 1); //画出敌人的坦克 for (int i = 0; i < ets.size(); i++) { this.drawTank(ets.get(i).getX(), ets.get(i).getY(), g, ets.get(i).getDirect(), 0); } } //画出坦克的函数 public void drawTank(int x, int y, Graphics g, int direct, int type) { //判断是什么类型的坦克 switch(type) { case 0: g.setColor(Color.CYAN); break; case 1: g.setColor(Color.YELLOW); break; } //判断方向 switch (direct) { //向上 case 0: //1.坦克左履带 g.fill3DRect(x, y, 5, 30, false); //2.画出右履带 g.fill3DRect(x+15, y, 5, 30, false); //3.画出中间车身 g.fill3DRect(x+5, y+5, 10, 20, false); //4.画出炮楼 g.fillRect(x+5, y+10, 10, 10); //5.画出坦克炮 g.drawLine(x+9, y+15, x+9, y); break; //向右 case 1: //1.坦克左履带 g.fill3DRect(x-5, y+5, 30, 5, false); //2.坦克右履带 g.fill3DRect(x-5, y+20, 30, 5, false); //3.坦克车身 g.fill3DRect(x, y+10, 20, 10, false); //4.坦克炮楼 g.fillRect(x+5, y+10, 10, 10); //5.坦克炮 g.drawLine(x+10, y+15, x+25, y+15); break; //向下 case 2: //1.坦克左履带 g.fill3DRect(x, y, 5, 30, false); //2.画出右履带 g.fill3DRect(x+15, y, 5, 30, false); //3.画出中间车身 g.fill3DRect(x+5, y+5, 10, 20, false); //4.画出炮楼 g.fillRect(x+5, y+10, 10, 10); //5.画出坦克炮 g.drawLine(x+9, y+15, x+9, y+30); break; //向左 case 3: //1.坦克左履带 g.fill3DRect(x-5, y+5, 30, 5, false); //2.坦克右履带 g.fill3DRect(x-5, y+20, 30, 5, false); //3.坦克车身 g.fill3DRect(x, y+10, 20, 10, false); //4.坦克炮楼 g.fillRect(x+5, y+10, 10, 10); //5.坦克炮 g.drawLine(x+10, y+15, x-5, y+15); break; } } //键按下处理awsd public void keyPressed(KeyEvent e) { // TODO Auto-generated method stub if (e.getKeyCode() == KeyEvent.VK_W) { this.hero.setDirect(0); this.hero.moveUp(); } else if (e.getKeyCode() == KeyEvent.VK_D) { this.hero.setDirect(1); this.hero.moveRight(); } else if (e.getKeyCode() == KeyEvent.VK_S) { this.hero.setDirect(2); this.hero.moveDown(); } else if (e.getKeyCode() == KeyEvent.VK_A) { this.hero.setDirect(3); this.hero.moveLeft(); } //重新绘制窗口 this.repaint(); } @Override public void keyReleased(KeyEvent e) { // TODO Auto-generated method stub } @Override public void keyTyped(KeyEvent e) { // TODO Auto-generated method stub } }
主要区别
//判断方向 switch (direct) { //向上 case 0: //1.坦克左履带 g.fill3DRect(hero.getX(), hero.getY(), 5, 30, false); //2.画出右履带 g.fill3DRect(hero.getX()+15, hero.getY(), 5, 30, false); //3.画出中间车身 g.fill3DRect(hero.getX()+5, hero.getY()+5, 10, 20, false); //4.画出炮楼 g.fillRect(hero.getX()+5, hero.getY()+10, 10, 10); //5.画出坦克炮 g.drawLine(hero.getX()+9, hero.getY()+15, hero.getX()+9, hero.getY()); break; //向右 case 1: //1.坦克左履带 g.fill3DRect(hero.getX()-5, hero.getY()+5, 30, 5, false); //2.坦克右履带 g.fill3DRect(hero.getX()-5, hero.getY()+20, 30, 5, false); //3.坦克车身 g.fill3DRect(hero.getX(), hero.getY()+10, 20, 10, false); //4.坦克炮楼 g.fillRect(hero.getX()+5, hero.getY()+10, 10, 10); //5.坦克炮 g.drawLine(hero.getX()+10, hero.getY()+15, hero.getX()+25, hero.getY()+15); break; //向下 case 2: //1.坦克左履带 g.fill3DRect(hero.getX(), hero.getY(), 5, 30, false); //2.画出右履带 g.fill3DRect(hero.getX()+15, hero.getY(), 5, 30, false); //3.画出中间车身 g.fill3DRect(hero.getX()+5, hero.getY()+5, 10, 20, false); //4.画出炮楼 g.fillRect(hero.getX()+5, hero.getY()+10, 10, 10); //5.画出坦克炮 g.drawLine(hero.getX()+9, hero.getY()+15, hero.getX()+9, hero.getY()+30); break; //向左 case 3: //1.坦克左履带 g.fill3DRect(hero.getX()-5, hero.getY()+5, 30, 5, false); //2.坦克右履带 g.fill3DRect(hero.getX()-5, hero.getY()+20, 30, 5, false); //3.坦克车身 g.fill3DRect(hero.getX(), hero.getY()+10, 20, 10, false); //4.坦克炮楼 g.fillRect(hero.getX()+5, hero.getY()+10, 10, 10); //5.坦克炮 g.drawLine(hero.getX()+10, hero.getY()+15, hero.getX()-5, hero.getY()+15); break; }
//判断方向 switch (direct) { //向上 case 0: //1.坦克左履带 g.fill3DRect(x, y, 5, 30, false); //2.画出右履带 g.fill3DRect(x+15, y, 5, 30, false); //3.画出中间车身 g.fill3DRect(x+5, y+5, 10, 20, false); //4.画出炮楼 g.fillRect(x+5, y+10, 10, 10); //5.画出坦克炮 g.drawLine(x+9, y+15, x+9, y); break; //向右 case 1: //1.坦克左履带 g.fill3DRect(x-5, y+5, 30, 5, false); //2.坦克右履带 g.fill3DRect(x-5, y+20, 30, 5, false); //3.坦克车身 g.fill3DRect(x, y+10, 20, 10, false); //4.坦克炮楼 g.fillRect(x+5, y+10, 10, 10); //5.坦克炮 g.drawLine(x+10, y+15, x+25, y+15); break; //向下 case 2: //1.坦克左履带 g.fill3DRect(x, y, 5, 30, false); //2.画出右履带 g.fill3DRect(x+15, y, 5, 30, false); //3.画出中间车身 g.fill3DRect(x+5, y+5, 10, 20, false); //4.画出炮楼 g.fillRect(x+5, y+10, 10, 10); //5.画出坦克炮 g.drawLine(x+9, y+15, x+9, y+30); break; //向左 case 3: //1.坦克左履带 g.fill3DRect(x-5, y+5, 30, 5, false); //2.坦克右履带 g.fill3DRect(x-5, y+20, 30, 5, false); //3.坦克车身 g.fill3DRect(x, y+10, 20, 10, false); //4.坦克炮楼 g.fillRect(x+5, y+10, 10, 10); //5.坦克炮 g.drawLine(x+10, y+15, x-5, y+15); break; }
问题出现在没有简化判断坦克方向的定义上,应将判断内的hero.getX()和hero.getY()使用Ctrl+F替换为x和y
不然会导致
this.drawTank(hero.getX(), hero.getY(), g, this.hero.direct, 1);中的hero.getX(),hero.getY()与其混淆,从而导致坦克重叠