0

在我目前正在制作的游戏中,我不希望僵尸能够相互重叠。因此,我想做到这一点,当它们确实相互碰撞时,它们会被移回它们在碰撞前所在的 x 和 y。

我试图让它更新僵尸的 x 和 y 位置,只要它们不与此语句的任何僵尸碰撞if(!r1.intersects(r2))r1并且r2是碰撞的两个僵尸的边界框),然后设置僵尸 x 和y 到 x 和 y 即if(!r1.intersects(r2))在此语句中的语句中确定if(r1.intersects(r2))

由于某种原因,所有的僵尸都会重叠,看起来只有一个僵尸。我猜当两个僵尸发生碰撞时,所有的僵尸都会传送到那个 x 和 y,但我这样做是为了只有碰撞的僵尸才会受到影响。当我制作它时它会起作用,以便其中一个僵尸将它的 y 和 x 向上移动 1 个像素,而另一个将它的 x 任意 y 向下移动一个像素,但问题是在开始时,当有很多僵尸,他们都会比后来的僵尸移动得快很多。

我试图通过在每次僵尸死亡时让僵尸更快来解决这个问题,但由于某种原因我还没有让它工作。我尝试通过double调用速度来获取僵尸速度的值,然后在speed += .1;检查玩家子弹和僵尸之间的碰撞的方法中执行类似的操作,但是当我射击其中一个时它们仍然没有变得更快. 要查看您是否可以弄清楚为什么这不起作用,这里是添加僵尸对象以ArrayList使它们移动并检查它们的碰撞的代码。

将 56 个僵尸添加到一个ArrayList并让它们全部在随机位置生成的方法。

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()方法中单独放置。

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();检查僵尸碰撞的代码,但如果你能回答如何检查该地点是否已经被占用,我将不胜感激,因为我确信那是更好的方法来做到这一点。

4

1 回答 1

0

只需移出zombieMovement();检查僵尸碰撞的代码即可

于 2013-04-27T15:44:36.883 回答