6

我有一个会在墙壁上反弹的球。这个反弹很简单,我就是这样做的,(代码片段)

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

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

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

对不起我的蹩脚照片,我希望它们有意义。我的数学很生疏,这就是为什么我真的需要朝着正确的方向努力。

4

4 回答 4

9

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

如果你想用简单的方法来做,这里是 c++ 中的代码,它准确地描述了如何做你正在寻找的东西。

编辑


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

于 2012-01-03T16:54:31.437 回答
7

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

于 2012-01-03T16:55:30.513 回答
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/

于 2012-01-03T17:25:39.047 回答
1

此代码演示了如何通过使用 和 反转球的方向或朝向,将球反弹回或向另一个 X方向Y反弹。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;

}
于 2012-01-03T17:23:11.840 回答