Java - 将扩展同一类的线程和其他对象放入 ArrayList

标签 java multithreading arraylist 2d-games

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

问题是我需要怪物成为线程,这样它们就会自动在游戏中发起事件(比如跟随玩家并攻击他)。

Monsters 和 Loot 的母类是相同的:GameObject。由于我花了很多时间以这种方式玩游戏(一个战利品和怪物列表),我想知道是否有一种方法可以让两个对象怪物和战利品在同一个列表中,并且仍然将怪物作为线程。

目前我使用“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.

}

然后是Monster类,有各种各样的怪物,比如僵尸。

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

}

最佳答案

Runnable 实现是最好的方式。 但我建议为您的房间对象创建两个列表:第一个列表包含怪物(可运行),第二个列表包含战利品。

关于Java - 将扩展同一类的线程和其他对象放入 ArrayList,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43366724/

相关文章:

multithreading - Rust By Example 中的 channel 如何工作?

java - 基于数组列表 d 对数组列表 a、b、c 进行排序

java - 编程新手,Java.lang.NullPointerException 与 ArrayList

java - @RefreshScope 可以渴望吗

c# - 我应该使用 ThreadPools 还是 Task Parallel Library 来进行 IO 绑定(bind)操作

java - 多线程,读取多个文件并并行发送到服务器

java - Android ArrayList 的 IndexOutOfBoundsException

java - 在 Unix 命令行中编译并运行 netbeans GUI 应用程序

java - Drive.Files.Create.execute() java.net.SocketTimeoutException

java - 如何在struts1.x中使用List<String>设置文本框的标题?