package com.game.java;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Rectangle;
import java.awt.Toolkit;
import java.awt.event.KeyEvent;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;
public class Tank
{
//每次移动的像素
private static final int XSPEED=5;
private static final int YSPEED=5;
//坦克的宽 高;
public static final int WIDTH=40;
public static final int HEIGHT=40;
//坦克出生的位置
private int x=50,y=50;
//持有对方的引用
public TankClient tc;
//区分好坏坦克
private boolean good;
//装甲车的生命
private boolean live=true;
//生命值
private int life=100;
// 显示生命值的血块
private BloodBar bb=new BloodBar();
//行走的随机数
private static Random r=new Random();
// 计时器,间隔多少时间能开第二炮
long time=System.nanoTime();
private int step=r.nextInt(12)+3;
private int oldX, oldY;
private boolean bL=false, bU=false, bR=false, bD = false;
//八个方向 已改成单独的类了
//enum Direction{L,LU,U,RU,R,RD,D,LD,STOP};
public Direction dir=Direction.STOP;
//炮的方向
public Direction ptDir=Direction.U;
private static Toolkit tk = Toolkit.getDefaultToolkit();
private static Image[] tankImages = null; //我的装甲车
private static Image[] bad_tankImages=null; //敌人的装甲车
private static Map<String, Image> imgs = new HashMap<String, Image>(); //存放我的装甲车的集合
private static Map<String, Image> bad_imgs = new HashMap<String, Image>(); //存放敌人的装甲车的集合
static {
//我的装甲车
tankImages = new Image[] {
tk.getImage(Tank.class.getClassLoader().getResource("images/tankL.gif")),
tk.getImage(Tank.class.getClassLoader().getResource("images/tankU.gif")),
tk.getImage(Tank.class.getClassLoader().getResource("images/tankR.gif")),
tk.getImage(Tank.class.getClassLoader().getResource("images/tankD.gif"))
};
//存放我的装甲车的集合
imgs.put("L", tankImages[0]);
imgs.put("U", tankImages[1]);
imgs.put("R", tankImages[2]);
imgs.put("D", tankImages[3]);
//敌人的装甲车
bad_tankImages = new Image[] {
tk.getImage(Tank.class.getClassLoader().getResource("images/tank_l.gif")),
tk.getImage(Tank.class.getClassLoader().getResource("images/tank_up.gif")),
tk.getImage(Tank.class.getClassLoader().getResource("images/tank_r.gif")),
tk.getImage(Tank.class.getClassLoader().getResource("images/tank_down.gif"))
};
//存放敌人的装甲车的集合
bad_imgs.put("L", bad_tankImages[0]);
bad_imgs.put("U", bad_tankImages[1]);
bad_imgs.put("R", bad_tankImages[2]);
bad_imgs.put("D", bad_tankImages[3]);
}
//构造方法
public Tank(int x, int y,boolean good)
{
this.x = x;
this.y = y;
this.oldX = x;
this.oldY = y;
this.good=good;
}
//重载构造方法
public Tank(int x,int y,boolean good,TankClient tc)
{
this(x,y,good);
this.tc=tc;
}
// 重载构造方法
public Tank(int x,int y,boolean good,Direction dir, TankClient tc)
{
this(x,y,good,tc);
this.dir=dir;
}
public void draw(Graphics g)
{
if(!this.live)
{
if(!good)
tc.tank.remove(this);
return;//没活着,就不画了
}
if(good) //我的装甲车
{
switch(ptDir) {
case L:
g.drawImage(imgs.get("L"), x, y, null);
break;
case U:
g.drawImage(imgs.get("U"), x, y, null);
break;
case R:
g.drawImage(imgs.get("R"), x, y, null);
break;
case D:
g.drawImage(imgs.get("D"), x, y, null);
break;
}
// 画生命血块
if(this.good) bb.draw(g);
}else{
//敌人的装甲车
switch(ptDir) {
case L:
g.drawImage(bad_imgs.get("L"), x, y, null);
break;
case U:
g.drawImage(bad_imgs.get("U"), x, y, null);
break;
case R:
g.drawImage(bad_imgs.get("R"), x, y, null);
break;
case D:
g.drawImage(bad_imgs.get("D"), x, y, null);
break;
}
}
move();
}
// 移动多少像素
void move() {
//记下装甲车移动前的坐标,如果撞到墙,好恢复这个坐标
this.oldX = x;
this.oldY = y;
switch(dir) {
case L:
x -= XSPEED;
break;
case U:
y -= YSPEED;
break;
case R:
x += XSPEED;
break;
case D:
y += YSPEED;
break;
case STOP:
break;
}
if(this.dir != Direction.STOP) {
this.ptDir = this.dir;
}
if(x < 0) x = 0;
if(y < 30) y = 30;
if(x + Tank.WIDTH > TankClient.GAME_WIDTH) x = TankClient.GAME_WIDTH - Tank.WIDTH;
if(y + Tank.HEIGHT > TankClient.GAME_HEIGHT) y = TankClient.GAME_HEIGHT - Tank.HEIGHT;
if(!good) {
Direction[] dirs = Direction.values();
if(step == 0) {
step = r.nextInt(20) + 3;
int rn = r.nextInt(dirs.length);
dir = dirs[rn];
}
step --;
if(r.nextInt(40) > 38) this.fire_time();
}
}
public void keyPressed(KeyEvent e)
{
int key=e.getKeyCode();
switch(key)
{
case KeyEvent.VK_F2:
if(!this.live&&this.good)//没活着,是Good
{
live=true;
life=100;
}
break;
//开火
case KeyEvent.VK_CONTROL: fire_time() ; 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();
}
void locateDirection() {
if(bL && !bU && !bR && !bD) dir = Direction.L;
// else if(bL && bU && !bR && !bD) dir = Direction.LU;
else if(!bL && bU && !bR && !bD) dir = Direction.U;
// else if(!bL && bU && bR && !bD) dir = Direction.RU;
else if(!bL && !bU && bR && !bD) dir = Direction.R;
// else if(!bL && !bU && bR && bD) dir = Direction.RD;
else if(!bL && !bU && !bR && bD) dir = Direction.D;
// else if(bL && !bU && !bR && bD) dir = Direction.LD;
else if(!bL && !bU && !bR && !bD) dir = Direction.STOP;
}
public void keyReleased(KeyEvent e)
{
int key=e.getKeyCode();
switch(key)
{
case KeyEvent.VK_LEFT: bL=false;break;
case KeyEvent.VK_UP: bU=false;break;
case KeyEvent.VK_RIGHT:bR=false;break;
case KeyEvent.VK_DOWN: bD=false;break;
}
locateDirection();
}
public Missile fire()
{
if(!live) return null;
int x=this.x+Tank.WIDTH/2-Missile.WIDTH/2;
int y=this.y+Tank.HEIGHT/2-Missile.HEIGHT/2;
Missile m=new Missile(x,y,good,ptDir,tc);
//这个地方注意了, 是重点,Tank类持有TankClient的引用,来修改TankClient的属性
tc.missiles.add(m);//向TankClient类的炮弹容 器里加入一发炮弹
//开火的声音 只有我方装甲车开火时,才有声音,要不太烦人了
if(good)
Sound.play_fire();
return m;
}
public Missile fire_time()
{
if(System.nanoTime()-time>500000000)//这个值经过试玩,是正好的,不用怀疑
{
//System.out.println(time);
time=System.nanoTime();//重新计时
return fire();
}
else{
return null;
}
}
public Rectangle getRect()
{
if(ptDir==Direction.D||ptDir==Direction.U)
{
//装甲车是上下运动的,41X53像素
return new Rectangle(x,y,WIDTH,HEIGHT+13);//加6是为了修正 碰撞边缘
}
else
{
// 装甲车是左右运动的,63X40像素
return new Rectangle(x,y,WIDTH+23,HEIGHT);
}
}
public boolean isLive()
{
return live;
}
public void setLive(boolean live)
{
this.live = live;
}
public boolean isGood()
{
return good;
}
public void setGood(boolean good)
{
this.good = good;
}
//把x,y的坐标值,赋为旧坐标
private void stay() {
x = oldX;
y = oldY;
}
public boolean collidesWithWall(Wall w) {
if(this.live && this.getRect().intersects(w.getRect())) {
this.stay();
return true;
}
return false;
}
public boolean collidesWithTanks(java.util.List<Tank> tanks)
{
for(int i=0;i<tanks.size();i++)
{
Tank t=tanks.get(i);
if(t!=this)
{
if(this.live && t.isLive()&&this.getRect().intersects(t.getRect())) {
this.stay();
t.stay();
return true;
}
}