如何改善/修复球和桨之间的碰撞检测?

时间:2014-01-25 13:28:46

标签: c# xna collision-detection game-physics

基本上我正在制作一个像乒乓球,突围等游戏的过程。当球和桨碰撞时我遇到了一些问题......但有时候只是!

此视频出现的内容为:http://www.youtube.com/watch?v=uFZIxFIg0rI

所以,基本上当球与桨碰撞时,球有时看起来有点疯狂...通常情况下,如果我在球的接近方向上移动球。此外球有时会被夹在游戏窗口的底部和桨之间...即使我有代码阻止球,桨等进入屏幕外...

任何想法......或简单的修复?感谢

哦,顺便说一句......这是我用来在球和球拍之间进行碰撞检测的代码,并阻止他们走出游戏窗口:

//CODE FOR CHECKING IF THE BALL IS OUTSIDE OF THE SCREEN

        //checks for collision with left wall
        if (pPosition.X <= 0)
        {
            pVelocity.X = -pVelocity.X;                
        }

        //checks for collision with right wall
        if (pPosition.X + pTexture.Width >= screenWidth)
        {
            pVelocity.X = -pVelocity.X;                                           
        }

        //checks for collision with top wall
        if (pPosition.Y <= 0)
        {
            pVelocity.Y = -pVelocity.Y;                
        }

        //checks for collision with bottom wall
        if (pPosition.Y + pTexture.Height >= ScreenHeight)
        {
            pVelocity.Y = -pVelocity.Y; //only need to invert Y velocity...                    
        }
    }


//CODE FOR CHECKING COLLISION BETWEEN BALL AND PADDLE

if (Ball.pRectangle.Intersects(Paddle.GetRectangle))
        {
            //Ball.pPosition.Y -= Ball.pVelocity.Y;
            Ball.pVelocity.Y = -Ball.pVelocity.Y;
        }            

        Ball.pPosition += Ball.pVelocity; //As this is in the update method, this just enables the ball to keep moving each frame...

编辑于17:21:

if (Ball.pRectangle.Intersects(Paddle.GetRectangle))
        {
            if (Ball.pRectangle.Bottom > Paddle.GetRectangle.Top)
            { //intersecting top of paddle
                //WORKING
                Ball.pPosition.Y = Paddle.GetRectangle.Top - Ball.pHeight;
                Ball.pVelocity.Y = -Ball.pVelocity.Y;
            }


 if (Ball.pRectangle.Right > Paddle.GetRectangle.Left && Ball.pRectangle.Right <     Paddle.GetRectangle.Right)
            { //intersecting left of paddle
                //WORKING
                Ball.pPosition.X = Paddle.GetRectangle.Left - Ball.pWidth;
                Ball.pVelocity.X = -Ball.pVelocity.X;
            }

 if (Ball.pRectangle.Left < Paddle.GetRectangle.Right && Ball.pRectangle.Left > Paddle.GetRectangle.Left)
            { //intersecting right of paddle
                //NOT WORKING
                Ball.pPosition.X = Paddle.GetRectangle.Right + Ball.pWidth;
                Ball.pVelocity.X = -Ball.pVelocity.X;
            }
        }

1 个答案:

答案 0 :(得分:1)

问题不在于球被挡在游戏窗底部和球拍之间,而是在球拍内卡住了。

当您从顶部检测到击球时,通过将球的Y坐标设置在球拍上方来避免这种情况。

如果您检测到球拍底部的击球,则必须将球的Y坐标设置为球拍下方。

同样地,如果你从侧面击中,你必须设置球的X坐标,以便它在桨的外面。

重点是击中面板后球不能相互接触,否则会立即检测到第二击。