public bool WallCollision()
{
Rectangle BoundsPos = Bounds + Pos - Origin;
if (BoundsPos.X > 0 && BoundsPos.Y > 0 && BoundsPos.X / 32 < Parent.Tiles.GetLength(0) + BoundsPos.Width / 32 && BoundsPos.Y / 32 < Parent.Tiles.GetLength(1) + BoundsPos.Height / 32)
{
for (int x = 0; x < Parent.Tiles.GetLength(0); x++)
{
for (int y = 0; y < Parent.Tiles.GetLength(1); y++)
{
if (Parent.Tiles[x, y] != null && Parent.Tiles[x, y].Solid && BoundsPos != null)
{
if (new Rectangle(x * 32 + 1, y * 32, 32, 32).IntersectsWith(BoundsPos))
{
return true;
}
}
}
}
}
return false;
}
运行时,此代码通常会冻结但不会产生异常。当程序被破坏时(VS10),它将突出显示
if (Parent.Tiles[x, y] != null)
,
y < Parent.Tiles.GetLength(1)
,
if (new Rectangle(x * 32 + 1, y * 32, 32, 32).IntersectsWith(BoundsPos))
,
x < Parent.Tiles.GetLength(0)
,
或外部代码
public static Rectangle operator +(Rectangle R, Vector2 V)
{
return new Rectangle((int)(R.X + V.X), (int)(R.Y + V.Y), R.Width, R.Height);
}
在VS10的分析器下运行时,会显示相同的结果。它似乎是在随机情况下发生的
示例条件:
Bounds =矩形x = 0,y = 0,宽度= 20,高度= 20
Origin = Vector2 x = 32,y = 32
Pos = Vector2 x = 100 y = 100
Parent.Tiles.GetLength(0,1)= 10,10
呼叫者:
Pos.X += Velocity.X;
if (WallCollision())
{
Pos.X -= Velocity.X;
}
Pos.Y += Velocity.Y;
if (WallCollision())
{
Pos.Y -= Velocity.Y;
}
在播放器的更新方法中,每个帧都调用一次。偶尔会在子弹的更新方法中调用它,使用相同的代码