1 packagecom.gh.view;2
3 importjava.awt.Color;4 importjava.awt.Graphics;5 importjava.awt.Image;6 importjava.awt.Toolkit;7 importjava.util.Vector;8
9 importjavax.swing.JOptionPane;10 importjavax.swing.JPanel;11
12 importcom.gh.model.Bomb;13 importcom.gh.model.Bullet;14 importcom.gh.model.Map;15 importcom.gh.model.Tank;16
17 /**
18 * 游戏显示面板19 *20 *@authorganhang21 *22 */
23
24 public class Mypanel extends JPanel implementsRunnable {25 public Tank mytank = null;//我的坦克
26 Tank ek = null;27 Image img;28 Vector eks = new Vector();//地方坦克集
29 Vector bs = new Vector();//爆炸集合
30 Map map = newMap();31
32 publicMypanel() {33 mytank = new Tank(200, 200, 0, 0);34 mytank.setMap(map);35 //创建敌人坦克
36 for (int i = 0; i < 17; i++) {37 ek = new Tank(i * 30, 10, 2, 1);38 eks.add(ek);39 ek.setMap(map);40 newThread(ek).start();41 }42 img = Toolkit.getDefaultToolkit().getImage(this.getClass().getResource("/1.png"));43 }44
45 @Override46 public voidpaint(Graphics g) {47 super.paint(g);48 //画背景
49 g.fillRect(0, 0, 500, 500);50 //画自己的坦克
51 if(mytank.islive)52 drawTank(mytank.getX(), mytank.getY(), g, mytank.getDrect(), mytank.getType());53 //画自己的子弹
54 for (int i = 0; i < mytank.mybs.size(); i++) {//循环时删除集合时,不要用foreach,用for
55 Bullet b = newBullet();56 b =mytank.mybs.get(i);57 if(b.islive) {58 g.setColor(Color.white);59 g.fill3DRect(b.getX(), b.getY(), 2, 2, false);60 } else
61 mytank.mybs.remove(b);62 }63 //画敌人坦克
64 for (int i = 0; i < eks.size(); i++) {65 Tank ek = newTank();66 ek =eks.get(i);67 if(ek.islive)68 drawEnemyTank(ek.getX(), ek.getY(), ek.getDrect(), g);69 //画敌人子弹
70 for (int j = 0; j < ek.mybs.size(); j++) {71 Bullet eb = newBullet();72 eb =ek.mybs.get(j);73 if(eb.islive) {74 g.setColor(Color.green);75 g.fill3DRect(eb.getX(), eb.getY(), 2, 2, false);76 } else
77 ek.mybs.remove(eb);78 }79 }80 //画爆炸,这里有个bug第一次爆炸没有爆炸效果图出来,检查原因是只一闪而过81 //添加休眠好了点,不过影响后面爆炸效果,不明白为什么第一次画得快些
82 for (int i = 0; i < bs.size(); i++) {83 //System.out.println(bs.size());
84 Bomb bb =bs.get(i);85 if(bb.islive) {86 if (bb.getTime() > 6) {87 try{88 Thread.sleep(50);89 } catch(Exception e) {90 e.printStackTrace();91 }92 g.drawImage(img, bb.getX(), bb.getY(), 30, 30, this);93 } else if (bb.getTime() > 3) {94 g.drawImage(img, bb.getX(), bb.getY(), 15, 15, this);95 } else if (bb.getTime() > 0) {96 g.drawImage(img, bb.getX(), bb.getY(), 1, 1, this);97 }98 }99 bb.livedown();100 if (bb.getTime() == 0)101 bs.remove(bb);102 }103 }104
105 public booleanisHitEnemy(Bullet b, Tank ek) {106 if (ek.getDrect() == 0 || ek.getDrect() == 2) {107 //坦克竖着时宽20,高30
108 if (b.getX() >= ek.getX() && b.getX() <= ek.getX() + 20 && b.getY() >=ek.getY()109 && b.getY() <= ek.getY() + 30) {110 b.islive = false;111 ek.islive = false;112 Bomb bb = newBomb(ek.getX(), ek.getY());113 bs.add(bb);114 return true;115 }116 return false;117 } else {//横着宽30,高20;
118 if (b.getX() >= ek.getX() && b.getX() <= ek.getX() + 30 && b.getY() >=ek.getY()119 && b.getY() <= ek.getY() + 20) {120 ek.islive = false;121 b.islive = false;122 Bomb bb = newBomb(ek.getX(), ek.getY());123 bs.add(bb);124 return true;125 }126 return false;127 }128 }129
130 public void drawEnemyTank(int x, int y, intdrect, Graphics g) {131 drawTank(x, y, g, drect, 1);132 }133
134 public void drawTank(int x, int y, Graphics g, int drect, inttype) {135 switch(type) {136 case 0:137 g.setColor(Color.cyan);138 break;139 case 1:140 g.setColor(Color.GREEN);141 default:142 break;143 }144 switch(drect) {145 case 0:146 //坦克向上时宽20,高30
147 g.fill3DRect(x, y, 5, 30, false);148 g.fill3DRect(x + 15, y, 5, 30, false);149 g.fill3DRect(x + 5, y + 9, 10, 15, false);150 g.drawLine(x + 10, y + 14, x + 10, y);151 break;152 case 1:153 //坦克向右时宽30,高20
154 g.fill3DRect(x, y, 30, 5, false);155 g.fill3DRect(x, y + 15, 30, 5, false);156 g.fill3DRect(x + 7, y + 5, 15, 10, false);157 g.drawLine(x + 13, y + 10, x + 30, y + 10);158 break;159 case 2:160 g.fill3DRect(x, y, 5, 30, false);161 g.fill3DRect(x + 15, y, 5, 30, false);162 g.fill3DRect(x + 5, y + 7, 10, 15, false);163 g.drawLine(x + 10, y + 12, x + 10, y + 30);164 break;165 case 3:166 g.fill3DRect(x, y, 30, 5, false);167 g.fill3DRect(x, y + 15, 30, 5, false);168 g.fill3DRect(x + 8, y + 5, 15, 10, false);169 g.drawLine(x, y + 10, x + 13, y + 10);170 break;171 }172 }173
174 @Override175 public voidrun() {176 while (true) {177 try{178 Thread.sleep(50);//画板刷新频率
179 } catch(InterruptedException e) {180 e.printStackTrace();181 }182 //判断自己坦克的子弹是否击中敌人坦克
183 for (int i = 0; i < mytank.mybs.size(); i++) {184 Bullet mb = newBullet();185 mb =mytank.mybs.get(i);186 if(mb.islive) {187 for (int j = 0; j < eks.size(); j++) {188 Tank ek = newTank();189 ek =eks.get(j);190 if(ek.islive) {191 isHitEnemy(mb, ek);192 }193 }194 }195 }196 //判断敌方坦克 的子弹是否击中我方坦克
197 for (int i = 0; i < eks.size(); i++) {198 Tank et = newTank();199 et =eks.get(i);200 for (int j = 0; j < et.mybs.size(); j++) {//这里写错ek查到死。。。
201 Bullet etb = newBullet();202 etb =et.mybs.get(j);203 if(etb.islive) {204 isHitEnemy(etb, mytank);205 }206 }207 }208 this.repaint();//刷新
209 if (!mytank.islive) {210 JOptionPane.showMessageDialog(this, "你被GG");211 mytank.islive = true;212 }213 }214 }215 }