From 91f4e9d149d4cfb680a7f09104a3cabadab7a7cc Mon Sep 17 00:00:00 2001 From: terry <724796052@qq.com> Date: Fri, 1 Jul 2022 09:28:45 +0800 Subject: [PATCH] =?UTF-8?q?=E8=A3=85=E9=A5=B0=E5=99=A8=E6=A8=A1=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/坦克大战笔记.docx | Bin 79769 -> 80112 bytes src/com/demo/tank/course9/Bullet.java | 32 ++++++--- .../demo/tank/course9/BulletTankCollider.java | 14 ++-- .../demo/tank/course9/BulletWallCollider.java | 8 +-- src/com/demo/tank/course9/ColliderChain.java | 6 +- .../tank/course9/DefaultFireStrategy.java | 12 +++- src/com/demo/tank/course9/Explode.java | 12 +++- .../course9/FourDirectionFireStrategy.java | 6 +- src/com/demo/tank/course9/GODecorator.java | 13 ++++ src/com/demo/tank/course9/GameModel.java | 32 ++++----- src/com/demo/tank/course9/GameObject.java | 5 ++ src/com/demo/tank/course9/MainV9.java | 2 +- src/com/demo/tank/course9/RectDecorator.java | 32 +++++++++ src/com/demo/tank/course9/TailDecorator.java | 31 +++++++++ src/com/demo/tank/course9/Tank.java | 63 ++++++++++-------- src/com/demo/tank/course9/TankFrameV9.java | 36 +++++----- .../demo/tank/course9/TankTankCollider.java | 7 +- .../demo/tank/course9/TankWallCollider.java | 10 +-- src/com/demo/tank/course9/Wall.java | 10 ++- 19 files changed, 229 insertions(+), 102 deletions(-) create mode 100644 src/com/demo/tank/course9/GODecorator.java create mode 100644 src/com/demo/tank/course9/RectDecorator.java create mode 100644 src/com/demo/tank/course9/TailDecorator.java diff --git a/docs/坦克大战笔记.docx b/docs/坦克大战笔记.docx index e0753c6a1ab40d6c359fc87d3b82dd8da9712bda..447d4abfbd191b0c2aa4adc4dec9f80b5f8d9b0b 100644 GIT binary patch delta 15060 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 XgKrQf2@qkYu5p7OCrl&u3 diff --git a/src/com/demo/tank/course9/Bullet.java b/src/com/demo/tank/course9/Bullet.java index 902efe2..897f441 100644 --- a/src/com/demo/tank/course9/Bullet.java +++ b/src/com/demo/tank/course9/Bullet.java @@ -7,7 +7,6 @@ import com.demo.tank.util.ResourceManager; import java.awt.*; public class Bullet extends GameObject { - private int x, y; private Direction direction; private static final int SPEED = 10; public static final int WIDTH = ResourceManager.bulletD.getWidth(); @@ -29,11 +28,11 @@ public class Bullet extends GameObject { GameModel.getInstance().add(this); } - public void paint(Graphics g){ - if(!live){ + public void paint(Graphics g) { + if (!live) { GameModel.getInstance().remove(this); } - switch (direction){ + switch (direction) { case UP: g.drawImage(ResourceManager.bulletU, x, y, null); break; @@ -51,19 +50,23 @@ public class Bullet extends GameObject { } private void move() { - switch (direction){ - case UP: y -= SPEED; + switch (direction) { + case UP: + y -= SPEED; break; - case DOWN: y += SPEED; + case DOWN: + y += SPEED; break; - case LEFT: x -= SPEED; + case LEFT: + x -= SPEED; break; - case RIGHT: x += SPEED; + case RIGHT: + x += SPEED; break; default: break; } - if(x < 0 || y < 0 || x > TankFrameV9.GAME_WIDTH || y > TankFrameV9.GAME_HEIGHT){ + if (x < 0 || y < 0 || x > TankFrameV9.GAME_WIDTH || y > TankFrameV9.GAME_HEIGHT) { live = false; } rect.x = this.x; @@ -114,4 +117,13 @@ public class Bullet extends GameObject { this.group = group; } + @Override + public int getWidth() { + return WIDTH; + } + + @Override + public int getHeight() { + return HEIGHT; + } } diff --git a/src/com/demo/tank/course9/BulletTankCollider.java b/src/com/demo/tank/course9/BulletTankCollider.java index d943f8f..830199b 100644 --- a/src/com/demo/tank/course9/BulletTankCollider.java +++ b/src/com/demo/tank/course9/BulletTankCollider.java @@ -3,22 +3,22 @@ package com.demo.tank.course9; public class BulletTankCollider implements Collider { @Override public void collide(GameObject g1, GameObject g2) { - if(g1 instanceof Bullet && g2 instanceof Tank){ + if (g1 instanceof Bullet && g2 instanceof Tank) { Bullet b = (Bullet) g1; Tank t = (Tank) g2; //关闭队友伤害 - if(b.getGroup() == t.getGroup()) return; - if(b.rect.intersects(t.rect)){ + if (b.getGroup() == t.getGroup()) return; + if (b.rect.intersects(t.rect)) { t.die(); b.die(); //爆炸 - int ex = t.getX() + Tank.WIDTH/2 - Explode.WIDTH/2; - int ey = t.getY() + Tank.HEIGHT/2 - Explode.HEIGHT/2; + int ex = t.getX() + Tank.WIDTH / 2 - Explode.WIDTH / 2; + int ey = t.getY() + Tank.HEIGHT / 2 - Explode.HEIGHT / 2; GameModel.getInstance().add(new Explode(ex, ey)); } - }else if(g1 instanceof Tank && g2 instanceof Bullet){ + } else if (g1 instanceof Tank && g2 instanceof Bullet) { collide(g2, g1); - }else{ + } else { return; } } diff --git a/src/com/demo/tank/course9/BulletWallCollider.java b/src/com/demo/tank/course9/BulletWallCollider.java index 3071f20..7af4ca5 100644 --- a/src/com/demo/tank/course9/BulletWallCollider.java +++ b/src/com/demo/tank/course9/BulletWallCollider.java @@ -3,15 +3,15 @@ package com.demo.tank.course9; public class BulletWallCollider implements Collider { @Override public void collide(GameObject g1, GameObject g2) { - if(g1 instanceof Bullet && g2 instanceof Wall){ + if (g1 instanceof Bullet && g2 instanceof Wall) { Bullet b = (Bullet) g1; Wall w = (Wall) g2; - if(b.rect.intersects(w.rect)){ + if (b.rect.intersects(w.rect)) { b.die(); } - }else if(g1 instanceof Wall && g2 instanceof Bullet){ + } else if (g1 instanceof Wall && g2 instanceof Bullet) { collide(g2, g1); - }else{ + } else { return; } } diff --git a/src/com/demo/tank/course9/ColliderChain.java b/src/com/demo/tank/course9/ColliderChain.java index 3ed6a94..99d2af2 100644 --- a/src/com/demo/tank/course9/ColliderChain.java +++ b/src/com/demo/tank/course9/ColliderChain.java @@ -6,19 +6,19 @@ import java.util.List; public class ColliderChain { private List colliders = new LinkedList<>(); - public ColliderChain(){ + public ColliderChain() { add(new BulletTankCollider()); add(new TankTankCollider()); add(new BulletWallCollider()); add(new TankWallCollider()); } - public void add(Collider collider){ + public void add(Collider collider) { colliders.add(collider); } public void collide(GameObject g1, GameObject g2) { - for (Collider c : colliders){ + for (Collider c : colliders) { c.collide(g1, g2); } } diff --git a/src/com/demo/tank/course9/DefaultFireStrategy.java b/src/com/demo/tank/course9/DefaultFireStrategy.java index ec2d86d..6e6eb4f 100644 --- a/src/com/demo/tank/course9/DefaultFireStrategy.java +++ b/src/com/demo/tank/course9/DefaultFireStrategy.java @@ -6,9 +6,15 @@ import com.demo.tank.util.Audio; public class DefaultFireStrategy implements FireStrategy { @Override public void fire(Tank tank) { - int bx = tank.getX() + Tank.WIDTH/2 - Bullet.WIDTH/2; - int by = tank.getY() + Tank.HEIGHT/2 - Bullet.HEIGHT/2; - new Bullet(bx, by, tank.getDir(), tank.getGroup()); + int bx = tank.getX() + Tank.WIDTH / 2 - Bullet.WIDTH / 2; + int by = tank.getY() + Tank.HEIGHT / 2 - Bullet.HEIGHT / 2; +// new Bullet(bx, by, tank.getDir(), tank.getGroup()); +// GameModel.getInstance().add(new RectDecorator(new Bullet(bx, by, tank.getDir(), tank.getGroup()))); + GameModel.getInstance().add(new RectDecorator( + new TailDecorator( + new Bullet(bx, by, tank.getDir(), tank.getGroup()) + ) + )); if (tank.getGroup() == Group.GOOD) new Thread(() -> new Audio("audio/tank_fire.wav").play()).start(); } } diff --git a/src/com/demo/tank/course9/Explode.java b/src/com/demo/tank/course9/Explode.java index 3a8c16d..5cbe9c8 100644 --- a/src/com/demo/tank/course9/Explode.java +++ b/src/com/demo/tank/course9/Explode.java @@ -6,7 +6,6 @@ import com.demo.tank.util.ResourceManager; import java.awt.*; public class Explode extends GameObject { - private int x, y; public static final int WIDTH = ResourceManager.explodes[0].getWidth(); public static final int HEIGHT = ResourceManager.explodes[0].getHeight(); @@ -18,9 +17,9 @@ public class Explode extends GameObject { new Thread(() -> new Audio("audio/explode.wav").play()).start(); } - public void paint(Graphics g){ + public void paint(Graphics g) { g.drawImage(ResourceManager.explodes[step++], x, y, null); - if(step >= ResourceManager.explodes.length){ + if (step >= ResourceManager.explodes.length) { //播放完爆炸效果图片, remove GameModel.getInstance().remove(this); } @@ -42,4 +41,11 @@ public class Explode extends GameObject { this.y = y; } + public int getWidth() { + return WIDTH; + } + + public int getHeight() { + return HEIGHT; + } } diff --git a/src/com/demo/tank/course9/FourDirectionFireStrategy.java b/src/com/demo/tank/course9/FourDirectionFireStrategy.java index 0b508d1..567665c 100644 --- a/src/com/demo/tank/course9/FourDirectionFireStrategy.java +++ b/src/com/demo/tank/course9/FourDirectionFireStrategy.java @@ -7,9 +7,9 @@ import com.demo.tank.util.Audio; public class FourDirectionFireStrategy implements FireStrategy { @Override public void fire(Tank tank) { - int bx = tank.getX() + Tank.WIDTH/2 - Bullet.WIDTH/2; - int by = tank.getY() + Tank.HEIGHT/2 - Bullet.HEIGHT/2; - for(Direction direction : Direction.values()){ + int bx = tank.getX() + Tank.WIDTH / 2 - Bullet.WIDTH / 2; + int by = tank.getY() + Tank.HEIGHT / 2 - Bullet.HEIGHT / 2; + for (Direction direction : Direction.values()) { new Bullet(bx, by, direction, tank.getGroup()); } if (tank.getGroup() == Group.GOOD) new Thread(() -> new Audio("audio/tank_fire.wav").play()).start(); diff --git a/src/com/demo/tank/course9/GODecorator.java b/src/com/demo/tank/course9/GODecorator.java new file mode 100644 index 0000000..86dbd86 --- /dev/null +++ b/src/com/demo/tank/course9/GODecorator.java @@ -0,0 +1,13 @@ +package com.demo.tank.course9; + +import java.awt.*; + +public abstract class GODecorator extends GameObject { + GameObject go; + + public GODecorator(GameObject go) { + this.go = go; + } + + public abstract void paint(Graphics g); +} diff --git a/src/com/demo/tank/course9/GameModel.java b/src/com/demo/tank/course9/GameModel.java index 1e05609..9afa2ea 100644 --- a/src/com/demo/tank/course9/GameModel.java +++ b/src/com/demo/tank/course9/GameModel.java @@ -10,25 +10,27 @@ import java.util.List; public class GameModel { private static final GameModel GM = new GameModel(); + static { GM.init(); } private List gameObjects = new ArrayList<>(); -// Collider collider = new BulletTankCollider(); + // Collider collider = new BulletTankCollider(); // Collider collider2 = new TankTankCollider(); ColliderChain chain = new ColliderChain(); Tank tank; - private GameModel(){ + private GameModel() { } - private void init(){ + + private void init() { tank = new Tank(380, 660, Direction.UP, Group.GOOD); int enemyTankNum = PropertyManager.getInt("enemy.tank.number"); - for(int i = 0; i < enemyTankNum; i++){ - add(new Tank(50 + i*80, 200, Direction.DOWN, Group.BAD)); + for (int i = 0; i < enemyTankNum; i++) { + add(new Tank(50 + i * 80, 200, Direction.DOWN, Group.BAD)); } add(new Wall(150, 150, 200, 50)); add(new Wall(550, 150, 200, 50)); @@ -36,31 +38,31 @@ public class GameModel { add(new Wall(550, 300, 50, 200)); } - public static GameModel getInstance(){ + public static GameModel getInstance() { return GM; } - public void add(GameObject go){ + public void add(GameObject go) { gameObjects.add(go); } - public void remove(GameObject go){ + public void remove(GameObject go) { gameObjects.remove(go); } - public void paint(Graphics g){ + public void paint(Graphics g) { tank.paint(g); - for(int i = 0; i< gameObjects.size(); i++){ + for (int i = 0; i < gameObjects.size(); i++) { gameObjects.get(i).paint(g); } //碰撞检测 - for(int i = 0; i< gameObjects.size(); i++){ - for(int j=i+1; j< gameObjects.size(); j++){ - GameObject g1 = gameObjects.get(i); - GameObject g2 = gameObjects.get(j); - chain.collide(g1, g2); + for (int i = 0; i < gameObjects.size(); i++) { + for (int j = i + 1; j < gameObjects.size(); j++) { + GameObject g1 = gameObjects.get(i); + GameObject g2 = gameObjects.get(j); + chain.collide(g1, g2); } } } diff --git a/src/com/demo/tank/course9/GameObject.java b/src/com/demo/tank/course9/GameObject.java index 21dce58..aad2061 100644 --- a/src/com/demo/tank/course9/GameObject.java +++ b/src/com/demo/tank/course9/GameObject.java @@ -4,5 +4,10 @@ import java.awt.*; public abstract class GameObject { int x, y; + public abstract void paint(Graphics g); + + public abstract int getWidth(); + + public abstract int getHeight(); } diff --git a/src/com/demo/tank/course9/MainV9.java b/src/com/demo/tank/course9/MainV9.java index 38064b2..dc8fc4a 100644 --- a/src/com/demo/tank/course9/MainV9.java +++ b/src/com/demo/tank/course9/MainV9.java @@ -8,7 +8,7 @@ public class MainV9 { // new Thread(() -> new Audio("audio/war1.wav").loop()).start(); - while (true){ + while (true) { Thread.sleep(50); tf.repaint(); } diff --git a/src/com/demo/tank/course9/RectDecorator.java b/src/com/demo/tank/course9/RectDecorator.java new file mode 100644 index 0000000..feddb5e --- /dev/null +++ b/src/com/demo/tank/course9/RectDecorator.java @@ -0,0 +1,32 @@ +package com.demo.tank.course9; + +import java.awt.*; + +public class RectDecorator extends GODecorator { + + public RectDecorator(GameObject go) { + super(go); + } + + @Override + public void paint(Graphics g) { + //decorator x,y 也要跟随游戏物体 变化 + this.x = go.x; + this.y = go.y; + go.paint(g); + Color c = g.getColor(); + g.setColor(Color.MAGENTA); + g.drawRect(go.x, go.y, getWidth(), getHeight()); + g.setColor(c); + } + + @Override + public int getWidth() { + return super.go.getWidth(); + } + + @Override + public int getHeight() { + return super.go.getHeight(); + } +} diff --git a/src/com/demo/tank/course9/TailDecorator.java b/src/com/demo/tank/course9/TailDecorator.java new file mode 100644 index 0000000..d71eac3 --- /dev/null +++ b/src/com/demo/tank/course9/TailDecorator.java @@ -0,0 +1,31 @@ +package com.demo.tank.course9; + +import java.awt.*; + +public class TailDecorator extends GODecorator { + + public TailDecorator(GameObject go) { + super(go); + } + + @Override + public void paint(Graphics g) { + go.paint(g); + this.x = go.x; + this.y = go.y; + Color c = g.getColor(); + g.setColor(Color.WHITE); + g.drawLine(go.x, go.y, go.x + getWidth(), go.y + getHeight()); + g.setColor(c); + } + + @Override + public int getWidth() { + return super.go.getWidth(); + } + + @Override + public int getHeight() { + return super.go.getHeight(); + } +} diff --git a/src/com/demo/tank/course9/Tank.java b/src/com/demo/tank/course9/Tank.java index 2e36d22..0ba0019 100644 --- a/src/com/demo/tank/course9/Tank.java +++ b/src/com/demo/tank/course9/Tank.java @@ -8,7 +8,6 @@ import java.awt.*; import java.util.Random; public class Tank extends GameObject { - private int x,y; int oldX, oldY; private Direction dir; private static final int SPEED = 8; @@ -33,7 +32,7 @@ public class Tank extends GameObject { rect.width = Tank.WIDTH; rect.height = Tank.HEIGHT; - if(this.group == Group.GOOD) { + if (this.group == Group.GOOD) { // String className = PropertyManager.getString("good.tank.fire.strategy"); try { fireStrategy = (FireStrategy) Class.forName("com.demo.tank.course9.FourDirectionFireStrategy").newInstance(); @@ -42,24 +41,24 @@ public class Tank extends GameObject { } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { - e.printStackTrace(); + e.printStackTrace(); } - }else if(this.group == Group.BAD) fireStrategy = new DefaultFireStrategy(); + } else if (this.group == Group.BAD) fireStrategy = new DefaultFireStrategy(); } @Override public void paint(Graphics g) { - if(!living) GameModel.getInstance().remove(this); + if (!living) GameModel.getInstance().remove(this); //根据方向绘制坦克 - switch (dir){ + switch (dir) { case UP: g.drawImage(this.group == Group.GOOD ? ResourceManager.tankU : ResourceManager.badTankU, x, y, null); - break; + break; case DOWN: g.drawImage(this.group == Group.GOOD ? ResourceManager.tankD : ResourceManager.badTankD, x, y, null); break; case LEFT: - g.drawImage(this.group == Group.GOOD ? ResourceManager.tankL: ResourceManager.badTankL, x, y, null); + g.drawImage(this.group == Group.GOOD ? ResourceManager.tankL : ResourceManager.badTankL, x, y, null); break; case RIGHT: g.drawImage(this.group == Group.GOOD ? ResourceManager.tankR : ResourceManager.badTankR, x, y, null); @@ -68,28 +67,32 @@ public class Tank extends GameObject { move(); } - public void move(){ + public void move() { oldX = x; oldY = y; //如果没有移动 return - if(!moving) return; - switch (dir){ - case UP: y -= SPEED; + if (!moving) return; + switch (dir) { + case UP: + y -= SPEED; break; - case DOWN: y += SPEED; + case DOWN: + y += SPEED; break; - case LEFT: x -= SPEED; + case LEFT: + x -= SPEED; break; - case RIGHT: x += SPEED; + case RIGHT: + x += SPEED; break; default: break; } - if(this.group == Group.BAD) { - if(random.nextInt(10) == 5){ + if (this.group == Group.BAD) { + if (random.nextInt(10) == 5) { this.fire(); } - if(random.nextInt(100) > 95){ + if (random.nextInt(100) > 95) { this.randomDirection(); } } @@ -101,27 +104,27 @@ public class Tank extends GameObject { rect.y = this.y; } - public void back(){ + public void back() { this.x = oldX; this.y = oldY; } private void boundsCheck() { - if(x < 0) x = 0; - if(x > TankFrameV9.GAME_WIDTH - Tank.WIDTH) x = TankFrameV9.GAME_WIDTH - Tank.WIDTH; - if(y < 30) y = 30; //算上菜单条 - if(y > TankFrameV9.GAME_HEIGHT - Tank.HEIGHT) y = TankFrameV9.GAME_HEIGHT - Tank.HEIGHT; + if (x < 0) x = 0; + if (x > TankFrameV9.GAME_WIDTH - Tank.WIDTH) x = TankFrameV9.GAME_WIDTH - Tank.WIDTH; + if (y < 30) y = 30; //算上菜单条 + if (y > TankFrameV9.GAME_HEIGHT - Tank.HEIGHT) y = TankFrameV9.GAME_HEIGHT - Tank.HEIGHT; } private void randomDirection() { - this.dir = Direction.values()[random.nextInt(4)]; + this.dir = Direction.values()[random.nextInt(4)]; } public void fire() { - fireStrategy.fire(this); + fireStrategy.fire(this); } - public void die(){ + public void die() { this.living = false; } @@ -181,4 +184,12 @@ public class Tank extends GameObject { this.rect = rect; } + public int getWidth() { + return WIDTH; + } + + public int getHeight() { + return HEIGHT; + } + } diff --git a/src/com/demo/tank/course9/TankFrameV9.java b/src/com/demo/tank/course9/TankFrameV9.java index 29ec300..29d4a9f 100644 --- a/src/com/demo/tank/course9/TankFrameV9.java +++ b/src/com/demo/tank/course9/TankFrameV9.java @@ -14,9 +14,9 @@ public class TankFrameV9 extends Frame { public static final int GAME_HEIGHT = 800; Image image = null; - public TankFrameV9(){ + public TankFrameV9() { setVisible(true); - setBounds(400, 100 , GAME_WIDTH, GAME_HEIGHT); + setBounds(400, 100, GAME_WIDTH, GAME_HEIGHT); setResizable(false); setTitle("tank war"); this.addKeyListener(new MyKeyListener()); @@ -30,24 +30,24 @@ public class TankFrameV9 extends Frame { @Override public void update(Graphics g) { - if(image == null){ + if (image == null) { image = this.createImage(GAME_WIDTH, GAME_HEIGHT); } - Graphics imgGraphic = image.getGraphics(); + Graphics imgGraphic = image.getGraphics(); Color color = g.getColor(); imgGraphic.setColor(Color.BLACK); - imgGraphic.fillRect(0,0, GAME_WIDTH, GAME_HEIGHT); + imgGraphic.fillRect(0, 0, GAME_WIDTH, GAME_HEIGHT); imgGraphic.setColor(color); paint(imgGraphic); g.drawImage(image, 0, 0, null); } @Override - public void paint(Graphics g){ + public void paint(Graphics g) { gm.paint(g); } - class MyKeyListener extends KeyAdapter{ + class MyKeyListener extends KeyAdapter { boolean bL = false; boolean bR = false; boolean bU = false; @@ -55,7 +55,7 @@ public class TankFrameV9 extends Frame { @Override public void keyPressed(KeyEvent e) { - switch (e.getKeyCode()){ + switch (e.getKeyCode()) { case KeyEvent.VK_A: bL = true; break; @@ -63,8 +63,8 @@ public class TankFrameV9 extends Frame { bR = true; break; case KeyEvent.VK_W: - bU = true; - break; + bU = true; + break; case KeyEvent.VK_S: bD = true; break; @@ -76,7 +76,7 @@ public class TankFrameV9 extends Frame { @Override public void keyReleased(KeyEvent e) { - switch (e.getKeyCode()){ + switch (e.getKeyCode()) { case KeyEvent.VK_A: bL = false; break; @@ -98,15 +98,15 @@ public class TankFrameV9 extends Frame { setTankDirection(); } - public void setTankDirection(){ - if(!bL && !bR && !bU && !bD){ + public void setTankDirection() { + if (!bL && !bR && !bU && !bD) { gm.tank.setMoving(false); - }else{ + } else { gm.tank.setMoving(true); - if(bL) gm.tank.setDir(Direction.LEFT); - if(bR) gm.tank.setDir(Direction.RIGHT); - if(bU) gm.tank.setDir(Direction.UP); - if(bD) gm.tank.setDir(Direction.DOWN); + if (bL) gm.tank.setDir(Direction.LEFT); + if (bR) gm.tank.setDir(Direction.RIGHT); + if (bU) gm.tank.setDir(Direction.UP); + if (bD) gm.tank.setDir(Direction.DOWN); } } } diff --git a/src/com/demo/tank/course9/TankTankCollider.java b/src/com/demo/tank/course9/TankTankCollider.java index 310016a..b2101b0 100644 --- a/src/com/demo/tank/course9/TankTankCollider.java +++ b/src/com/demo/tank/course9/TankTankCollider.java @@ -4,17 +4,18 @@ import java.util.Random; public class TankTankCollider implements Collider { Random random = new Random(); + @Override public void collide(GameObject g1, GameObject g2) { - if(g1 instanceof Tank && g2 instanceof Tank){ + if (g1 instanceof Tank && g2 instanceof Tank) { Tank t1 = (Tank) g1; Tank t2 = (Tank) g2; - if(t1.rect.intersects(t2.rect)){ + if (t1.rect.intersects(t2.rect)) { // simple deal t1.back(); t2.back(); } - }else{ + } else { return; } } diff --git a/src/com/demo/tank/course9/TankWallCollider.java b/src/com/demo/tank/course9/TankWallCollider.java index 773713d..f685938 100644 --- a/src/com/demo/tank/course9/TankWallCollider.java +++ b/src/com/demo/tank/course9/TankWallCollider.java @@ -1,17 +1,17 @@ package com.demo.tank.course9; -public class TankWallCollider implements Collider{ +public class TankWallCollider implements Collider { @Override public void collide(GameObject g1, GameObject g2) { - if(g1 instanceof Tank && g2 instanceof Wall){ + if (g1 instanceof Tank && g2 instanceof Wall) { Tank t = (Tank) g1; Wall w = (Wall) g2; - if(t.rect.intersects(w.rect)){ + if (t.rect.intersects(w.rect)) { t.back(); } - }else if(g1 instanceof Wall && g2 instanceof Bullet){ + } else if (g1 instanceof Wall && g2 instanceof Bullet) { collide(g2, g1); - }else{ + } else { return; } } diff --git a/src/com/demo/tank/course9/Wall.java b/src/com/demo/tank/course9/Wall.java index 60910db..f94fb0d 100644 --- a/src/com/demo/tank/course9/Wall.java +++ b/src/com/demo/tank/course9/Wall.java @@ -2,7 +2,7 @@ package com.demo.tank.course9; import java.awt.*; -public class Wall extends GameObject{ +public class Wall extends GameObject { int width, height; Rectangle rect; @@ -21,4 +21,12 @@ public class Wall extends GameObject{ g.fillRect(x, y, width, height); g.setColor(c); } + + public int getWidth() { + return width; + } + + public int getHeight() { + return height; + } }