当与Rectangle碰撞时,球会卡住

时间:2013-12-11 00:47:59

标签: c# xna collision-detection physics bounding-box

我目前遇到的一个新问题是,当球在屏幕周围弹跳时,它可能会突然卡住与矩形碰撞,因此可能会碰到矩形与屏幕侧面之间的位置。这有时会导致以下两种情况:a)球看起来像是在摇晃或其他东西,我假设因为它仍然与矩形碰撞,它的速度(正如我已经定义的那样)不断反转......但它仍然卡住了...... (这就是我无法解决的问题...... lol :(),或者b)当球与矩形碰撞时,它开始沿着矩形的边缘移动并前后移动但是它继续这样做...... (所以它基本上沿着边缘移动了。)

我已经向youtube上传了一个视频,显示了这一点(顺便说一下......球卡住并在屏幕右侧上下移动,然后开始沿着白色矩形的顶部边缘移动,然后最终反弹忘掉了...好吧基本上可以解放自己,这有点好,但是如果再等5秒钟,它会重复这个过程)

http://www.youtube.com/watch?v=3qfpgtoWbIU&feature=youtu.be

我用于与矩形进行碰撞检测的代码是:

if (theBall.GetRectangle.Bottom >= cornerSquare.GetRectangle.Top && theBall.GetRectangle.Bottom <= cornerSquare.GetRectangle.Bottom)
{
    theBall.pVelocity.Y = -theBall.pVelocity.Y;
}

如果球击中矩形的顶部则用于检测。

屏幕右侧的检测是:

if (pPosition.X + pTexture.Width >= screenWidth)
{
    pVelocity.X = -pVelocity.X;
}

我希望有人有一个简单而有效的解决方案,因为我只是想要“完成”所有这些碰撞检测废话大声笑......因为它占用了我的大部分时间,而我可能会更有效率地做其他事情游戏的一部分。

感谢阅读,花时间阅读,花时间帮助...... ETC ....:D

2 个答案:

答案 0 :(得分:2)

尝试使用计算的测试矩形首先检查碰撞。

例如,每次更新时球移动Vector2(1,1)。在移动之前,找出下一步中碰撞矩形的位置。

int nextPosX = currRect.X + (int)movementVector.X;
int nextPosY = currRect.Y + (int)movementVector.Y;

// find out where the rectangle would be after this update:
Rectangle nextStepsCollisionRect = new Rectangle(nextPosX, nextPosY, width, height);

// check if the test rectangle would collide:
if( collisionTest(nextStepsCollisionRect, sideWall) )
{
    // do not move the intended way!
    // invert X and recalc with pre-calculated rectangle again...
} else {
    // no collision. now move the caculated way:
    ball.CollisionRectangle = nextStepsCollisionRect;
}

这是一种非常简单的方法。如果球是一个非常快的子弹(只是要提到),请使用“射线追踪”。

答案 1 :(得分:1)

如果你的球沿着边缘被卡住,你可以简单地将球位置在碰撞前的前一个位置(前一帧中的球位置),这样你就可以改变它的速度并确保球没有再碰撞,这应该可以解决问题 您可以通过将球速减去球位来实现此目的。