如何阻止敌人重叠java

时间:2016-07-28 04:10:59

标签: java android eclipse collision

我一直试图弄清楚如何阻止我的敌人在过去一周内相互重叠。我正在使用链接的敌人列表。我遍历列表并设置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位置并返回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;
}

1 个答案:

答案 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];
}