-1

在我正在制作的游戏中,我想让僵尸无法穿过对方或玩家。

我不想让僵尸在撞到对方时停下一会儿或朝另一个方向移动,因为这看起来很奇怪,我希望僵尸始终跟随玩家。我当时的想法是跟踪僵尸之前的 x 和 y 位置(我已经在做),然后当它与另一个僵尸或玩家碰撞时,它会在与另一个僵尸碰撞之前传送到最后一个 x 和 y 位置精灵。

这行得通吗?有没有更好的方法来做到这一点?在僵尸与另一个精灵碰撞之前,我将如何跟踪最新的 x 和 y 位置?

我已经有了让僵尸碰撞的代码

for(int i = 0; i < zombies.size(); i++){
            Zombie z = (Zombie) zombies.get(i);
            Rectangle r2 = z.getBounds();
            for(int j = i + 1; j < zombies.size(); j++){
                Zombie z2 = (Zombie) zombies.get(j);
                Rectangle r1 = z2.getBounds();
                if(r2.intersects(r1)){
                    //the code for stoping the sprites from going through each other should be here
                }
            }
        }

我只是想知道我应该在 if 语句中使用什么来使精灵不会相互通过。

4

2 回答 2

1

作为对 tile 选项的一点建议:

假设你的游戏区域被组织成一个 16x16 的瓷砖地图,它可能看起来像这样:

Tile Map[16][16];

现在如果你的精灵移动了,你就会知道你想去哪个图块。

if(Map[NewX][NewY].Occupant == NULL) {
    Map[NewX][NewY].Occupant = Sprite;
    Map[Sprite.X][Sprite.Y].Occupant = NULL;
    Sprite.setLocation(NewX, NewY);
}

包含一个Tile指向Sprite名为Occupant. 这个小理论将让您轻松检查您想去的领域是否已经被占用......或者如果没有,则移动。

如果相关领域已被占用,僵尸将停止移动。

于 2013-04-25T18:54:34.593 回答
1

您可能应该同时进行碰撞检查和移动:

for(int i = 0; i < zombies.size(); i++){
    Zombie z = (Zombie) zombies.get(i);

    // New code here:
    int x = z.getX();
    int y = z.getY();
    attemptZombieMove(z);

    Rectangle r2 = z.getBounds();
    for(int j = 0; j < zombies.size(); j++){
        if (i == j) {
            continue;
        }
        Zombie z2 = (Zombie) zombies.get(j);
        Rectangle r1 = z2.getBounds();
        if(r2.intersects(r1)){
            //the code for stoping the sprites from going through each other should be here
        }
    }
}

请注意,我更改了内部for循环,以便j从 0 开始。我这样做是因为我们想要更改僵尸在循环中间的位置。因此,当我们检查僵尸 A 是否发生碰撞时,它可能不会与僵尸 B 发生碰撞,但在 B 移动后它们会发生碰撞。

您的碰撞检测可以将z'sx 和 y 值重置为int您在尝试移动之前抓取的 s z。你可以让它比这更复杂 - 如果 x 中存在冲突,则重置 x,如果 y 中存在冲突,则重置 y(如果两者都存在冲突,则重置两者)。这样僵尸就可以撞到另一个僵尸或墙壁或其他东西,然后沿着它走。

一个建议是使刻度足够短,以使每个僵尸在每个刻度中只移动一个像素。那样的话,让僵尸不移动并不会让它后退那么远,僵尸之间只需要一个像素的间隙,它们就可以全速朝着玩家前进。如果将其与小 1 个像素的碰撞框结合起来,那么您应该在僵尸移动时获得所需的僵尸密度。

此外,您可以Zombie扩展一个CollidableObject类,然后让内部循环遍历CollidableObject包含所有僵尸的 s 集合。这样你也可以编写一个Wall类,一个Obstacle类等,让它们都 extend CollidableObject,并将更多的对象放入CollidableObject列表中,并且与僵尸和障碍物的碰撞都将在一个循环中得到处理。

于 2013-04-25T18:56:00.740 回答