C#XNA精确碰撞?

时间:2011-10-08 11:53:46

标签: c# xna collision-detection

嘿家伙我正在制作Paddle / Pong游戏,现在我正试图找出如何在我的球拍与球之间进行精确碰撞..目前如果球击中左侧设置x速度则是基本碰撞和y速度..等但我想弄清楚如何使它在一个方向上反弹,可以说如下图所示:

enter image description here

有没有办法做到这一点?任何帮助都将非常感激。

4 个答案:

答案 0 :(得分:2)

您的示例可以通过否定y速度并保持x速度来处理。

球与球拍角落之间的碰撞更加困难。您需要找到确切的碰撞点,然后计算从球心到碰撞点的矢量。最后,在保持元件在正交轴方向的同时,否定沿该轴的速度。

答案 1 :(得分:1)

小心鬼影。而且我的意思是球的速度可以足够大,以至于没有任何球(或更新例程调用)球实际上与球棒相交,所以你不会发现碰撞。看看我的插图。在其中,即使没有直接交叉,两个不同框架中的球确实与蝙蝠相交。结果就是球“穿过”蝙蝠并神奇地出现在另一侧。

要解决这个问题,你不能用球的位置来计算是否有一个交叉点,你需要计算每一帧球的新旧位置之间的差异,看看是否有那条线(差异)在任何一点与蝙蝠相交。

解决这个问题的简单方法是将球棒视为水平线,然后您可以进行简单的线 - 线交叉检查。如果它们相交,则发生碰撞。更复杂的方法是进行直线/矢量矩形交叉。这样做的好处是你还可以检测到角落的碰撞,而这些角落是乒乓/突破游戏的重要组成部分。

答案 2 :(得分:0)

我知道这对你目前的情况没什么帮助,但是你可以尝试使用像Farseer这样的物理引擎来轻松处理这些碰撞。

答案 3 :(得分:0)

protected override void Update(GameTime gameTime)
{
    ballrect = new Rectangle((int)ballpos.X, (int)ballpos.Y,
                             ball.Width, ball.Height);

    paddlerect = new Rectangle((int)paddlepos.X, (int)paddlepos.Y,
                               paddle.Width, paddle.Height);

    ms = Mouse.GetState();
    paddlepos.X = ms.X;

    if (ballrect.Intersects(paddlerect))
    {
        bhpaddle();
    }

    ballpos += ballvel;

    if (ballrect.Y>= paddlerect.Y)
    {
        ballpos = new Vector2(400, 480);
        bhpaddle();
        ballpos += ballvel;
        l--;
    }

    base.Update(gameTime);
}



public void bhpaddle()
{
    ballvel.Y *= -1;
}