我正在用 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。
答案 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()));
}