Java - 放置同一类的线程和其他对象是一个ArrayList

时间:2017-04-12 10:17:25

标签: java multithreading arraylist 2d-games

我正在制作一个基于事件的游戏(基本上,没有while(true)循环:如果没有事件,则没有代码行被执行)。游戏以房间对象为基础,每个房间都有一个包含怪物和战利品对象的ArrayList。

问题是我需要怪物是线程,所以他们会自动在游戏中启动事件(比如跟随玩家并攻击他)。

Monsters和Loot的母亲是相同的:GameObject。因为我花了很多时间用这种方式做游戏(一个用于抢劫和怪物的列表)我想知道是否有办法让两个物体怪物并在同一个列表中掠夺并且仍然将怪物作为线程。 / p>

目前我使用“implements Runnable”方法。我不知道这是不是最好的方式。

谢谢。

编辑:

这是代码。首先是母类,GameObjects

public abstract class GameObjects {

protected int x;
protected int y;
private int height;
private int width;
private Player player; //And then there are all getters and setters.

}

然后怪物类,有各种怪物,像僵尸。

package game.projetdonjon;

public abstract class Monster extends GameObjects implements Runnable {

private char direction;
private int hp;
private boolean alive;
private Player player;

public void getDamage(int p){
    this.hp=p;
    if (this.pv <= 0) {
        this.alive = false;
        System.out.println("The monster is death.");
    }
}

public boolean isAlive() {
    if (isAlive)
        return true;
    else
        return false;
    }
//And then still others getters & setters...
}

僵尸班:

package game.projetdonjon;

public class Zombie extends Monster implements Runnable {

private Thread thread;
private int hp;

public Zombie(int x, int y,Player player) {
    super.setDirection('E');
    this.x = x;
    this.y = y;
    this.hp = 50;
    this.thread = new Thread();
    super.setHeight(50);
    super.setWidth(50);
    super.setHp(hp);
    super.setAlive(true);
    super.setPlayer(player);
}

@Override
public void run() {
    System.out.println("Zombie's runnig, yo!");
    while (true) {
        this.setX(this.getX()+10);
        try {
            thread.sleep(100);
        } catch (Exception e){
            System.out.println(e);
        }
    }

}
}

最后,房间类,它包含怪物和战利品。

package game.projetdonjon;

import java.util.ArrayList;

public class Room {
private ArrayList<GameObjects> roomElements = new ArrayList();
private ArrayList<Door> roomDoors= new ArrayList();
private int roomNumber;

public Piece(int roomNumber){
    this.roomNumber = roomNumber;
    roomElements.add(new Loot(somearguments...));
    roomEleemnts.add(new Thread(new Zombie(50,50,player))); //Here is the 
//problem, as Thread isn't a GameObjects/ doesn't extend GameObjects

}

2 个答案:

答案 0 :(得分:1)

Runnable实现是最好的方法。 但我建议为你的房间对象做两个列表:第一个列表包含怪物(Runnables),第二个列表包含战利品。

答案 1 :(得分:0)

要在ArrayList中使用这两个类,您可以创建一个接口,例如IGameObjects,让两个类实现它。

public interface IGameObjects {

    public void method(); //common method.
}

然后你可以拥有

List<GameObjects> objects = new ArrayList<>();

在GameObject类中。

然后你可以在循环中处理它们:

for (IGameObjects object : gameObjects) {
    object.method();
}