我一直试图弄清楚如何阻止我的敌人在过去一周内相互重叠。我正在使用链接的敌人列表。我遍历列表并设置oldX
和oldY
位置,这是我希望僵尸重叠时移回的位置。我的问题是,在一开始碰撞检测工作,但最终他们最终粘在一起而不是移动,下面的图像显示他们最终的状态。他们只是粘在一起,不动。如果有人可以帮我解决这个问题或解释如何管理这种碰撞检测,那将是很好的,因为我无法找到任何清楚解释它是如何完成的事情!
这是我移动僵尸的基本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位置设置为oldX
和oldY
位置并返回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 :(得分: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);
}
}
然后你的zombiesCollision
就是。
public boolean zombiesCollision(int x, int y){
return zombieArray[x][y];
}