阻止精灵重叠/相互穿越

时间:2013-04-27 10:08:16

标签: java 2d sprite collision-detection collision

在我目前正在进行的游戏中,我不希望僵尸能够相互重叠。因此,我想这样做,以便当它们相互碰撞时,它们将被移回到碰撞之前的x和y。

我试图让它更新僵尸的x和y位置,只要它们不与任何具有此语句if(!r1.intersects(r2)) r1 r2if(!r1.intersects(r2))的僵尸发生碰撞是碰撞的两个僵尸的边界框,然后将僵尸x和y设置为在此语句if(r1.intersects(r2))中的double语句中确定的x和y。

出于某种原因,所有的僵尸都会重叠,看起来只有一个僵尸。我猜所有的僵尸都会在两个碰撞时传送到那个x和y,但我已经做到了这一点,只有碰撞的僵尸才会受到影响。当我做它时,它会使其中一个僵尸移动它的y和x向上移动1个像素而另一个移动它的x任何y向下移动一个像素,但问题是在开始时,当有很多僵尸,他们都会比以后更快地移动。

我试图通过每次其中一个死亡时使僵尸更快来解决这个问题,但我还没有因为某些原因而让它工作。我尝试通过speed += .1;调用速度来获得僵尸速度的值,然后在检查玩家子弹和僵尸之间的碰撞的方法中执行ArrayList之类的操作,但他们仍然没有当我拍摄其中一个时,我会更快。为了看看你是否可以找出为什么不起作用,下面是将僵尸对象添加到ArrayList的代码,使它们移动并检查它们的碰撞。

将56个僵尸添加到public void initZombie(){ for(int i = 0; i < 56; i++){ Toolkit tk = Toolkit.getDefaultToolkit(); int xSize = (int) tk.getScreenSize().getWidth(); int ySize = (int) tk.getScreenSize().getHeight() + 300; int thaXSize = xSize + 800; double randomXSpawn = Math.random() * thaXSize + xSize; double randomYSpawn = Math.random() * ySize + 0; zombies.add(new Zombie(randomXSpawn,randomYSpawn)); } } 并使其全部在随机位置生成的方法。

public void zombieMovement(){
        for(int i = 0; i < zombies.size(); i++){ 
            Zombie z = (Zombie) zombies.get(i);
            Rectangle r2 = z.getBounds();
            if(z.getY() > player.getY()){
                z.setY(z.getY() - z.getSpeed());
            }
            if(z.getY() < player.getY()){
                z.setY(z.getY() + z.getSpeed());
            }
            if(z.getX() > player.getX()){
                z.setX(z.getX() - z.getSpeed());
            }
            if(z.getX() < player.getX()){
                z.setX(z.getX() + z.getSpeed());
            }
            if(z.isAlive()){
                z.move();
            }else{ 
                zombies.remove(i);
            }
        }
    }

使僵尸向玩家移动的方法。

public void checkCollision(){
        Rectangle r3 = player.getBounds();
        for(int i = 0; i < zombies.size(); i++){
            Zombie z = (Zombie) zombies.get(i);
            Rectangle r2 = z.getBounds();
            if(r3.intersects(r2)){
                timer.start();
                if(!player.getInvincibility()){
                    player.setHealth(player.getHealth() + 10);
                    player.setInvincibility(true);
                }
            }
        }
        ArrayList bullet = player.getBullet();
        for(int j = 0; j < bullet.size(); j++){
            Bullet b = (Bullet) bullet.get(j);
            Rectangle r1 = b.getBounds();
            for(int i = 0; i < zombies.size(); i++){
                Zombie z = (Zombie) zombies.get(i);
                Rectangle r2 = z.getBounds();
                if(r1.intersects(r2)){
                    b.setVisible(false);
                    z.setAlive(false);
                    int newScore = Integer.parseInt(player.getScore());
                    newScore += 10;
                    z.setSpeed(z.getSpeed() + 1);
                    player.setScore("" + newScore);
                }
            }
        }
    }

检查玩家和僵尸之间以及子弹和僵尸之间的碰撞的方法。

run()

检查zombie和zombie之间碰撞的代码,我已将其直接分别放在checkCollision(); for(int i = 0; i < zombies.size(); i++){ Zombie z = (Zombie) zombies.get(i); zombieMovement(); for(int j = i + 1; j < zombies.size(); j++){ Zombie z2 = (Zombie) zombies.get(j); Rectangle r1 = z.getBounds(); Rectangle r2 = z2.getBounds(); if(r1.intersects(r2)){ if(z.getX() > z2.getX()){ z.setX(z.getX() + 1); } if(z.getX() < z2.getX()){ z.setX(z.getX() - 1); } if(z2.getX() > z.getX()){ z2.setX(z2.getX() + 1); } if(z2.getX() < z.getX()){ z2.setX(z2.getX() - 1); } if(z.getY() > z2.getY()){ z.setY(z.getY() + 1); } if(z.getY() < z2.getY()){ z.setY(z.getY() - 1); } if(z2.getY() > z.getY()){ z2.setY(z2.getY() + 1); } if(z2.getY() < z.getY()){ z2.setY(z2.getY() - 1); } } } } 方法中。

zombieMovement();

我还试图在撞击发生之前检查碰撞,通过在移动僵尸之前检查斑点是否被占用,但我从未设法弄清楚如何检查斑点是否已被另一个僵尸占用。

所以我可以使用三件事来让僵尸无法重叠/相互穿过:让僵尸移动到以前的位置,每当一个人死亡时让僵尸变得更快,或者检查僵尸是否尝试到现场搬到已经被占领。你可以选择你想要帮助我的女巫 - 只要它有效,它并不重要。

编辑: 我自己想出来了,我只需要将{{1}}移到检查僵尸碰撞的代码之外,但是如果你能回答的话关于如何检查现场是否已被占用我会很感激,因为我确信这是一个更好的方法。

1 个答案:

答案 0 :(得分:0)

只需将zombieMovement();移到检查僵尸冲突的代码之外