在我正在制作的游戏中,我想让僵尸无法穿过对方或玩家。
我不想让僵尸停留一段时间或者当他们互相撞击时朝另一个方向移动,因为它看起来很怪异,我希望僵尸总能跟随玩家。我想的是跟踪僵尸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语句中我应该具备什么才能让精灵彼此不相通。
答案 0 :(得分:1)
作为tile选项的一点建议:
假设您的游戏区域被组织为16x16 tilemap,它可能如下所示:
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
。这个小理论将允许您轻松检查您想要去的字段是否已被占用......或者如果不是则移动。
如果有问题的字段已被占用,僵尸将停止移动。
答案 1 :(得分: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
的x和y值重置为您在尝试移动int
之前抓取的z
。你可以使它比那更复杂 - 如果x中存在碰撞则重置x,如果y中存在碰撞则重置y(如果两者都发生碰撞则重置两者)。通过这种方式,僵尸可以击中另一个僵尸或墙壁或其他东西并沿着它行走。
一个建议是让刻度足够短,每个僵尸只在每个刻度中移动一个像素。这样,让僵尸不动就不会让它回到那么远,并且僵尸之间只需要一个像素的间隙就可以让他们全速前往玩家。如果你将它与一个像素小的碰撞盒结合起来,那么你应该在它们移动时获得所需的僵尸密度。
此外,您可以使Zombie
扩展CollidableObject
类,然后让内循环遍历包含所有僵尸的CollidableObject
集合。这样你也可以写一个Wall
类,一个Obstacle
类等,让它们都扩展CollidableObject
,并将更多的对象放到CollidableObject
列表中,并且碰撞僵尸和障碍都将在一个循环中得到照顾。