230 lines
6.8 KiB
230 lines
6.8 KiB
package com.study.tank;
|
|
|
|
import com.study.tank.factory.BaseTank;
|
|
import com.study.tank.strategy.FireStrategy;
|
|
import com.study.tank.strategy.Imp.DefaultFireStrategy;
|
|
import com.study.tank.strategy.Imp.GoodTankFireStrategy;
|
|
|
|
import java.awt.*;
|
|
import java.util.Random;
|
|
|
|
/**
|
|
* @Description:
|
|
* @Auther: xiaoshengjie
|
|
* @Date: 2022/10/22/上午10:08
|
|
*/
|
|
public class Tank extends BaseTank {
|
|
public static final int tankWidth = ImageManger.goodTankU.getWidth();
|
|
public static final int tankHeight = ImageManger.goodTankU.getHeight();
|
|
private boolean moving = true;
|
|
// private int x, y;
|
|
private boolean living = true;
|
|
public Dir dir = Dir.DOWN;
|
|
private final int speed = 4;
|
|
public TankFrame tankFrame = null;
|
|
private Random random = new Random();
|
|
//Group group = Group.BAD;
|
|
|
|
// FireStrategy fs;
|
|
|
|
// public Group getGroup() {
|
|
// return group;
|
|
// }
|
|
//
|
|
// public void setGroup(Group group) {
|
|
// this.group = group;
|
|
// }
|
|
|
|
public Tank(int x, int y, Dir dir, Group group, TankFrame tankFrame) {
|
|
// this.x = x;
|
|
// this.y = y;
|
|
super(x, y, group);
|
|
this.dir = dir;
|
|
//this.group = group;
|
|
this.tankFrame = tankFrame;
|
|
// try {
|
|
// if (this.group == Group.GOOD) {
|
|
// String goodName = (String) PropertyMgr.get("goodFs");
|
|
// //fs = (GoodTankFireStrategy) Class.forName(goodName).newInstance();
|
|
// fs = (FireStrategy) Class.forName(goodName).getDeclaredConstructor().newInstance();
|
|
// } else {
|
|
// fs = new DefaultFireStrategy();
|
|
// }
|
|
// } catch (Exception e) {
|
|
//
|
|
// }
|
|
}
|
|
|
|
// public Tank(int x, int y, Dir dir, Group group, boolean moving, TankFrame tankFrame) {
|
|
// this.x = x;
|
|
// this.y = y;
|
|
// this.dir = dir;
|
|
// this.group = group;
|
|
// this.tankFrame = tankFrame;
|
|
// this.moving = false;
|
|
// }
|
|
|
|
// public int getX() {
|
|
// return x;
|
|
// }
|
|
//
|
|
// public int getY() {
|
|
// return y;
|
|
// }
|
|
|
|
public Dir getDir() {
|
|
return dir;
|
|
}
|
|
|
|
public int getSpeed() {
|
|
return speed;
|
|
}
|
|
|
|
// public void setX(int x) {
|
|
// this.x = x;
|
|
// }
|
|
//
|
|
// public void setY(int y) {
|
|
// this.y = y;
|
|
// }
|
|
|
|
public boolean isMoving() {
|
|
return moving;
|
|
}
|
|
|
|
public void setMoving(boolean moving) {
|
|
this.moving = moving;
|
|
}
|
|
|
|
public void setDir(Dir dir) {
|
|
this.dir = dir;
|
|
}
|
|
|
|
// public void paint(Graphics g) {
|
|
// System.out.println("tank paint");
|
|
// if (!living) {
|
|
// tankFrame.tanks.remove(this);
|
|
// moving = false;
|
|
// return;
|
|
// }
|
|
// switch (this.dir) {
|
|
// case DOWN:
|
|
// g.drawImage(this.group == Group.GOOD ? ImageManger.goodTankD : ImageManger.badTankD, this.x, this.y, null);
|
|
// break;
|
|
// case UP:
|
|
// g.drawImage(this.group == Group.GOOD ? ImageManger.goodTankU : ImageManger.badTankU, this.x, this.y, null);
|
|
// break;
|
|
// case RIGHT:
|
|
// g.drawImage(this.group == Group.GOOD ? ImageManger.goodTankR : ImageManger.badTankR, this.x, this.y, null);
|
|
// break;
|
|
// case LEFT:
|
|
// g.drawImage(this.group == Group.GOOD ? ImageManger.goodTankL : ImageManger.badTankL, this.x, this.y, null);
|
|
// break;
|
|
// }
|
|
// move();
|
|
// }
|
|
|
|
|
|
@Override
|
|
public void paint(Graphics g) {
|
|
System.out.println("tank paint");
|
|
if (!living) {
|
|
tankFrame.tanks.remove(this);
|
|
moving = false;
|
|
return;
|
|
}
|
|
switch (this.dir) {
|
|
case DOWN:
|
|
g.drawImage(this.group == Group.GOOD ? ImageManger.goodTankD : ImageManger.badTankD, this.x, this.y, null);
|
|
break;
|
|
case UP:
|
|
g.drawImage(this.group == Group.GOOD ? ImageManger.goodTankU : ImageManger.badTankU, this.x, this.y, null);
|
|
break;
|
|
case RIGHT:
|
|
g.drawImage(this.group == Group.GOOD ? ImageManger.goodTankR : ImageManger.badTankR, this.x, this.y, null);
|
|
break;
|
|
case LEFT:
|
|
g.drawImage(this.group == Group.GOOD ? ImageManger.goodTankL : ImageManger.badTankL, this.x, this.y, null);
|
|
break;
|
|
}
|
|
move();
|
|
}
|
|
|
|
public void move() {
|
|
if (!living) return;
|
|
if (!this.moving) return;
|
|
switch (dir) {
|
|
case LEFT:
|
|
x -= speed;
|
|
break;
|
|
case RIGHT:
|
|
x += speed;
|
|
break;
|
|
case UP:
|
|
y -= speed;
|
|
break;
|
|
case DOWN:
|
|
y += speed;
|
|
break;
|
|
}
|
|
if (group == Group.BAD && random.nextInt(100) > 95)
|
|
this.fire();
|
|
|
|
if (this.group == Group.BAD && random.nextInt(100) > 95)
|
|
this.randomDir();
|
|
|
|
boundsCheck();
|
|
if (group == Group.GOOD) {
|
|
new Thread(() -> {
|
|
new Audio("audio/tank_move.wav").play();
|
|
}).start();
|
|
}
|
|
}
|
|
|
|
private void boundsCheck() {
|
|
if (this.x < 0) x = TankFrame.GAME_WIDTH - Tank.tankWidth;
|
|
if (this.y < 28) y = TankFrame.GAME_HEIGHT - Tank.tankHeight;
|
|
if (this.x > TankFrame.GAME_WIDTH - tankWidth) x = 0;
|
|
if (this.y > TankFrame.GAME_HEIGHT - tankHeight) y = 28;
|
|
}
|
|
|
|
//0.4几率的随机方向
|
|
private void randomDir() {
|
|
if (random.nextInt(100) > 60)
|
|
this.dir = Dir.values()[random.nextInt(4)];
|
|
}
|
|
|
|
/**
|
|
* 开火
|
|
*/
|
|
public void fire() {
|
|
//fs.fire(this);
|
|
int bx = this.getX() + Tank.tankWidth / 2 - ImageManger.bulletD.getWidth() / 2;
|
|
int by = this.getY() + Tank.tankHeight / 2 - ImageManger.bulletD.getHeight() / 2;
|
|
switch (this.dir) {
|
|
case DOWN:
|
|
new Bullet(bx, by + 6, this.dir, this.getGroup(), this.tankFrame);
|
|
new Bullet(bx, by - 6, this.dir, this.getGroup(), this.tankFrame);
|
|
break;
|
|
case UP:
|
|
new Bullet(bx + 1, by + 6, this.dir, this.getGroup(), this.tankFrame);
|
|
new Bullet(bx + 1, by - 6, this.dir, this.getGroup(), this.tankFrame);
|
|
break;
|
|
case LEFT:
|
|
new Bullet(bx + 6, by, this.dir, this.getGroup(), this.tankFrame);
|
|
new Bullet(bx - 6, by, this.dir, this.getGroup(), this.tankFrame);
|
|
break;
|
|
case RIGHT:
|
|
new Bullet(bx + 6, by + 1, this.dir, this.getGroup(), this.tankFrame);
|
|
new Bullet(bx - 6, by + 1, this.dir, this.getGroup(), this.tankFrame);
|
|
break;
|
|
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void die() {
|
|
this.living = false;
|
|
}
|
|
}
|