2012-01-03 111 views
6

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

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

但是我也得到了一个玩家移动的矩形。这种反弹实际上是在墙壁上反弹时起作用的。

但我想通了,当球得到了类似的运动为图片,它不可能为我让它再次走直线上升。因此,我需要一些关于矩形运动的计算来影响球的输出角度。移动时矩形始终具有恒定的移动速度。这张图片显示了一个矩形向左移动,并且球在其移动过程中击中它,这导致90度角。 (它不应该总是90)。

对不起我的蹩脚的照片,我希望他们是有意义的。我的数学是生锈的,这就是为什么我真的需要在正确的方向推动。

+4

什么是这里的问题? – 2012-01-03 16:49:48

+1

在此提供一些您的尝试代码^ _^ – Gabe 2012-01-03 16:51:39

+1

您是否想要准确的物理或只是比当前行为“感觉更好”的东西? – Howard 2012-01-03 16:53:39

回答

6

这里不需要任何花哨的数学。我对这些类型的比赛的理解是球从球拍上脱落的角度取决于球拍在球拍上反弹的位置。如果它在中间弹跳,则保持当前角度。当它靠近桨的边缘反弹时,角度沿着桨的那一侧的方向进行调整。把桨看成圆形的表面。

+0

这不是它在我的世界中的作用。 – 2012-01-03 16:58:48

+0

产生的角度不是基于“桨”的速度吗? – Kekoa 2012-01-03 17:02:21

+4

记住打乒乓球,即使桨是静止的,如果球击中球头附近,角度受到很大影响。我认为@Treebranch是对的。我认为冲击时桨的运动不会影响它 - 只有在球击中的位置。 – hatchet 2012-01-03 17:05:47

9

这里是一些物理学教程(这是你需要知道的),你需要了解矢量。本教程没有详细介绍你正在寻找的东西(反射和角度的反映),但这是一个很好的开始,因为你需要知道所有这些才能完成你的项目。 Game Physics 101

如果您想以简单的方式执行此操作,here是C++中的代码,它描述了如何执行所需操作。

编辑


你实际上应该检查出的第二个链接第一,它是一个教程,你需要知道什么。但是如果你想要做的不仅仅是让球反弹,还要说包括其他运动物体或类似物,请查看第一个链接。

+2

+1优秀教程 – Offirmo 2012-01-03 17:10:42

+1

如前所述,优秀教程! – 2012-01-03 17:47:49

+0

在撰写本评论时代码已转换为JS,我还没能找到C++版本。 – Funk247 2014-02-17 18:01:00

1

此代码演示了如何拍球通过颠倒球的XYball.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; 

} 
+0

这段代码如何回答这个问题? – Howard 2012-01-03 17:26:04

+0

通过显示如何用ball.headingX = -ball.headingX和ball.headingY = -ball.headingY来反转球的标题。 – 2012-01-03 17:33:48

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/