learning/study-tank/src/main/java/com/study/tank/Tank.java

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;
}
}