From 33989e28eeb837f14d4f72d7ded40e47da696feb Mon Sep 17 00:00:00 2001 From: kn5886348135 <56352848+kn5886348135@users.noreply.github.com> Date: Sat, 26 Nov 2022 16:40:20 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E5=BC=80=E7=81=AB=E7=AD=96?= =?UTF-8?q?=E7=95=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/example/tankbattle/Bullet.java | 2 + .../tankbattle/DefaultFireStrategy.java | 14 +++++++ .../com/example/tankbattle/FireStrategy.java | 5 +++ .../tankbattle/FourDirFireStrategy.java | 17 ++++++++ .../com/example/tankbattle/ResourceMgr.java | 20 ++++----- .../java/com/example/tankbattle/Tank.java | 41 ++++++++++++------- src/main/resources/Config.properties | 5 ++- 7 files changed, 79 insertions(+), 25 deletions(-) create mode 100644 src/main/java/com/example/tankbattle/DefaultFireStrategy.java create mode 100644 src/main/java/com/example/tankbattle/FireStrategy.java create mode 100644 src/main/java/com/example/tankbattle/FourDirFireStrategy.java diff --git a/src/main/java/com/example/tankbattle/Bullet.java b/src/main/java/com/example/tankbattle/Bullet.java index 71065c2..3bfad3e 100644 --- a/src/main/java/com/example/tankbattle/Bullet.java +++ b/src/main/java/com/example/tankbattle/Bullet.java @@ -28,6 +28,8 @@ public class Bullet { rect.y = this.y; rect.width = WIDTH; rect.height = HEIGHT; + + tf.bullets.add(this); } public Group getGroup() { diff --git a/src/main/java/com/example/tankbattle/DefaultFireStrategy.java b/src/main/java/com/example/tankbattle/DefaultFireStrategy.java new file mode 100644 index 0000000..aed7746 --- /dev/null +++ b/src/main/java/com/example/tankbattle/DefaultFireStrategy.java @@ -0,0 +1,14 @@ +package com.example.tankbattle; + +public class DefaultFireStrategy implements FireStrategy { + + @Override + public void fire(Tank t) { + int bX = t.x + Tank.WIDTH/2 - Bullet.WIDTH/2; + int bY = t.y + Tank.HEIGHT/2 - Bullet.HEIGHT/2; + + new Bullet(bX, bY, t.dir, t.group, t.tf); + + if(t.group == Group.GOOD) new Thread(()->new Audio("audio/tank_fire.wav").play()).start(); + } +} diff --git a/src/main/java/com/example/tankbattle/FireStrategy.java b/src/main/java/com/example/tankbattle/FireStrategy.java new file mode 100644 index 0000000..1d546ec --- /dev/null +++ b/src/main/java/com/example/tankbattle/FireStrategy.java @@ -0,0 +1,5 @@ +package com.example.tankbattle; + +public interface FireStrategy { + void fire(Tank Tank); +} diff --git a/src/main/java/com/example/tankbattle/FourDirFireStrategy.java b/src/main/java/com/example/tankbattle/FourDirFireStrategy.java new file mode 100644 index 0000000..3839859 --- /dev/null +++ b/src/main/java/com/example/tankbattle/FourDirFireStrategy.java @@ -0,0 +1,17 @@ +package com.example.tankbattle; + +public class FourDirFireStrategy implements FireStrategy { + + @Override + public void fire(Tank t) { + int bX = t.x + Tank.WIDTH/2 - Bullet.WIDTH/2; + int bY = t.y + Tank.HEIGHT/2 - Bullet.HEIGHT/2; + + Dir[] dirs = Dir.values(); + for(Dir dir : dirs) { + new Bullet(bX, bY, dir, t.group, t.tf); + } + + if(t.group == Group.GOOD) new Thread(()->new Audio("audio/tank_fire.wav").play()).start(); + } +} diff --git a/src/main/java/com/example/tankbattle/ResourceMgr.java b/src/main/java/com/example/tankbattle/ResourceMgr.java index 48d911f..233c1a0 100644 --- a/src/main/java/com/example/tankbattle/ResourceMgr.java +++ b/src/main/java/com/example/tankbattle/ResourceMgr.java @@ -5,22 +5,22 @@ import java.io.IOException; import javax.imageio.ImageIO; public class ResourceMgr { - public static BufferedImage GoodTankL, GoodTankU, GoodTankR, GoodTankD; - public static BufferedImage BadTankL, BadTankU, BadTankR, BadTankD; + public static BufferedImage goodTankL, goodTankU, goodTankR, goodTankD; + public static BufferedImage badTankL, badTankU, badTankR, badTankD; public static BufferedImage bulletL, bulletU,bulletR, bulletD; public static BufferedImage[] explodes = new BufferedImage[16]; static { try { - GoodTankU = ImageIO.read(ResourceMgr.class.getClassLoader().getResourceAsStream("images/GoodTank1.png")); - GoodTankL = ImageUtil.rotateImage(GoodTankU, -90); - GoodTankR = ImageUtil.rotateImage(GoodTankU, 90); - GoodTankD = ImageUtil.rotateImage(GoodTankU, 180); + goodTankU = ImageIO.read(ResourceMgr.class.getClassLoader().getResourceAsStream("images/GoodTank1.png")); + goodTankL = ImageUtil.rotateImage(goodTankU, -90); + goodTankR = ImageUtil.rotateImage(goodTankU, 90); + goodTankD = ImageUtil.rotateImage(goodTankU, 180); - BadTankU = ImageIO.read(ResourceMgr.class.getClassLoader().getResourceAsStream("images/BadTank1.png")); - BadTankL = ImageUtil.rotateImage(BadTankU, -90); - BadTankR = ImageUtil.rotateImage(BadTankU, 90); - BadTankD = ImageUtil.rotateImage(BadTankU, 180); + badTankU = ImageIO.read(ResourceMgr.class.getClassLoader().getResourceAsStream("images/BadTank1.png")); + badTankL = ImageUtil.rotateImage(badTankU, -90); + badTankR = ImageUtil.rotateImage(badTankU, 90); + badTankD = ImageUtil.rotateImage(badTankU, 180); bulletU = ImageIO.read(ResourceMgr.class.getClassLoader().getResourceAsStream("images/bulletU.png")); bulletL = ImageUtil.rotateImage(bulletU, -90); diff --git a/src/main/java/com/example/tankbattle/Tank.java b/src/main/java/com/example/tankbattle/Tank.java index 6d83e50..4741984 100644 --- a/src/main/java/com/example/tankbattle/Tank.java +++ b/src/main/java/com/example/tankbattle/Tank.java @@ -4,26 +4,28 @@ import java.awt.*; import java.util.Random; public class Tank { - private static final int SPEED = 1; + private static final int SPEED = 2; - public static int WIDTH = ResourceMgr.GoodTankD.getWidth(); - public static int HEIGHT = ResourceMgr.GoodTankD.getHeight(); + public static int WIDTH = ResourceMgr.goodTankU.getWidth(); + public static int HEIGHT = ResourceMgr.goodTankU.getHeight(); Rectangle rect = new Rectangle(); private Random random = new Random(); - private int x,y; + public int x,y; - private Dir dir = Dir.DOWN; + public Dir dir = Dir.DOWN; private boolean moving = true; - private TankFrame tf = null; + public TankFrame tf = null; private boolean living = true; - private Group group = Group.BAD; + public Group group = Group.BAD; + + FireStrategy fs; public Tank(int x, int y, Dir dir, Group group, TankFrame tf) { super(); @@ -37,12 +39,23 @@ public class Tank { rect.y = this.y; rect.width = WIDTH; rect.height = HEIGHT; + + if(group == Group.GOOD) { + String goodFSName = PropertyMgr.get("goodFS"); + + try { + fs = (FireStrategy)Class.forName(goodFSName).getDeclaredConstructor().newInstance(); + } catch (Exception e) { + e.printStackTrace(); + } + + } else { + fs = new DefaultFireStrategy(); + } } public void fire(){ - int bX = this.x + Tank.WIDTH / 2 - Bullet.WIDTH / 2; - int bY = this.y + Tank.HEIGHT / 2 - Bullet.HEIGHT / 2; - tf.bullets.add(new Bullet(bX, bY, this.dir, this.group, this.tf)); + fs.fire(this); } public Dir getDir() { @@ -123,16 +136,16 @@ public class Tank { if (!living) tf.tanks.remove(this); switch (dir) { case LEFT: - g.drawImage(this.group == Group.GOOD ? ResourceMgr.GoodTankL : ResourceMgr.BadTankL, x, y, null); + g.drawImage(this.group == Group.GOOD ? ResourceMgr.goodTankL : ResourceMgr.badTankL, x, y, null); break; case UP: - g.drawImage(this.group == Group.GOOD ? ResourceMgr.GoodTankU : ResourceMgr.BadTankU, x, y, null); + g.drawImage(this.group == Group.GOOD ? ResourceMgr.goodTankU : ResourceMgr.badTankU, x, y, null); break; case RIGHT: - g.drawImage(this.group == Group.GOOD ? ResourceMgr.GoodTankR : ResourceMgr.BadTankR, x, y, null); + g.drawImage(this.group == Group.GOOD ? ResourceMgr.goodTankR : ResourceMgr.badTankR, x, y, null); break; case DOWN: - g.drawImage(this.group == Group.GOOD ? ResourceMgr.GoodTankD : ResourceMgr.BadTankD, x, y, null); + g.drawImage(this.group == Group.GOOD ? ResourceMgr.goodTankD : ResourceMgr.badTankD, x, y, null); break; default: break; diff --git a/src/main/resources/Config.properties b/src/main/resources/Config.properties index e4efb82..41786f6 100644 --- a/src/main/resources/Config.properties +++ b/src/main/resources/Config.properties @@ -3,4 +3,7 @@ initTankCount=10 tankSpeed=5 bulletSpeed=10 gameWidth=1080 -gameHeight=720 \ No newline at end of file +gameHeight=720 +#fireStrategy +goodFS=com.mashibing.tank.FourDirFireStrategy +badFS=com.mashibing.tank.DefaultFireStrategy \ No newline at end of file