【发布时间】:2011-10-17 00:26:37
【问题描述】:
嘿,伙计,我正在制作一个桨/乒乓球游戏,现在我正在尝试找出如何在我的桨和我的球之间进行精确碰撞。目前如果球击中左侧设置 x 速度,这是基本碰撞和 y 速度.. 等等,但我想弄清楚如何让它在一个方向上反弹,可以这么说,如下图所示:
有没有办法做到这一点?任何帮助将不胜感激。
【问题讨论】:
标签: c# xna collision-detection
嘿,伙计,我正在制作一个桨/乒乓球游戏,现在我正在尝试找出如何在我的桨和我的球之间进行精确碰撞。目前如果球击中左侧设置 x 速度,这是基本碰撞和 y 速度.. 等等,但我想弄清楚如何让它在一个方向上反弹,可以这么说,如下图所示:
有没有办法做到这一点?任何帮助将不胜感激。
【问题讨论】:
标签: c# xna collision-detection
可以通过否定y 速度并保持x 速度来处理您的示例。
球和桨角之间的碰撞更加困难。您需要找到确切的碰撞点,然后计算从球中心到碰撞点的向量。最后取反沿该轴的速度,同时保持组件在正交轴的方向上。
【讨论】:
也要小心重影。我的意思是球的速度可以足够大,以至于没有任何帧(或更新例程调用)在其中球与球棒实际相交,因此您不会检测到碰撞。看我的插图。在其中,两个不同框架中的球确实与球棒相交,即使没有直接相交。这样做的结果将是球“穿过”球棒并神奇地出现在另一侧。
要解决这个问题,不能用球的位置来计算是否有交叉点,需要计算每一帧球的新旧位置的差值,看看那条线是否(差异)在任何点与球棒相交。
解决这个问题的简单方法是将蝙蝠视为一条水平线,然后您可以进行简单的线-线交叉检查。如果它们相交,就会发生碰撞。更复杂的方法是进行线/矢量矩形相交。这样做的好处是您还可以检测与角落的碰撞,这是乒乓球/突围比赛的重要组成部分。
【讨论】:
我知道这对你目前的情况没有帮助,但你可以尝试使用像 Farseer 这样已经制作好的物理引擎来非常轻松地为你处理这些碰撞。
【讨论】:
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;
}
【讨论】: