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