From 76f7f498126fe2a59a1d203d598d0c4ef8f5a019 Mon Sep 17 00:00:00 2001 From: kn5886348135 <56352848+kn5886348135@users.noreply.github.com> Date: Tue, 29 Nov 2022 15:01:12 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=A2=99=E5=92=8C=E7=A2=B0?= =?UTF-8?q?=E6=92=9E=E7=AD=96=E7=95=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/example/tankbattle/Bullet.java | 10 +++- .../com/example/tankbattle/GameModel.java | 5 ++ .../java/com/example/tankbattle/Tank.java | 10 ++++ .../java/com/example/tankbattle/Wall.java | 52 +++++++++++++++++++ .../tankbattle/cor/BulletWallCollider.java | 25 +++++++++ .../example/tankbattle/cor/ColliderChain.java | 2 + .../tankbattle/cor/TankTankCollider.java | 4 +- .../tankbattle/cor/TankWallCollider.java | 23 ++++++++ 8 files changed, 129 insertions(+), 2 deletions(-) create mode 100644 src/main/java/com/example/tankbattle/Wall.java create mode 100644 src/main/java/com/example/tankbattle/cor/BulletWallCollider.java create mode 100644 src/main/java/com/example/tankbattle/cor/TankWallCollider.java diff --git a/src/main/java/com/example/tankbattle/Bullet.java b/src/main/java/com/example/tankbattle/Bullet.java index e7a4f65..7cdd5d3 100644 --- a/src/main/java/com/example/tankbattle/Bullet.java +++ b/src/main/java/com/example/tankbattle/Bullet.java @@ -39,6 +39,14 @@ public class Bullet extends GameObject{ this.group = group; } + public Rectangle getRect() { + return rect; + } + + public void setRect(Rectangle rect) { + this.rect = rect; + } + @Override public void paint(Graphics g) { if (!living) { @@ -102,7 +110,7 @@ public class Bullet extends GameObject{ return false; } - private void die() { + public void die() { this.living = false; } } diff --git a/src/main/java/com/example/tankbattle/GameModel.java b/src/main/java/com/example/tankbattle/GameModel.java index 7c7696f..8d74db1 100644 --- a/src/main/java/com/example/tankbattle/GameModel.java +++ b/src/main/java/com/example/tankbattle/GameModel.java @@ -27,6 +27,11 @@ public class GameModel { for (int i = 0; i < initTankCount; i++) { add(new Tank(50 + i * 80, 200, Dir.DOWN, Group.BAD, this)); } + + add(new Wall(150, 150, 200, 50)); + add(new Wall(550, 150, 200, 50)); + add(new Wall(500, 300, 200, 50)); + add(new Wall(300, 500, 50, 200)); } public void add(GameObject go) { diff --git a/src/main/java/com/example/tankbattle/Tank.java b/src/main/java/com/example/tankbattle/Tank.java index 480c148..978e37e 100644 --- a/src/main/java/com/example/tankbattle/Tank.java +++ b/src/main/java/com/example/tankbattle/Tank.java @@ -24,6 +24,8 @@ public class Tank extends GameObject{ public Group group = Group.BAD; + int oldX, oldY; + FireStrategy fs; public GameModel gm; @@ -87,6 +89,9 @@ public class Tank extends GameObject{ } private void move() { + oldX=x; + oldY=y; + if (!moving) return; switch (dir) { case LEFT: @@ -175,4 +180,9 @@ public class Tank extends GameObject{ this.moving = false; } + public void back() { + x = oldX; + y = oldY; + } + } diff --git a/src/main/java/com/example/tankbattle/Wall.java b/src/main/java/com/example/tankbattle/Wall.java new file mode 100644 index 0000000..bd8eb01 --- /dev/null +++ b/src/main/java/com/example/tankbattle/Wall.java @@ -0,0 +1,52 @@ +package com.example.tankbattle; + +import java.awt.Color; +import java.awt.Graphics; +import java.awt.Rectangle; + +public class Wall extends GameObject{ + + int w, h; + + public Rectangle rect; + + public int getW() { + return w; + } + + public void setW(int w) { + this.w = w; + } + + public int getH() { + return h; + } + + public void setH(int h) { + this.h = h; + } + + public Rectangle getRect() { + return rect; + } + + public void setRect(Rectangle rect) { + this.rect = rect; + } + + public Wall(int x, int y, int w, int h) { + this.x = x; + this.y = y; + this.w = w; + this.h = h; + this.rect = new Rectangle(x, y, w, h); + } + + @Override + public void paint(Graphics g) { + Color c = g.getColor(); + g.setColor(Color.GRAY); + g.fillRect(x, y, w, h); + g.setColor(c); + } +} diff --git a/src/main/java/com/example/tankbattle/cor/BulletWallCollider.java b/src/main/java/com/example/tankbattle/cor/BulletWallCollider.java new file mode 100644 index 0000000..e6412c7 --- /dev/null +++ b/src/main/java/com/example/tankbattle/cor/BulletWallCollider.java @@ -0,0 +1,25 @@ +package com.example.tankbattle.cor; + +import com.example.tankbattle.Bullet; +import com.example.tankbattle.GameObject; +import com.example.tankbattle.Wall; + +public class BulletWallCollider implements Collider { + + @Override + public boolean collide(GameObject o1, GameObject o2) { + if (o1 instanceof Bullet && o2 instanceof Wall) { + Bullet bullet = (Bullet) o1; + Wall wall = (Wall) o2; + if (bullet.getRect().intersects(wall.getRect())) { + System.out.println("bullet die"); + bullet.die(); + } else if (o1 instanceof Wall && o2 instanceof Bullet) { + return collide(o2, o1); + } + } else { + System.out.println(o1.getClass().getName() + " " + o2.getClass().getName()); + } + return true; + } +} diff --git a/src/main/java/com/example/tankbattle/cor/ColliderChain.java b/src/main/java/com/example/tankbattle/cor/ColliderChain.java index e513a43..dff41c4 100644 --- a/src/main/java/com/example/tankbattle/cor/ColliderChain.java +++ b/src/main/java/com/example/tankbattle/cor/ColliderChain.java @@ -12,6 +12,8 @@ public class ColliderChain implements Collider { public ColliderChain() { add(new BulletTankCollider()); add(new TankTankCollider()); + add(new BulletWallCollider()); + add(new TankWallCollider()); } public void add(Collider c) { diff --git a/src/main/java/com/example/tankbattle/cor/TankTankCollider.java b/src/main/java/com/example/tankbattle/cor/TankTankCollider.java index 08ae70f..3e7bc86 100644 --- a/src/main/java/com/example/tankbattle/cor/TankTankCollider.java +++ b/src/main/java/com/example/tankbattle/cor/TankTankCollider.java @@ -12,8 +12,10 @@ public class TankTankCollider implements Collider { Tank t1 = (Tank) o1; Tank t2 = (Tank) o2; if ( t1.getRect().intersects(t2.getRect())){ - t1.stop(); +// t1.stop(); // t2.stop(); + t1.back(); + t2.back(); } } return true; diff --git a/src/main/java/com/example/tankbattle/cor/TankWallCollider.java b/src/main/java/com/example/tankbattle/cor/TankWallCollider.java new file mode 100644 index 0000000..746bf0e --- /dev/null +++ b/src/main/java/com/example/tankbattle/cor/TankWallCollider.java @@ -0,0 +1,23 @@ +package com.example.tankbattle.cor; + +import com.example.tankbattle.GameObject; +import com.example.tankbattle.Tank; +import com.example.tankbattle.Wall; + +public class TankWallCollider implements Collider { + + + @Override + public boolean collide(GameObject o1, GameObject o2) { + if (o1 instanceof Tank && o2 instanceof Wall) { + Tank tank = (Tank) o1; + Wall wall = (Wall) o2; + if (tank.getRect().intersects(wall.getRect())) { + tank.back(); + } else if (o1 instanceof Wall && o2 instanceof Tank) { + return collide(o2, o1); + } + } + return true; + } +}