2016-07-28 73 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