矩形不会正确碰撞

时间:2015-07-05 17:20:01

标签: c# xna monogame rectangles

Collison

正如您在顶角看到的那样,它表示COL:False / True。这是玩家的界限和固体的牌。如果它们相互拦截,则检查瓷砖和玩家的矩形。看起来它的工作正常吗?好不好。仔细看看。

NotWorking NotWorking

BOTTOM RIGHT 一角需要在瓷砖内部才能计算。

现在让我们看看我现在使用的代码,希望你能理解这个问题。

玩家界限(矩形)

playerBounds.Width = 32;
playerBounds.Height = 64;
playerBounds.X = (int)this.position.X;
playerBounds.Y = (int)this.position.Y;

平铺边界(矩形)

newTile.bounds = new Rectangle(x * TILE_SIZE, y * TILE_SIZE, TILE_SIZE, TILE_SIZE);

现在了解如何检测它:

for (int x = 0; x < Tilemap.MAP_WIDTH; x++)
        {
            for (int y = 0; y < Tilemap.MAP_HEIGHT; y++)
            {

                if (tm.tile[x, y].bounds.Intersects(playerBounds))
                {
                    if (tm.tile[x, y].getSolid())
                    {
                        Colliding = true;
                    } else
                    {
                        Colliding = false;
                    }
                }
            }

        }

移动

    public void Move(Vector2 pos)
    {
        for (int i = 0; i < speed; i++)
        {

            position += pos;
        }

    }

我在碰撞检测循环中使用了断点。矩形完全覆盖了角色和瓷砖。

1 个答案:

答案 0 :(得分:1)

您正在覆盖循环中的先前碰撞。结果将始终是与播放器相交的最后一个图块的固态。尝试这样的改编:

Colliding = false;
for (int x = 0; x < Tilemap.MAP_WIDTH; x++)
{
    for (int y = 0; y < Tilemap.MAP_HEIGHT; y++)
    {
        if (tm.tile[x, y].bounds.Intersects(playerBounds) && tm.tile[x, y].getSolid())
        {
            Colliding = true;
            break;                    
        }
    }
    if(Colliding)
        break;
}

更有效的方法只会检查实际相交的切片。由于使用简单的轴对齐矩形,因此交叉图块的集合应该不难计算。