我正在用Java制作乒乓,并希望通过为桨的每个部分分配不同的反射逻辑来使游戏更有趣,如下所示:
(球拍的边缘将与击打桨中部的效果不同)

桨扩展了Rectangle2D,所以我可以使用RecTangle2D的intersects()方法来确定球是否触及了它的任何部分。
能确定球在桨上的确切位置吗?
我打算做的是,

谢谢
发布于 2013-05-23 15:52:44
能确定球在桨上的确切位置吗?
如果是我,我会抓住当前的协调球和桨。对于桨,你可以得到两组y坐标,用来描述面向球的线。Ie:
int paddleY1 = paddle.y;
int paddleY2 = paddle.y + paddle.width;
// assuming the paddle can only go up and down, y is the only co-ordinate that matters.然后,您可以将桨的中点计算为:
int paddleYMid = (paddleY1 + paddleY2) / 2;你可以通过比较y坐标来找出球是击中了桨的左边还是右边。Ie:
if(ball.y > paddleYMid)
{
// Right side of the paddle.
}
else
{
// Left side of the paddle.
}然后由你来进一步完善。
发布于 2013-05-23 16:04:45
由于桨总是垂直的(平行于Y轴),球与桨的碰撞点将发生在与球的中心相同的y坐标上。这就是:
if (ball.centerX - ball.radius <= paddle.rightX && ball.velocityX < 0)
{
// collision point, if any, is at (ball.centerX - ball.radius, ball.centerY)
if (ball.centerY >= paddle.bottomY && ball.centerY <= paddle.topY)
{
// handle collision
}
}至于碰撞本身的处理,你可能不必处理反射角度等问题,而只需处理x和y速度的原始值。例如,要模拟完美的弹性碰撞,只需做:
ball.velocityX = -ball.velocityX;为了考虑球在一个更高或更低的角度上的反射,你可以根据碰撞的位置从桨的中心缩放y的速度,例如。
ball.velocityY += SCALE_CONSTANT * (ball.centerY - ((paddle.topY + paddle.bottomY) / 2));发布于 2013-05-23 17:24:37
为了找到球击中桨的确切位置,你可以把这个问题描述成一个线交问题。桨可以表示为一条垂直线在x坐标(如果需要+厚度,并纠正球直径)的桨。然后,球可以被表示为沿其运动矢量的一条线(这条线可以简单地由它当前的位置和它的下一个位置来定义,如果它不受阻碍地移动的话)。
这个问题现在可以用线交算法来解决。
由于桨是一条垂直线,所以方程可以简化为只回答Y将球通过桨X的问题。这也是一个常见的问题,并通过直线裁剪来解决:clipping (交点也可以直接计算,但我找不到公式atm)。
https://stackoverflow.com/questions/16718348
复制相似问题