-1

在我正在制作的游戏中,我已经做到了僵尸无法互相穿过。我用这段代码做到了这一点。

for(int i = 0; i < zombies.size(); i++){
                Zombie z = (Zombie) zombies.get(i);
                zombieMovement();
                for(int j = i + 1; j < zombies.size(); j++){
                    Zombie z2 = (Zombie) zombies.get(j);
                    Rectangle r1 = z.getBounds();
                    Rectangle r2 = z2.getBounds();
                    if(r1.intersects(r2)){
                        z.setX(z.getX() - 1);
                        z.setY(z.getY() - 1);
                        z2.setX(z2.getX() + 1);
                        z2.setY(z2.getY() + 1);
                    }
                }
            }

ZombieMovement 方法看起来像这样。

public void zombieMovement(){
        for(int i = 0; i < zombies.size(); i++){ 
            Zombie z = (Zombie) zombies.get(i);
            if(z.getY() > player.getY()){
                z.setY(z.getY() - .01);
            }
            if(z.getY() < player.getY()){
                z.setY(z.getY() + .01);
            }
            if(z.getX() > player.getX()){
                z.setX(z.getX() - .01);
            }
            if(z.getX() < player.getX()){
                z.setX(z.getX() + .01);
            }
            if(z.isAlive()){
                z.move();
            }else{ 
                zombies.remove(i);
            }
        }
    }

因为僵尸相互接触时的移动速度是僵尸的 10 倍,所以前几个僵尸的移动速度比后来的僵尸快得多,因为它们接触的僵尸更多(我无法设置它们移动时的移动速度)彼此的接触更少,因为那样他们仍然可以在彼此内部,我不希望僵尸的移动速度比他们已经在做的更快)。

有什么简单的方法可以解决这个错误吗?

4

2 回答 2

0

而不是试图修复重叠的僵尸,你应该首先在你的zombieMovement()方法中防止问题。在计算僵尸移动到的位置时,您应该测试它的新位置(+/- .01 位)是否已被占用,如果是,则不要将僵尸移动到该位置。

/**
* Returns true if the point x,y is already occupied by a zombie
*/
boolean isOccupied(double x, double y) {
  for (Zombie z : zombies) {
    if (z.getBounds().contains(new Point(x,y))) {
      return true;
    }
  }
  return false;
}

然后,您可以像这样测试您的运动方法;

if (z.getY() > player.getY()) {
  double newY = z.getY() - .01;
  if (!isOccupied(z.getX(), newY) {
    z.setY(newY);
  {
}
于 2013-04-26T13:11:46.527 回答
0

当一个僵尸被四面八方包围并且你必须移动它时会发生什么?

对于一个真正强大的解决方案,我会做一个同时约束求解器。本质上,您可以将其想象为在每个碰撞的僵尸之间放置一个弹簧并迭代直到每个人不再相交。您可能希望对位移设置上限,以确保您不会意外地让僵尸也射入太空。

不幸的是,这种方法需要复杂的数学运算。我认为 Box2d 有一些在线幻灯片来解释其算法的基础。或者您可以只使用现有的物理引擎,例如 Box2d。

于 2013-04-26T12:58:08.380 回答