矩形不能正确碰撞
Rectangles don't collide correctly
正如您在顶角看到的那样,它显示 COL:False/True。这是玩家边界和实体方块的情况。检查方块和玩家的矩形是否相互拦截。看起来它工作正常?好吧,不。仔细看。
右下角 角必须在图块内部才能计数。
现在让我们来看看我现在使用的代码,希望您能理解这个问题。
玩家范围(矩形)
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;
}
}
我在碰撞检测循环中使用了断点。矩形完全覆盖了角色和方块。
您正在覆盖循环中之前的碰撞。结果将始终是与玩家相交的最后一个图块的固态。试试这样的改编:
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;
}
更有效的方法是只检查实际相交的图块。由于您使用简单的轴对齐矩形,因此相交图块的集合应该不难计算。
正如您在顶角看到的那样,它显示 COL:False/True。这是玩家边界和实体方块的情况。检查方块和玩家的矩形是否相互拦截。看起来它工作正常?好吧,不。仔细看。
右下角 角必须在图块内部才能计数。
现在让我们来看看我现在使用的代码,希望您能理解这个问题。
玩家范围(矩形)
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;
}
}
我在碰撞检测循环中使用了断点。矩形完全覆盖了角色和方块。
您正在覆盖循环中之前的碰撞。结果将始终是与玩家相交的最后一个图块的固态。试试这样的改编:
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;
}
更有效的方法是只检查实际相交的图块。由于您使用简单的轴对齐矩形,因此相交图块的集合应该不难计算。