2D碰撞检测表现得很有趣

时间:2012-09-06 22:01:26

标签: c# xna collision-detection

我有一个简单的BreakOut游戏(垂直,底部划桨)启动并运行,但碰撞检测有点偏。 我使用的是Rectangle.Intersect最初检查球相交定的块在所有,然后如果它有4个相交调用,检查是否球是垂直碰撞(砖的一边,左+右)或水平(砖的顶部+底部)。 在某些情况下,当球在两个水平相邻的砖的交叉点附近以锐角碰撞砖时,它将两者都移除并继续向上的方向。我认为这是碰撞的两倍。我强行退出了foreach循环,它在找到矩形时检查矩形是否相交,但这还没有解决问题。

这是游戏类的主要Update()函数:

        foreach (Brick brick in bricks)
        {
            if (brick.CheckCollision(ball))
            {
                break;
            }
        }

这是Brick.CheckCollision()函数:

    public bool CheckCollision(Ball ball)
    {
        if (alive && ball.Bounds.Intersects(location))
        {
            alive=false;
            ball.Deflection(this);
            return true;
        }
        return false;
    }

这是Ball.Deflection()函数。在这里,我使用没有宽度/高度的矩形来标记砖的两侧。不确定这是否正确:

    public void Deflection(Brick brick)
    {
        //For vertical collision (top or bottom of brick) invert Y motion
        if (this.Bounds.Intersects(new Rectangle(brick.Location.Left, brick.Location.Top, brick.Location.Right - brick.Location.Left, 0)) ||
            this.Bounds.Intersects(new Rectangle(brick.Location.Left, brick.Location.Bottom, brick.Location.Right - brick.Location.Left, 0)))
        {
            motion.Y *= -1;
            return;
        }
        //For horizontal collision (left or right side of brick) invert X motion
        if (this.Bounds.Intersects(new Rectangle(brick.Location.Left, brick.Location.Top, 0, brick.Location.Bottom - brick.Location.Top)) ||
            this.Bounds.Intersects(new Rectangle(brick.Location.Right, brick.Location.Top, 0, brick.Location.Bottom - brick.Location.Top)))
        {
            motion.X *= -1;
            return;
        }
    }

我认为我犯了一个明显的逻辑错误,但如果一般的方法可以改进,我就全都听见了!

0 个答案:

没有答案