public GamePanel(MainFrame frame,intlevel,GameType gameType)
{this.frame =frame ;this.level=level;this.gameType=gameType;
setBackground(Color.GRAY);
init();
Thread t=newFreshThead();
t.start();
addListener();
}private voidinit()
{
bullets=new ArrayList();
allTanks=new ArrayList<>();
walls=new ArrayList<>();
boomImage=new ArrayList<>();
image=new BufferedImage(794,572,BufferedImage.TYPE_INT_BGR);
g2=image.createGraphics();
playerTanks=new ArrayList<>();
play1=new Tank(278,537,ImageUtil.PLAYER1_UP_IMAGE_URL,this,TankType.player1);if(gameType==GameType.TWO_PLAYER)
{
play2=new Tank(500,537,ImageUtil.PLAYER2_UP_IMAGE_URL,this,TankType.player2);
playerTanks.add(play2);
}
playerTanks.add(play1);
botTanks=new Vector<>();
botTanks.add(new Bot(botX[0],1,this,TankType.bot));
botTanks.add(new Bot(botX[1],1,this,TankType.bot));
botTanks.add(new Bot(botX[2],1,this,TankType.bot));
botReadyCount-=3;
allTanks.addAll(playerTanks);
allTanks.addAll(botTanks);
base=new Base(367,532);
initWalls();
}private voidaddListener()
{
frame.addKeyListener(this);
}private voidinitWalls()
{
Map map=Map.getMap(level);
walls.addAll(map.getWalls());
walls.add(base);
}public voidpaint(Graphics g)
{
paintTankActoin();
CreateBot();
paintImage();
g.drawImage(image,0, 0, this);
}private voidpaintImage()
{
g2.setColor(Color.BLACK);
g2.fillRect(0, 0, image.getWidth(),image.getHeight() );
panitBoom();
paintBotTanks();
paintBotCount();
panitPlayerTanks();
allTanks.addAll(playerTanks);
allTanks.addAll(botTanks);
paintWalls();
paintBullets();if(botSurplusCount==0)
{
stopThread();
paintBotCount();
g2.setFont(new Font("楷体",Font.BOLD,50));
g2.setColor(Color.GREEN);
g2.drawString("胜利", 250, 400);
gotoNextLevel();
}if(gameType ==GameType.ONE_PLAYER)
{if(!play1.isAlive()) {
stopThread();
boomImage.add(newBoom(play1.x,play1.y));
panitBoom();
paintGameOver();
gotoPrevisousLevel();
}
}else {//双人模式
if(play1.isAlive()&&!play2.isAlive())
{
survivor=play1;
}else if(!play1.isAlive()&&play2.isAlive())
{
survivor=play2;
}else if(!(play1.isAlive()||play2.isAlive())) {
stopThread();
boomImage.add(newBoom(survivor.x,survivor.y));
panitBoom();
paintGameOver();
gotoPrevisousLevel();//重新进入本关
}
}if(!base.isAlive())
{
stopThread();
paintGameOver();
base.setImage(ImageUtil.BREAK_BASE_IMAGE_URL);
gotoPrevisousLevel();
}
g2.drawImage(base.getImage(),base.x,base.y,this);
}private voidpaintBotCount() {
g2.setFont(new Font("楷体",Font.BOLD,25));
g2.setColor(Color.BLUE);
g2.drawString("敌方坦克剩余:"+ botSurplusCount, 10,30);
}private voidpaintGameOver()
{
g2.setFont(new Font("楷体",Font.BOLD,50));
g2.setColor(Color.RED);
g2.drawString("Game Over !",250,400);
}private voidpanitBoom()
{for(int i=0;i
Boom boom=boomImage.get(i);if(boom.isAlive())
{
boom.show(g2);
}else{
boomImage.remove(i);
i--;
}
}
}private voidpaintWalls()
{for(int i=0;i
{
Wall w=walls.get(i);if(w.isAlive())
{
g2.drawImage(w.getImage(),w.x,w.y,this);
}else{
walls.remove(i);
i--;
}
}
}private voidpaintBullets()
{for(int i=0;i
{
Bullet b=bullets.get(i);if(b.isAlive()) {
b.move();
b.hitBase();
b.hitWall();
b.hitTank();
g2.drawImage(b.getImage(), b.x,b.y,this);
}else{
bullets.remove(i);
i--;
}
}
}private voidpaintBotTanks()
{for(int i=0;i
{
Bot t=(Bot)botTanks.get(i);if(t.isAlive()) {
t.go();
g2.drawImage(t.getImage(), t.x,t.y,this);
}else{
botTanks.remove(i);
i--;
boomImage.add(newBoom(t.x,t.y));
decreaseBot();
}
}
}private voidpanitPlayerTanks()
{for(int i=0;i
{
Tank t=playerTanks.get(i);if(t.isAlive()) {
g2.drawImage(t.getImage(), t.x,t.y,this);
}else{
playerTanks.remove(i);
i--;
boomImage.add(newBoom(t.x,t.y));
}
}
}private synchronized voidstopThread()
{
frame.removeKeyListener(this);
finish=true;
}private class FreshThead extendsThread
{public voidrun()
{while(!finish)
{
repaint();try{
Thread.sleep(FRESH);
}catch(InterruptedException e)
{
e.printStackTrace();
}
}
}
}private voidCreateBot()
{
createBotTimer+=FRESH;if(botTanks.size()0&&createBotTimer>=4000)
{int index=r.nextInt(3);
Rectangle bornRect=new Rectangle(botX[index],1,35,35);for(int i=0,lengh=allTanks.size();i
{
Tank t=allTanks.get(i);if(t.isAlive()&&t.hit(bornRect))
{return;
}
}
botTanks.add(new Bot(botX[index],1,GamePanel.this,TankType.bot));
botReadyCount--;
createBotTimer=0;
}
}private voidgotoNextLevel() {
Thread jump=newJumpPageThead(Level.nextLevel());
jump.start();
}private voidgotoPrevisousLevel() {
Thread jump=newJumpPageThead(Level.previsousLevel());
jump.start();
}public voiddecreaseBot()
{
botSurplusCount--;
}
@Overridepublic voidkeyPressed(KeyEvent e) {//TODO 自动生成的方法存根
switch(e.getKeyCode())
{caseKeyEvent.VK_Y:
y_key=true;break;caseKeyEvent.VK_W:
w_key=true;
a_key=false;
s_key=false;
d_key=false;break;caseKeyEvent.VK_A:
w_key=false;
a_key=true;
s_key=false;
d_key=false;break;caseKeyEvent.VK_S:
w_key=false;
a_key=false;
s_key=true;
d_key=false;break;caseKeyEvent.VK_D:
w_key=false;
a_key=false;
s_key=false;
d_key=true;break;caseKeyEvent.VK_HOME:caseKeyEvent.VK_NUMPAD1:
num1_key=true;break;caseKeyEvent.VK_UP:
up_key=true;
down_key=false;
right_key=false;
left_key=false;break;caseKeyEvent.VK_DOWN:
up_key=false;
down_key=true;
right_key=false;
left_key=false;break;caseKeyEvent.VK_LEFT:
up_key=false;
down_key=false;
right_key=false;
left_key=true;break;caseKeyEvent.VK_RIGHT:
up_key=false;
down_key=false;
right_key=true;
left_key=false;break;
}
}private voidpaintTankActoin()
{if(y_key)
{
play1.attack();
}if(w_key)
{
play1.upward();
}if(d_key)
{
play1.rightward();
}if(a_key)
{
play1.leftward();
}if(s_key)
{
play1.downward();
}if(gameType==GameType.TWO_PLAYER)
{if(num1_key)
{
play2.attack();
}if(up_key)
{
play2.upward();
}if(right_key)
{
play2.rightward();
}if(left_key)
{
play2.leftward();
}if(down_key)
{
play2.downward();
}
}
}
@Overridepublic voidkeyReleased(KeyEvent e) {//TODO 自动生成的方法存根
switch(e.getKeyCode())
{caseKeyEvent.VK_Y:
y_key=false;break;caseKeyEvent.VK_W:
w_key=false;break;caseKeyEvent.VK_A:
a_key=false;break;caseKeyEvent.VK_S:
s_key=false;break;caseKeyEvent.VK_D:
d_key=false;break;caseKeyEvent.VK_HOME:caseKeyEvent.VK_NUMPAD1:
num1_key=false;break;caseKeyEvent.VK_UP:
up_key=false;break;caseKeyEvent.VK_DOWN:
down_key=false;break;caseKeyEvent.VK_LEFT:
left_key=false;break;caseKeyEvent.VK_RIGHT:
right_key=false;break;
}
}public voidaddBullet(Bullet b)
{
bullets.add(b);
}public ListgetWalls(){returnwalls;
}publicBase getBase()
{returnbase;
}public ListgetTanks()
{returnallTanks;
}private class JumpPageThead extendsThread{intlevel;public JumpPageThead (intlevel)
{this.level=level;
}public voidrun()
{try{
Thread.sleep(1000);
frame.setPanel(newLevelPanel(level,frame,gameType));
}catch(InterruptedException e)
{
e.printStackTrace();
}
}
}
@Overridepublic voidkeyTyped(KeyEvent e) {//TODO 自动生成的方法存根
}
}