-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);
                    }
                }
            }

ゾンビ移動メソッドは次のようになります。

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 倍の速さで移動するため、最初の 2 体のゾンビは、より多くのゾンビと接触しているため、後に来るゾンビよりもはるかに速く移動します (移動するときの速度は設定できません)。お互いの接触が少なくても、お互いの中にいることができ、ゾンビがすでに行っていることよりも速く移動したくないためです)。

このエラーを修正する簡単な方法はありますか?

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 に答える