【问题标题】:Breakout paddle collision with angle带角度的突围桨碰撞
【发布时间】:2015-11-25 03:30:15
【问题描述】:

我知道互联网上有很多关于此的内容,并且我已经查看了很多内容,但我无法让它与我的代码一起使用。我有点知道它背后的数学原理,但再次努力将它变成代码。 我有 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;
        }

(这会以一个(可能不正确的)角度发生,并且在第一次击球后直接向上) 感谢您的帮助:)

【问题讨论】:

    标签: c# winforms 2d-games


    【解决方案1】:

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

    您可以根据沿球的碰撞位置改变球撞击桨时的角度来添加更多抛光,中心是完全反射(即否定ySpeed)和xSpeed得到距离中心的距离(正或负)的一个因素。

    【讨论】:

    • “你可以通过改变球击中桨时的角度来增加一点抛光”这就是我对自己的尝试。 (把代码放在我的帖子里)
    【解决方案2】:

    是的,您所看到的是完全正常的,如果您的物体移动非常快而游戏滴答速度很慢,您可能会出现卡在桨上甚至完全错过桨等故障,然后直接通过。

    缺少拨片的解决方案是提高游戏滴答速度,即更频繁地处理游戏移动。

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

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

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

    这里很好地涵盖了这个主题(虽然使用 XNA,但同样适用):

    【讨论】:

      猜你喜欢
      • 2013-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-29
      相关资源
      最近更新 更多