2016-07-28 72 views
0

我一直在試圖弄清楚如何阻止我的敵人在過去的一週中互相重疊。我正在使用一個敵人的鏈表。我遍歷列表並設置一個oldXoldY的位置,這是我希望殭屍如果重疊的位置。我的問題是,一開始碰撞檢測工作,但最終他們最終都會粘在一起,而不是移動,下面的圖像顯示他們最終進入的狀態。他們只是粘在一起,不動。如果任何人都可以幫助我解決這個問題,或者解釋如何管理這種碰撞檢測,那將是非常棒的,因爲我找不到任何明確解釋它是如何完成的!如何阻止敵人重疊java

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的位置並返回true。如果有交點,我嘗試zombie.x -= 32;zombie.y -=32。這種方法很有效,但它非常糟糕,而且它們經常卡在牆上,我想知道如何將殭屍移回原來的位置。

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的瓷磚地圖。每個瓦片是32x32像素。 – Phill

回答

0

鑑於靜態邊界的地圖,我建議你保持殭屍位置的二維布爾數組,與當前設置一起。您的碰撞檢測可以從循環簡化爲簡單的數組查找。

另外,在您的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

哎呀,發現了一個bug ...修復。查看新添加的評論。 – RayfenWindspear

+0

那麼,這是否回答你的問題?如果是這樣,請接受它作爲答案。 – RayfenWindspear