嘿家伙我正在制作Paddle / Pong游戏,现在我正试图找出如何在我的球拍与球之间进行精确碰撞..目前如果球击中左侧设置x速度则是基本碰撞和y速度..等但我想弄清楚如何使它在一个方向上反弹,可以说如下图所示:
有没有办法做到这一点?任何帮助都将非常感激。
答案 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;
}