master
terry 3 years ago
parent 57e9bd49a1
commit ba22a013c2

Binary file not shown.

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

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

@ -0,0 +1,5 @@
package com.demo.tank.course8;
public interface Collider {
void collide(GameObject g1, GameObject g2);
}

@ -0,0 +1,23 @@
package com.demo.tank.course8;
import java.util.LinkedList;
import java.util.List;
public class ColliderChain {
private List<Collider> 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);
}
}
}

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

@ -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<Bullet> bullets = new ArrayList();
List<Tank> enemyTanks = new ArrayList<>();
private List<GameObject> gameObjects = new ArrayList<>();
List<Explode> 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<Bullet> it = bullets.iterator(); it.hasNext();){
// Bullet b = it.next();
// if(!b.isLive()){
// it.remove();
// }
// }
//
// for (Bullet b : bullets){
// b.paint(g);
// }
}
}

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

@ -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:

@ -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;
}
}
}
Loading…
Cancel
Save