弹跳球逻辑

时间:2012-01-03 16:47:56

标签: c++ algorithm game-physics bounce

我有一个弹跳墙的球。这种反弹很简单,我只是这样做,(代码片段)

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

然而,我还有一个玩家移动的矩形。这种反弹实际上就像在墙上反弹一样。

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

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

4 个答案:

答案 0 :(得分:9)

这是一个关于某些物理学的教程(这是你需要知道的),你需要学习矢量。本教程并没有完全按照你要求的内容(反弹和角度反映),但这是一个很好的开始,因为你需要知道这一切才能完成你的项目。Game Physics 101

如果你想以简单的方式做到这一点,here是c ++中的代码,它描述了如何做你想要的事情。

修改


你应该首先检查第二个链接,它是一个关于你需要知道什么的教程。但是如果你想做的不仅仅是让球反弹,比如包括其他移动的物体或类似物,请查看第一个链接。

答案 1 :(得分:6)

这里不需要任何花哨的数学。我对这些类型的比赛的理解是球从球拍离开的角度取决于它在球拍上反弹的位置。如果它在中间反弹,则保留当前角度。当它靠近桨叶的边缘弹跳时,角度在桨叶的那一侧的方向上调节。将桨叶看作圆形表面。

答案 2 :(得分: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/

答案 3 :(得分:1)

此代码演示了如何通过使用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;

}