【问题标题】:Bouncing Ball logics弹跳球逻辑
【发布时间】:2012-02-01 16:32:07
【问题描述】:

我有一个会在墙上反弹的球。这个弹跳很简单,我就是这么做的,(代码sn-p)

if ( x - moveSpeed < 0 ) // Ball hit left wall
    xVel *= -1;

但是我也得到了一个玩家移动的矩形。弹跳实际上就像墙上的弹跳一样。

但我发现当一个球的运动与图片相似时,我不可能让它再次直线上升。因此,我需要对矩形运动进行某种计算,以影响球的射出角度。矩形在移动时始终具有恒定的移动速度。这张图片显示了一个向左移动的矩形,球在其移动过程中击中它,从而形成 90 度角。 (不应该总是 90)。

抱歉我的蹩脚图片我希望它们有意义。我的数学很生疏,这就是为什么我真的需要朝着正确的方向前进。

【问题讨论】:

  • 提供一些您在此尝试的代码 ^_^
  • 你想要准确的物理还是只是比当前行为“感觉更好”的东西?
  • 欧几里得向量和勾股定理对于像这样的简单物理来说应该足够了。

标签: c++ algorithm game-physics bounce


【解决方案1】:

这是一个关于一些物理学的教程(这是你需要知道的),你需要了解向量。本教程并未详细介绍您正在寻找的内容(反弹和角度的反射),但这是一个很好的开始,因为您需要了解所有这些才能完成您的项目。Game Physics 101

如果您想以简单的方式做到这一点,here 是 c++ 中的代码,它准确地描述了如何做您正在寻找的事情。

编辑


您实际上应该首先查看第二个链接,它是关于您需要了解的内容的教程。但是,如果您想做的不仅仅是让球四处弹跳,比如包括其他移动物体或类似的东西,请查看第一个链接。

【讨论】:

  • 在撰写此评论时代码已转置为 JS,我还没有找到 C++ 版本。
【解决方案2】:

这里不需要任何花哨的数学。我对这些类型的游戏的理解是,球离开桨的角度取决于它在桨上的反弹位置。如果它在中间反弹,则保留当前角度。当它弹跳到更靠近桨的边缘时,角度会在桨的那一侧进行调整。把桨想象成一个圆形的表面。

【讨论】:

  • 得到的角度不会基于“桨”的速度吗?
  • 记住打乒乓球,即使球拍是静止的,如果球在接近尾端时击中,该方向的角度会受到很大影响。我认为@Treebranch 是对的。我认为球拍在击球时的运动并没有影响它——只有球击中的地方。
  • 感谢您提供这种简单的方法,如果 gabes 的回答对我的游戏来说有点夸张,我一定会这样做。
  • 我会给你正确的答案,因为这是我最终使用的解决方案。
【解决方案3】:

此代码演示如何通过将球的XY 标题与ball.headingX=-ball.headingXball.headingY=-ball.headingY 反转来将球反弹回或向另一个方向反弹。

理论付诸实践:

/* update ball's x heading */
ball.x+=ball.headingX;

/* update ball's y heading */
ball.y+=ball.headingY;

/* if ball at most right of screen then reverse ball's x heading */
if( (ball.x>PONG_SCREEN_RIGHT) )
{
    ball.headingX=-ball.headingX;

}

/* check if ball's location at top or bottom of screen,if true reverse ball's y heading */
if( (ball.y<PONG_SCREEN_TOP) || (ball.y>PONG_SCREEN_BOTTOM-2) ) 
{
   ball.headingY=-ball.headingY;
}



/* check if ball lands on pad, if true bounce back */
if ( (ball.y>= PlayersPad.LEFT) && (ball.y<= PlayersPad.RIGHT) && (ball.x==PlayersPad.x))
{
    ball.headingX=-ball.headingX;
    playersScore+=10;
}

/* let computer track ball's movement */
if (ball.x>PONG_SCREEN_RIGHT-18) computersPad.y=ball.y;


/* check if ball misses pad, if true display you missed */
if (ball.x<PONG_SCREEN_LEFT)
{
    displayYouMissed();
    ball.x=ball_Default_X;
    ball.y=ball_Default_Y;

}

【讨论】:

  • 通过使用 ball.headingX=-ball.headingX 和 ball.headingY=-ball.headingY 展示如何反转球的航向。
【解决方案4】:

走模拟实际物理的路线(与@Treebranche 的回答相反,我认为这类游戏真正起作用)可能会变得非常复杂。您可以考虑摩擦、旋转、接触持续时间等。这里有几个讨论这个问题的链接。

https://physics.stackexchange.com/questions/11686/finding-angular-velocity-and-regular-velocity-when-bouncing-off-a-surface-with-f

https://physics.stackexchange.com/questions/1142/is-there-a-2d-generalization-of-the-coefficient-of-restitution/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-23
    • 2012-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-28
    • 2020-07-12
    相关资源
    最近更新 更多