Java - 如何根据与玩家的距离对对象的 Arraylist 进行动态排序

时间:2021-05-25 11:53:38

标签: java arraylist

我正在用 Java 构建一个小游戏,其中我有一个僵尸对象的 Arraylist,用于为玩家选择下一个目标。僵尸由 x 和 y 变量组成,它们决定了它们的初始位置。

public Zombie(double positionX, double positionY){
        this.image = new Image("res/images/zombie.png");
        this.Position = new Point(positionX, positionY);
        this.visible = true;
    }

我已经编写了这个方法来选择玩家自动瞄准的数组中的下一个僵尸,但是我一直在试图弄清楚如何对 Arraylist 进行动态排序,以便玩家按距离瞄准最近的僵尸,而不是列表中的下一个。

public void zombieSpawn(){
        for(int i = 0; i < zombies.size(); i++){
            zombie = zombies.get(i);
            if(!zombie.isVisible()){
                removeZombie(zombie);
            }
            if(zombies.size() != 0){
                this.zombie = zombies.get(0);
            }
        }
    }

tl:dr 我想通过到玩家的最短距离动态排序僵尸的 Arraylist。

1 个答案:

答案 0 :(得分:4)

在这里,我将使用一个自定义 ZombieSort 类,它实现了 Comparator,它通过比较僵尸与玩家坐标的距离来对它们进行排序。

这里是 ZombieSort.java

public class ZombieSort implements Comparator<Zombie> {
    private final double playerX, playerY;

    public ZombieSort(double playerX, double playerY) {
        this.playerX = playerX;
        this.playerY = playerY;
    }

    @Override
    public int compare(Zombie z1, Zombie z2) {
        return Double.compare(getDistance(z1), getDistance(z2));
    }

    public double getDistance(Zombie zombie) {
        return Math.sqrt(
                Math.pow(zombie.x - playerX, 2) + Math.pow(zombie.y - playerY, 2)
        );
    }
}

这是你对zombieSpawn() 的实现,它基本上在每次调用时对僵尸列表进行排序。:

public void zombieSpawn(){
    sortZombies(zombies, player);

    for(int i = 0; i < zombies.size(); i++){
        zombie = zombies.get(i);
        if(!zombie.isVisible()){
            removeZombie(zombie);
        }
        if(zombies.size() != 0){
            this.zombie = zombies.get(0);
        }
    }
}

public void sortZombies(List<Zombie> zombies, Player player) {
    Collections.sort(zombies, new ZombieSort(player.getX(), player.getY()));
}