将矩形碰撞到一个布尔数组(奇怪的bug)

时间:2012-06-17 21:56:46

标签: c# arrays 2d collision

    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;
        }

在播放器的更新方法中,每个帧都调用一次。偶尔会在子弹的更新方法中调用它,使用相同的代码

0 个答案:

没有答案