package nchu.tank;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Rectangle;
import java.awt.event.KeyEvent;
import java.util.Random;
public class Tank {
/**
* tank有x,y坐标位置,是否为生,移动速度,移动方向,可以开炮,可以移动
*/
private int x, y;// x,y坐标
private TankClient tc;
private boolean good;
private boolean live = true;
public static final int X_SPEED = 10;
public static final int Y_SPEED = 10;
public static final int TANK_WIDTH = 50;
public static final int TANK_HEIGHT = 50;
private static Random r = new Random();// 产生随机数对象
private boolean bL = false, bU = false, bR = false, bD = false;
enum Direction {
L, LU, U, RU, R, RD, D, LD, STOP
};
private Direction dir = Direction.STOP;// 移动方向
private Direction ptDir = Direction.D;
private int step = r.nextInt(12) + 3;
public Tank(int x, int y, boolean good) {
/**
*
*/
this.x = x;
this.y = y;
this.good = good;
}
public Tank(int x, int y, boolean good, Direction d, TankClient tc) {
/**
*
*/
this(x, y, good);
this.tc = tc;
this.dir = d;
}
public void paint(Graphics g) {
/**
* 绘制坦克(以圆圈表示),炮管(以线表示)
*/
if (!live)
return;
Color c = g.getColor();
if (good) {
g.setColor(Color.RED);// 自己,颜色为红色
} else {
g.setColor(Color.BLUE);// 敌人,颜色为红色
}
g.fillOval(x, y, 50, 50);
g.setColor(c);
switch (ptDir) {
case L:
g.drawLine(x + TANK_WIDTH / 2, y + TANK_HEIGHT / 2, x, y
+ TANK_HEIGHT / 2);
break;
case LU:
g.drawLine(x + TANK_WIDTH / 2, y + TANK_HEIGHT / 2, x, y);
break;
case U:
g.drawLine(x + TANK_WIDTH / 2, y + TANK_HEIGHT / 2, x + TANK_WIDTH
/ 2, y);
break;
case RU:
g.drawLine(x + TANK_WIDTH / 2, y + TANK_HEIGHT / 2, x + TANK_WIDTH,
y);
break;
case R:
g.drawLine(x + TANK_WIDTH / 2, y + TANK_HEIGHT / 2, x + TANK_WIDTH,
y + TANK_HEIGHT / 2);
break;
case RD:
g.drawLine(x + TANK_WIDTH / 2, y + TANK_HEIGHT / 2, x + TANK_WIDTH,
y + TANK_HEIGHT);
break;
case LD:
g.drawLine(x + TANK_WIDTH / 2, y + TANK_HEIGHT / 2, x, y
+ TANK_HEIGHT);
break;
case D:
g.drawLine(x + TANK_WIDTH / 2, y + TANK_HEIGHT / 2, x + TANK_WIDTH
/ 2, y + TANK_HEIGHT);
break;
case STOP:
break;
}
move();
}
void locateDirection() {
/**
*
*/
if (bL && !bU && !bR && !bD) {
dir = Direction.L;
} else if (!bL && bU && !bR && !bD) {
dir = Direction.U;
} else if (!bL && !bU && bR && !bD) {
dir = Direction.R;
} else if (!bL && !bU && !bR && bD) {
dir = Direction.D;
} else if (bL && bU && !bR && !bD) {
dir = Direction.LU;
} else if (bL && !bU && !bR && bD) {
dir = Direction.LD;
} else if (!bL && bU && bR && !bD) {
dir = Direction.RU;
} else if (!bL && !bU && bR && bD) {
dir = Direction.RD;
} else if (!bL && !bU && !bR && !bD) {
dir = Direction.STOP;
}
}
public void keyPressed(KeyEvent e) {
/**
* 监听键盘按键被按下
*/
int key = e.getKeyCode();
switch (key) {
case KeyEvent.VK_A:
bL = true;
break;
case KeyEvent.VK_W:
bU = true;
break;
case KeyEvent.VK_D:
bR = true;
break;
case KeyEvent.VK_S:
bD = true;
break;
}
locateDirection();
}
public void keyReleased(KeyEvent e) {
/**
* 监听键盘按键被松开
*/
int key = e.getKeyCode();
switch (key) {
case KeyEvent.VK_SPACE:
fire();
break;
case KeyEvent.VK_A:
bL = false;
break;
case KeyEvent.VK_W:
bU = false;
break;
case KeyEvent.VK_D:
bR = false;
break;
case KeyEvent.VK_S:
bD = false;
break;
}
locateDirection();
}
void move() {
/**
* 坦克移动
*/
switch (dir) {
case L:
x -= X_SPEED;
break;
case LU:
x -= X_SPEED;
y -= Y_SPEED;
break;
case U:
y -= Y_SPEED;
break;
case RU:
x += X_SPEED;
y -= Y_SPEED;
break;
case R:
x += X_SPEED;
break;
case RD:
x += X_SPEED;
y += Y_SPEED;
break;
case LD:
x -= X_SPEED;
y += Y_SPEED;
break;
case D:
y += Y_SPEED;
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 > 800 - TANK_WIDTH) {
x = 800 - TANK_WIDTH;
}
if (y > 600 - TANK_HEIGHT) {
y = 600 - TANK_HEIGHT;
}
if (!good) {
// 是敌军的话,随机移动
Direction[] dirs = Direction.values();
if (step == 0) {
step = r.nextInt(12) + 5;
int rn = r.nextInt(dirs.length);
dir = dirs[rn];
}
step--;
if (r.nextInt(40) > 35)// 随机开炮
{
this.fire();
}
}
}
private Missile fire() {
/**
* 坦克开炮
*/
if (!live)
return null;
if (good) {//如果是自己在开炮,发出声音
WavePlayer waveplayer = new WavePlayer("Shoot.wav");
waveplayer.start();
}
int x = this.x + TANK_WIDTH / 2 - Missile.MISSILE_WIDTH / 2;
int y = this.y + TANK_HEIGHT / 2 - Missile.MISSILE_HEIGHT / 2;
Missile m = new Missile(x, y, good, ptDir, this.tc);
tc.missiles.add(m);
return m;
}
public Rectangle getRec() {
return new Rectangle(x, y, TANK_WIDTH, TANK_HEIGHT);
}
public boolean isLive() {
return live;
}
public void setLive(boolean live) {
this.live = live;
}
public boolean isGood() {
return good;
}
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}
}