2016-07-28 4 views
0

私は過去1週間に敵が重なり合うのを止める方法を見つけようとしています。私は敵のリンクリストを使用しています。私はリストをループして、oldXoldYの位置を設定します。これは、ゾンビが重なっていれば元に戻す位置です。私の問題は、最初は衝突検出が機能するが、最終的には一緒に固着して動かないことになるということです。下の画像は結局の状態を示しています。誰かが私にこれを手伝ったり、この種の衝突検知を管理する方法を説明してくれれば、どのようにして完了したかを明確に説明するものは見つけられません。どのように敵を重複するのを止める方法

enter image description here

これはゾンビを移動するための私の基本的なAI方式であるゾンビが他と重複している場合、それは壁との衝突がないかどうかを確認するためにテストし、その後、チェックします。その後、プレイヤーの位置に基づいてゾンビを移動します。

public void moveZombie(){ 
     for(Zombie zombie : c.z) 
     { 
      oldX = zombie.getX(); 
      oldY = zombie.getY(); 

      if(player.getX() > zombie.getX()){ 
       if(wallCollision(zombie.getX()+1, zombie.getY()) == false){ 
        if(zombiesCollision(zombie) == false){ 
         zombie.setX(zombie.getX() + 1); 
        } 

       } 
      } 

      if(player.getX() < zombie.getX()){ 
       if(wallCollision(zombie.getX()-1, zombie.getY()) == false){ 
        if(zombiesCollision(zombie) == false){ 
         zombie.setX(zombie.getX() - 1); 
        } 


       } 
      } 

      if(player.getY() > zombie.getY()){ 
       if(wallCollision(zombie.getX(), zombie.getY()+1) == false){ 
        if(zombiesCollision(zombie) == false){ 
         zombie.setY(zombie.getY() + 1); 
        } 

       } 
      } 

      if(player.getY() < zombie.getY()){ 
       if(wallCollision(zombie.getX(), zombie.getY()-1) == false){ 
        if(zombiesCollision(zombie) == false){ 
         zombie.setY(zombie.getY() - 1); 
        } 
       } 
      } 
     } 

} 

これは、ゾンビが衝突するかどうかをテストするブール方法です。上記の私のmove()メソッドから呼び出され、上記のループから現在のゾンビをパラメータとして受け取ります。次に、交差するかどうかをチェックします。彼らが行う場合、ゾンビのxとyの位置はoldXoldYの位置に設定され、真を返します。交差点がある場合は、zombie.x -= 32;zombie.y -=32を試しました。それは動作しますが、それは非常にglitchyであり、彼らはしばしば壁に立ち往生する、私はどのように私は元の位置に戻ってゾンビを移動することができます知ってほしい。静的な境界を持つマップを考える

public boolean zombiesCollision(Zombie zombie){ 

      for(Zombie zombie2 : c.z){ 
        if(zombie != zombie2){ 
         if(zombie2.getZombieBounds().intersects(zombie.getZombieBounds())){ 
          zombie.x = oldX; 
          zombie.y = oldY; 
          return true; 
         } 
        } 
      } 

     return false; 
} 
+0

あなたの「世界」は境界を設定しているのですか、それともオープンな世界ですか?たとえば、あなたの世界は10x10のようなものですか? – RayfenWindspear

+0

70x40のタイルマップです。各タイルは32×32ピクセルである。 – Phill

答えて

0

、私はあなたがあなたの現在の設定と一緒にゾンビ位置の2次元ブール配列を、維持することをお勧め。衝突検出は、ループから単純な配列検索まで簡素化することができます。

また、moveZombieメソッドでは、実際には関数の最後まで移動しないでください。この擬似コードのようなもの。

public void moveZombie(){ 
    for(Zombie zombie : c.z) 
    { 
     newX = zombie.getX(); 
     newY = zombie.getY(); 

     if(player.getX() > zombie.getX()){ 
      if(wallCollision(zombie.getX()+1, zombie.getY()) == false){ 
       if(zombiesCollision(zombie.getX()+1,zombie.getY()) == false){ 
        newX += 1; 
       } 

      } 
     } 

     if(player.getX() < zombie.getX()){ 
      if(wallCollision(zombie.getX()-1, zombie.getY()) == false){ 
       if(zombiesCollision(zombie.getX()-1,zombie.getY()) == false){ 
        newX -= 1; 
       } 


      } 
     } 
     // with newX finalized, we need to use it for checks instead of the "current" value 
     if(player.getY() > zombie.getY()){ 
      if(wallCollision(newX, zombie.getY()+1) == false){ 
       if(zombiesCollision(newX,zombie.getY()+1) == false){ 
        newY += 1; 
       } 

      } 
     } 

     if(player.getY() < zombie.getY()){ 
      if(wallCollision(newX, zombie.getY()-1) == false){ 
       if(zombiesCollision(newX,zombie.getY()-1) == false){ 
        newY -= 1; 
       } 
      } 
     } 
     // update position and location array 
     zombieArray[zombie.getX()][zombie.getY()] = false; 
     zombieArray[newX][newY] = true; 
     zombie.setX(newX); 
     zombie.setY(newY); 
    } 
} 

あなたの​​は単純になります。

public boolean zombiesCollision(int x, int y){ 
    return zombieArray[x][y]; 
} 
+0

おっと、バグを捕まえました。新しく追加されたコメントを見てください。 – RayfenWindspear

+0

それで、これはあなたの問題に答えたのですか?もしそうなら、答えとしてそれを受け入れてください。 – RayfenWindspear

関連する問題