突破桨与角度碰撞

时间:2015-11-24 18:45:14

标签: c# winforms 2d-games

我知道互联网上有很多这方面的内容,我已经看了很多,但是我无法使用我的代码。我有点知道它背后的数学,但又一次努力将它变成代码。 我有2个速度变量用于球float xSpeed, ySpeed。两者都等于3(或-3取决于碰撞 - 我只有基本的碰撞atm)。我还使用了一个矩形球ballRect以及球拍paddleRect。 我更新了这个位置:

ballRect.X += xSpeed; ballRect.Y += ySpeed;

我已经找到了一些代码,并尝试自己做,但他们真的很麻烦。人们会(我认为)在第一次打击时工作,但是当它到达下一击时,它会坚持使用桨。

double relativeBallPos = (paddleRect.X + ballRect.X);
        double ballVelx = xSpeed;
        double ballVely = ySpeed;

        double angleRads = Math.Tan((ballVelx / relativeBallPos));
        double angleInDeg = angleRads * (180 / Math.PI);
        double angleOfReflection = (angleInDeg * 2);

        ballVelx = ballVelx * angleOfReflection;


        if (ballRect.X + (ballRect.Width / 2) < paddleRect.X + (paddleRect.Width / 2))
        {
            xSpeed = (float)-ballVelx;
        }
        else if (ballRect.X + (ballRect.Width / 2) > paddleRect.X + (paddleRect.Width / 2))
        {
            xSpeed = (float)ballVelx;
        }

(这在一个(可能是不正确的)角度下降,在第一次击中后直接上升) 感谢您的帮助:))

2 个答案:

答案 0 :(得分:1)

如果您的球与任何水平阈值(砖块或桨叶的水平边)相交,则否定ySpeed。如果它与任何垂直阈值相交,则否定xSpeed。在那里,现在你有一个功能突破游戏。

你可以根据球撞击球的角度,根据碰撞位置改变球的角度来增加更多的润色,中心是完全反射(即否定ySpeed)和{{ 1}}得到距离中心的距离(正或负)的因子。

答案 1 :(得分:1)

是的,你所看到的是完全正常的,如果你的物体移动非常快并且游戏嘀嗒速度很慢,你可能会有一些毛刺,比如粘在桨上甚至完全错过桨,直接穿过。< / p>

错过划桨的解决方案是增加游戏刻度速度,即过程游戏更频繁地移动。

通过及时回退物体运动可以减轻球到桨的粘性。例如,您有对象A和B,它们在某个时间点发生碰撞。如果你只是简单地改变他们的X和Y速度,你可能会在下一个时间点再次发生碰撞,这样你就可以再次反转他们的速度,等等,这看起来好像被卡住了。它有时会卡在一个轴上,所以它会在桨上滑动,然后直接向下,这只是同一问题的另一个副作用。

如何回滚?你知道A在哪里移动,并假设B是一个桨,所以它是静态的。你知道A目前正与B发生碰撞。您可以计算A运动的向量,并通过该向量反向滑回A.例如,如果屏幕的左上角为(0,0),并且A以X=+10,Y=+10的速度移动,则会将其向后移动整个步骤(取决于您想要的复杂程度)顺其自然),所以(-10,-10)或其中的一小部分。您可以使用交叉矩形来计算精确值,并且仅移动足够的距离以使对象几乎不接触。

理想情况下,您可以在击中表面上反射矢量(使用物理,即命中角度=反射角度),然后在应用新速度之前,以不与桨碰撞的方式移动球。为简化起见,您可以假设您的命中曲面是水平的并且只是一条直线,因此您的反射公式非常简单。

这里很好地介绍了这个主题(尽管使用XNA,同样的原则适用):