package tankWar;
import java.awt.*;
import java.awt.event.*;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;
public class Tank {
public static final int XSPEED = 5;
public static final int YSPEED = 5;
public static final int WIDTH = 30;
public static final int HEIGHT = 30;
private boolean live = true;//坦克是否被歼灭
TankClient tc;
private boolean good;//判断坦克属于哪边
private int x, y;
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};
private Direction dir = Direction.STOP; //设置坦克开始时的方向,静止
private Direction ptDir = Direction.D; //设置坦克炮筒开始时的方向向下
private static Random rand = new Random();
private int step = rand.nextInt(12)+3 ;//移动的大小
private int lifeValue = 100; //生命值
private bloodBar bb= new bloodBar();//初始化血的值
private static Toolkit tk = Toolkit.getDefaultToolkit();
private static Image[] tankImages = null;
private static Map imgs = new HashMap();
static{
tankImages = new Image[]{
tk.getImage(Tank.class.getClassLoader().getResource("images/tankD.gif")),
tk.getImage(Tank.class.getClassLoader().getResource("images/tankL.gif")),
tk.getImage(Tank.class.getClassLoader().getResource("images/tankLD.gif")),
tk.getImage(Tank.class.getClassLoader().getResource("images/tankLU.gif")),
tk.getImage(Tank.class.getClassLoader().getResource("images/tankR.gif")),
tk.getImage(Tank.class.getClassLoader().getResource("images/tankRD.gif")),
tk.getImage(Tank.class.getClassLoader().getResource("images/tankRU.gif")),
tk.getImage(Tank.class.getClassLoader().getResource("images/tankU.gif")),
};
imgs.put("D", tankImages[0]);
imgs.put("L", tankImages[1]);
imgs.put("LD", tankImages[2]);
imgs.put("LU", tankImages[3]);
imgs.put("R", tankImages[4]);
imgs.put("RD", tankImages[5]);
imgs.put("RU", tankImages[6]);
imgs.put("U", tankImages[7]);
}
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, Direction dir ,TankClient tc) {
this(x, y, good);
this.tc = tc;
this.dir = dir ;
}
/**
* 当坦克被消灭时就不能再发子弹
* @param g
*/
public void draw(Graphics g) {
if(!live) {
if(!good){
tc.tanks.remove(this);
}
return;
}
if(good){
bb.draw(g);//如果是好坦克就滑出血条,生命值
}
/**
* 设置炮筒位置
*/
switch(ptDir) {
case D:
g.drawImage(tankImages[0], x, y, null);
break;
case L:
g.drawImage(tankImages[1], x, y, null);
break;
case LD:
g.drawImage(tankImages[2], x, y, null);
break;
case LU:
g.drawImage(tankImages[3], x, y, null);
break;
case R:
g.drawImage(tankImages[4], x, y, null);
break;
case RD:
g.drawImage(tankImages[5], x, y, null);
break;
case RU:
g.drawImage(tankImages[6], x, y, null);
break;
case U:
g.drawImage(tankImages[7], x, y, null);
break;
}
move();
}
/**
* 坦克移动速度
*/
void move() {
switch(dir) {
case L:
x -= XSPEED;
break;
case LU:
x -= XSPEED;
y -= YSPEED;
break;
case U:
y -= YSPEED;
break;
case RU:
x += XSPEED;
y -= YSPEED;
break;
case R:
x += XSPEED;
break;
case RD:
x += XSPEED;
y += YSPEED;
break;
case D:
y += YSPEED;
break;
case LD:
x -= XSPEED;
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 = rand.nextInt(12)+5;
int randomNumbers = rand.nextInt(dirs.length);
dir = dirs[randomNumbers];
}
step --;
if(rand.nextInt(40)>35) {
this.fire();//边移动边开火
}
}
this.oldX = x;
this.oldY = y;
}
/**
* 监听按键
* @param e
*/
public void keyPressed(KeyEvent e) {
int key = e.getKeyCode();
switch(key) {
case KeyEvent.VK_F2://按f2重新开始
if(!this.live){
this.live = true;
this.lifeValue = 100;
}
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_SPACE://按空格键开火
fire();
break;
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;
case KeyEvent.VK_F:
superFire();
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, this.tc);
tc.missiles.add(m);
return m;
}
public Missile fire(Direction dir) {
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, dir, tc);
tc.missiles.add(m);
return m;
}
public Rectangle getRect() {
return new Rectangle(x, y, tankImages[0].getWidth(null), tankImages[0].getHeight(null));
}
public boolean isLive() {
return live;
}
public void setLive(boolean live) {
this.live = live;
}
public boolean isGood() {
return good;
}
private void stay(){
x = this.oldX;
y = this.oldY;
}
/**
* 撞墙
* @param w
* @return
*/
public boolean collidesWall(Wall w){
if(this.getRect().intersects(w.getRect())&&this.live){
this.stay();
return true;
}
return false;
}
/**
* 坦克相撞
* @param tanks
* @return
*/
public boolean collideTank(java.util.List<Tank> tanks){
for(int i = 0; i<tanks.size(); i++){
Tank t = tanks.get(i);
if(this != t){
if(this.getRect().intersects(t.getRect())&&this.live&&t.isLive()){
this.stay();
t.stay();
return true;
}
}
}
return false;
}
public void superFire(){
Direction[] dirs = Direction.values();
for(int i = 0;i< 8;i++){
fire(dirs[i]);
}
}
public int getLifeValue() {
return lifeValue;
}
public void setLifeValue(int lifeValue) {
this.lifeValue = lifeValue;
}
/**
* 血条
*/
private class bloodBar{
public void draw(Graphics g){
Color c = g.getColor();
g.setColor(Color.RED);
g.drawRect(x, y-10, WIDTH, 3);
int w = WIDTH*lifeValue/100;
g.fillRect(x, y-10, w, 3);
g.setColor(c);
}
}
/**
* 加血
* @param b
* @return
*/
public boolean eat(Blood b) {
if(this.live && b.isLive() && this.getRect().intersects(b.getRect())) {
this.lifeValue = 100;
b.setLive(false);
return true;
评论1
最新资源