package tankGame;
import java.awt.Color;
import java.awt.Container;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Panel;
import java.awt.Rectangle;
import java.awt.Shape;
import java.awt.Toolkit;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.image.ImageObserver;
import java.io.File;
import java.text.AttributedCharacterIterator;
import java.util.Vector;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class MyPanel extends JPanel implements KeyListener,Runnable{
//定义我的一部坦克
private MyTank myTank = null;
//定义敌人坦克组
private Vector<EnemyTank> enemyTank = null;
//定义敌人坦克坐标方向集合
private Vector<Node> nodes = null;
private int MyLife = 3; //我的生命值
private int EnemyTankLife = 20; //敌人坦克生命值
private int enemyNum = 3; //敌人坦克数
//定义3张图片(3张图片组成一个炸弹)
Image image1 = null;
Image image2 = null;
Image image3 = null;
//定义炸弹的集合
Vector<Bomb> bombs = null;
public MyPanel(){
}
//构造方法
public MyPanel(String flag){
//恢复记录(如果文件存在就读取回复)
if(new File("myRecord.dat").exists()){
Recorder.getRecording();
}
//初始化我的坦克
myTank = new MyTank(200,200);
myTank.setSpeed(3);
//初始化敌人坦克组
enemyTank = new Vector<EnemyTank>();
//初始化炸弹集合
bombs = new Vector<Bomb>();
//先为炸弹组中添加一次爆炸(解决第一次不爆炸的情况)
bombs.add(new Bomb());
if(flag.equals("newGame")){
for(int i = 0; i<enemyNum ; i++){
//初始化坦克组的每辆坦克
EnemyTank badTank = new EnemyTank((i+1)*50,0);
//加入坦克组
enemyTank.add(badTank);
badTank.setDirect(1);
//将MyPanel的敌人坦克向量交给该敌人坦克
badTank.setEnemyTanks(enemyTank);
//将MyPanel的敌人坦克向量交给我的坦克类
myTank.setEnemyTanks(enemyTank);
//将MyPanel上我的坦克交给敌人的坦克类
badTank.setMyTank(myTank);
//启动敌人坦克线程
Thread t = new Thread(badTank);
t.start();
//给敌人坦克添加一颗子弹
Bullet enemyTankBullet = new Bullet(badTank.getX()+8,badTank.getY()+30,badTank.getDirect());
//加入给敌人坦克子弹组
badTank.getEnemyTankbullets().add(enemyTankBullet);
//启动敌人子弹线程
Thread t2 = new Thread(enemyTankBullet);
t2.start();
}
}else{
this.nodes = Recorder.getRecordEnemyTank();
for(int i = 0; i<nodes.size() ; i++){
//初始化坦克组的每辆坦克
EnemyTank badTank = new EnemyTank(nodes.get(i).getX(),nodes.get(i).getY());
//加入坦克组
enemyTank.add(badTank);
badTank.setDirect(nodes.get(i).getDirect());
//将MyPanel的敌人坦克向量交给该敌人坦克
badTank.setEnemyTanks(enemyTank);
//将MyPanel的敌人坦克向量交给我的坦克类
myTank.setEnemyTanks(enemyTank);
//将MyPanel上我的坦克交给敌人的坦克类
badTank.setMyTank(myTank);
//启动敌人坦克线程
Thread t = new Thread(badTank);
t.start();
//给敌人坦克添加一颗子弹
Bullet enemyTankBullet = new Bullet(badTank.getX()+8,badTank.getY()+30,badTank.getDirect());
//加入给敌人坦克子弹组
badTank.getEnemyTankbullets().add(enemyTankBullet);
//启动敌人子弹线程
Thread t2 = new Thread(enemyTankBullet);
t2.start();
}
}
//播放开战声音
PlayMusic apw=new PlayMusic("Start.wav");
Thread T = new Thread(apw);
T.start();
//将MyPanel的敌人坦克向量交给记录类
Recorder.setEnemyTanks(enemyTank);
//初始化图片
image1 = Toolkit.getDefaultToolkit().getImage(Panel.class.getResource("/bomb_1.gif"));
image2 = Toolkit.getDefaultToolkit().getImage(Panel.class.getResource("/bomb_2.gif"));
image3 = Toolkit.getDefaultToolkit().getImage(Panel.class.getResource("/bomb_3.gif"));
}
//重新paint
public void paint(Graphics g){
super.paint(g);
g.fillRect(0, 0, 400, 300);
//画出我的坦克(如果存活就画)(原先的坦克)
if(this.myTank.isLive()){
paintTank(this.myTank.getX(),this.myTank.getY(),g,this.myTank.getDirect(),this.myTank.getType());
}else if(!this.myTank.isLive() && this.MyLife>0){
paintTank(this.myTank.getX(),this.myTank.getY(),g,this.myTank.getDirect(),this.myTank.getType());
}
//画出敌人坦克
this.paintEnemyTank(g);
//画出子弹
this.paintBullet(g);
//画出爆炸效果
this.paintBomb(g);
//画出提示坦克
this.paintInfoTank(g);
if(Recorder.getMyTankNum()==0){
GameOver o = new GameOver();
Thread t = new Thread(o);
t.start();
this.updateUI();//解决刷新不了的问题
this.getParent().add(o);
this.getParent().remove(this);
//播放GameOver音效
PlayMusic p = new PlayMusic("GameOver.wav");
Thread t2 = new Thread(p);
t2.start();
}else if(Recorder.getEnemyTankNum()==0){
Win w = new Win();
Thread t = new Thread(w);
t.start();
this.updateUI();//解决刷新不了的问题
this.getParent().add(w);
this.getParent().remove(this);
//播放Win音效
PlayMusic p = new PlayMusic("Win.wav");
Thread t2 = new Thread(p);
t2.start();
}
}
/**
* 画坦克的方法
* @param x x坐标
* @param y y坐标
* @param g 画笔
* @param direct 坦克方向
* @param type 坦克类型
*/
public static void paintTank(int x,int y,Graphics g,int direct,int type){
//判断坦克类型
switch(type){
case 0: //0为我的坦克
g.setColor(Color.yellow);
break;
case 1: //1为敌人的坦克
g.setColor(Color.cyan);
break;
}
switch(direct){
case 0: //0为向上方向
//画出左边的矩形
g.fill3DRect(x, y, 5, 30, false);
//画出右边的矩形
g.fill3DRect(x+15, y, 5, 30, false);
//画出中间的矩形
g.fill3DRect(x+5, y+5, 10, 20, false);
//画出中间的圆形
g.fillOval(x+4, y+10, 10, 10);
//画出中间的线
g.drawLine(x+9, y+15, x+9, y);
break;
case 1: //1为向下方向
g.fill3DRect(x, y, 5, 30, false);
g.fill3DRect(x+15, y, 5, 30, false);
g.fill3DRect(x+5, y+5, 10, 20, false);
g.fillOval(x+4, y+10, 10, 10);
g.drawLine(x+9, y+30, x+9, y+15);
break;
case 2: //2为向左方向
g.fill3DRect(x, y+5, 30, 5, false);
g.fill3DRect(x, y+20, 30, 5, false);
g.fill3DRect(x+5, y+10, 20, 10, false);
g.fillOval(x+9, y+10, 10, 10);
g.drawLine(x, y+15, x+9, y+15);
break;
case 3: //3为向右方向
g.fill3DRect(x, y+5, 30, 5, false);
g.fill3DRect(x, y+20, 30, 5, false);
g.fill3DRect(x+5, y+10, 20, 10, false);
g.fillOval(x+9, y+10, 10, 10);
g.drawLine(x+9, y+15, x+30, y+15);
break;
}
}
//键盘按下
@Override
public void keyPressed(KeyEvent e) {
if(e.getKeyCode()==KeyEvent.VK_UP || e.getKeyCode()==KeyEvent.VK_W){
if(this.myTank.getY()>0){
this.myTank.setDirect(0);
if(!this.myTank.isTouchOtherEnemy()){
this.myTank.move_Up();
this.repaint();
}
}
}else if(e.getKeyCode()==KeyEvent.VK_DOWN || e.getKeyCode()==KeyEvent.VK_S){
if(this.myTank.getY()<271){
this.myTank.setDirect(1);
if(!this.myTank.isTouchOtherEnemy()){
this.myTank.move_Down();
this.repaint();
}
}
}else if(e.getKeyCode()==KeyEvent.VK_LEFT || e.getKeyCode()==KeyEvent.VK_A){
if(this.myTank.getX()>0){
this.myTank.setDirect(2);
if(!this.myTank.isTouchOtherEnemy()){
this.myTank.move_Left();
this.repaint();
}
}
}else if(e.getKeyCode()==KeyEvent.VK_RIGHT || e.getKeyCode()==KeyEvent.VK_D){
if(this.myTank.getX()<371){
this.myTank.setDirect(3);
if(!this.myTank.isTouchOtherEnemy()){
this.myTank.move_Right();
this.repaint();
}
}
}
if(e.getKeyCode()==KeyEvent.VK_J || e.getKeyCode() == KeyEvent.VK_SPACE){
//定义坦克一次最多只能发五颗子弹
if(this.myTank.getBullet().size()<5 && this.myTank.isLive()){
this.myTank.shot();
PlayMusic bb=new PlayMusic("Shot.wav");
Thread t = new Thread(bb);
t.start();
this.repaint();
}
}
}
@Override
public void keyReleased(KeyEvent e) {
// TODO Auto-generated method stub
}
@Override
public void keyTyped(KeyEvent e) {
//