0

该地图是由我制作的名为 Tile 的类的二维数组制作的。每个图块内部都有较小的图块,它们要么与单位发生碰撞,要么不与单位发生碰撞。

但是我怎样才能检测和防止碰撞呢?假设玩家是 6x6 小(上面提到的)瓷砖大,一个普通瓷砖是 8x8。我怎么知道当玩家向右移动时我知道那里有一块瓷砖,并且移动得足够多,以至于它们不会重叠?

按照规则的要求..我需要表现出努力,所以这就是我目前所拥有的:如果玩家是 6x6 并且一块瓷砖是 8x8,那么这意味着玩家要么在一个瓷砖上,要么在 2 个瓷砖之间; 当他站在瓷砖之间时(单位不绑定到瓷砖)。所以假设玩家在两个瓷砖之间,并且想要向右移动:我检查第一个(玩家所在的两个瓷砖)瓷砖右侧的瓷砖碰撞,然后检查第二个。为了能够向右移动,两者都必须是空的。

但是如果一个单位是 10x10 大,那么它可以是 2 个格子,或者最多 3 个格子。如果我知道每个单元的大小不同并且不是恒定的,我如何不断检查碰撞。

基本上,我需要关于上述内容的帮助,或者一种新的碰撞方法。

4

1 回答 1

0

如果我正确理解您的问题,则较小的瓷砖会导致碰撞,而不是较大的瓷砖。在这种情况下,您可以简单地遍历该单位在给定移动中将穿过的所有小图块,如果遇到会阻止该单位前进的小图块,则停止。举个例子,下面是一个处理向右移动单元的方法:

void moveUnitRight(Unit unit, int tilesRight)
{
    for(int col = unit.Right + 1 ; col <= unit.Right + tilesRight ; col++)
        {
            for(int row = unit.Top ; row <= unit.Bottom ; row++)
            {
                 if (tiles[row,col].Collides)  //stop unit here
                 {
                     unit.Right = col - 1;    //set position to tile left of collision
                     return;   //search no further
                 }
            }
     }
     //if you reach this point, no collision was detected
     unit.Right += tilesRight;    //move the full distance
}

一旦你理解了这一点,你就可以编写一个更健壮的方法来处理任何方向的移动以及检查地图边界。

于 2013-03-23T18:31:11.263 回答