diff --git a/docs/坦克大战笔记.docx b/docs/坦克大战笔记.docx index e1d5c20..e411e9b 100644 Binary files a/docs/坦克大战笔记.docx and b/docs/坦克大战笔记.docx differ diff --git a/src/com/demo/tank/course8/Bullet.java b/src/com/demo/tank/course8/Bullet.java index 70372ca..00b1e41 100644 --- a/src/com/demo/tank/course8/Bullet.java +++ b/src/com/demo/tank/course8/Bullet.java @@ -6,7 +6,7 @@ import com.demo.tank.util.ResourceManager; import java.awt.*; -public class Bullet { +public class Bullet extends GameObject{ private int x, y; private Direction direction; private static final int SPEED = 10; @@ -28,12 +28,12 @@ public class Bullet { rect.y = this.y; rect.width = Bullet.WIDTH; rect.height = Bullet.HEIGHT; - gm.bullets.add(this); + gm.add(this); } public void paint(Graphics g){ if(!live){ - gm.bullets.remove(this); + gm.remove(this); } switch (direction){ case UP: @@ -82,7 +82,7 @@ public class Bullet { //爆炸 int ex = tank.getX() + Tank.WIDTH/2 - Explode.WIDTH/2; int ey = tank.getY() + Tank.HEIGHT/2 - Explode.HEIGHT/2; - gm.explodes.add(new Explode(ex, ey , gm)); + gm.add(new Explode(ex, ey , gm)); } } diff --git a/src/com/demo/tank/course8/BulletTankCollider.java b/src/com/demo/tank/course8/BulletTankCollider.java new file mode 100644 index 0000000..adeaec1 --- /dev/null +++ b/src/com/demo/tank/course8/BulletTankCollider.java @@ -0,0 +1,16 @@ +package com.demo.tank.course8; + +public class BulletTankCollider implements Collider{ + @Override + public void collide(GameObject g1, GameObject g2) { + if(g1 instanceof Bullet && g2 instanceof Tank){ + Bullet b = (Bullet) g1; + Tank t = (Tank) g2; + b.collideWith(t); + }else if(g1 instanceof Tank && g2 instanceof Bullet){ + collide(g2, g1); + }else{ + return; + } + } +} diff --git a/src/com/demo/tank/course8/Collider.java b/src/com/demo/tank/course8/Collider.java new file mode 100644 index 0000000..89d454f --- /dev/null +++ b/src/com/demo/tank/course8/Collider.java @@ -0,0 +1,5 @@ +package com.demo.tank.course8; + +public interface Collider { + void collide(GameObject g1, GameObject g2); +} diff --git a/src/com/demo/tank/course8/ColliderChain.java b/src/com/demo/tank/course8/ColliderChain.java new file mode 100644 index 0000000..ed82b23 --- /dev/null +++ b/src/com/demo/tank/course8/ColliderChain.java @@ -0,0 +1,23 @@ +package com.demo.tank.course8; + +import java.util.LinkedList; +import java.util.List; + +public class ColliderChain { + private List colliders = new LinkedList<>(); + + public ColliderChain(){ + add(new BulletTankCollider()); + add(new TankTankCollider()); + } + + public void add(Collider collider){ + colliders.add(collider); + } + + public void collide(GameObject g1, GameObject g2) { + for (Collider c : colliders){ + c.collide(g1, g2); + } + } +} diff --git a/src/com/demo/tank/course8/Explode.java b/src/com/demo/tank/course8/Explode.java index e662896..6ddaafc 100644 --- a/src/com/demo/tank/course8/Explode.java +++ b/src/com/demo/tank/course8/Explode.java @@ -5,7 +5,7 @@ import com.demo.tank.util.ResourceManager; import java.awt.*; -public class Explode { +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(); @@ -24,7 +24,7 @@ public class Explode { g.drawImage(ResourceManager.explodes[step++], x, y, null); if(step >= ResourceManager.explodes.length){ //播放完爆炸效果图片, remove - gm.explodes.remove(this); + gm.remove(this); } } diff --git a/src/com/demo/tank/course8/GameModel.java b/src/com/demo/tank/course8/GameModel.java index 70b3380..4fd42ef 100644 --- a/src/com/demo/tank/course8/GameModel.java +++ b/src/com/demo/tank/course8/GameModel.java @@ -10,57 +10,41 @@ import java.util.List; public class GameModel { Tank tank = new Tank(380, 660, Direction.UP, Group.GOOD,this); - // Bullet bullet = new Bullet(520, 440, Direction.UP); - List bullets = new ArrayList(); - List enemyTanks = new ArrayList<>(); + private List gameObjects = new ArrayList<>(); - List explodes = new ArrayList<>(); +// Collider collider = new BulletTankCollider(); +// Collider collider2 = new TankTankCollider(); + ColliderChain chain = new ColliderChain(); public GameModel(){ int enemyTankNum = PropertyManager.getInt("enemy.tank.number"); for(int i = 0; i < enemyTankNum; i++){ - enemyTanks.add(new Tank(50 + i*80, 200, Direction.DOWN, Group.BAD, this)); + add(new Tank(50 + i*80, 200, Direction.DOWN, Group.BAD, this)); } } - public void paint(Graphics g){ - //打印出子弹数量 - Color color = g.getColor(); - g.setColor(Color.WHITE); - g.drawString("当前子弹数量:" + bullets.size(), 60, 50); - g.drawString("当前敌人数量:" + enemyTanks.size(), 60, 80); - g.drawString("当前爆炸数量:" + explodes.size(), 60, 100); - g.setColor(color); + public void add(GameObject go){ + gameObjects.add(go); + } - tank.paint(g); + public void remove(GameObject go){ + gameObjects.remove(go); + } - for(int i = 0; i< enemyTanks.size(); i++){ - enemyTanks.get(i).paint(g); - } + public void paint(Graphics g){ + tank.paint(g); - for (int i = 0; i< bullets.size(); i++){ - bullets.get(i).paint(g); + for(int i = 0; i< gameObjects.size(); i++){ + gameObjects.get(i).paint(g); } //碰撞检测 - for(int i = 0; i< bullets.size(); i++){ - for(int j=0; j< enemyTanks.size(); j++){ - bullets.get(i).collideWith(enemyTanks.get(j)); + 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< explodes.size(); i++){ - explodes.get(i).paint(g); - } -// for(Iterator it = bullets.iterator(); it.hasNext();){ -// Bullet b = it.next(); -// if(!b.isLive()){ -// it.remove(); -// } -// } -// -// for (Bullet b : bullets){ -// b.paint(g); -// } } } diff --git a/src/com/demo/tank/course8/GameObject.java b/src/com/demo/tank/course8/GameObject.java new file mode 100644 index 0000000..b007f7d --- /dev/null +++ b/src/com/demo/tank/course8/GameObject.java @@ -0,0 +1,8 @@ +package com.demo.tank.course8; + +import java.awt.*; + +public abstract class GameObject { + int x, y; + public abstract void paint(Graphics g); +} diff --git a/src/com/demo/tank/course8/Tank.java b/src/com/demo/tank/course8/Tank.java index 30d0533..9a4331b 100644 --- a/src/com/demo/tank/course8/Tank.java +++ b/src/com/demo/tank/course8/Tank.java @@ -7,7 +7,7 @@ import com.demo.tank.util.ResourceManager; import java.awt.*; import java.util.Random; -public class Tank { +public class Tank extends GameObject{ private int x,y; private Direction dir; private static final int SPEED = 8; @@ -38,7 +38,6 @@ public class Tank { // String className = PropertyManager.getString("good.tank.fire.strategy"); try { fireStrategy = (FireStrategy) Class.forName("com.demo.tank.course8.FourDirectionFireStrategy").newInstance(); - System.out.println(fireStrategy); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (InstantiationException e) { @@ -49,8 +48,9 @@ public class Tank { }else if(this.group == Group.BAD) fireStrategy = new DefaultFireStrategy(); } + @Override public void paint(Graphics g) { - if(!living) gm.enemyTanks.remove(this); + if(!living) gm.remove(this); //根据方向绘制坦克 switch (dir){ case UP: diff --git a/src/com/demo/tank/course8/TankTankCollider.java b/src/com/demo/tank/course8/TankTankCollider.java new file mode 100644 index 0000000..33682a8 --- /dev/null +++ b/src/com/demo/tank/course8/TankTankCollider.java @@ -0,0 +1,23 @@ +package com.demo.tank.course8; + +import com.demo.tank.enums.Direction; + +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){ + Tank t1 = (Tank) g1; + Tank t2 = (Tank) g2; + if(t1.rect.intersects(t2.rect)){ + // simple deal + t1.setDir(Direction.values()[random.nextInt(4)]); + t2.setDir(Direction.values()[random.nextInt(4)]); + } + }else{ + return; + } + } +}