我正在用Java做乒乓球,并希望通过为桨的每个部分分配不同的反射逻辑来使游戏更有趣,如下所示:
(球击中桨的外边缘会产生与撞击桨中间不同的效果)
paddle延伸Rectangle2D所以我可以使用Rectangle2D的intersects()
方法来确定球是否触及了它的任何部分......
是否有可能确定球击中球的确切位置?
我打算做的是,
由于
答案 0 :(得分:1)
是否可以确定球在击球板上的确切位置?
如果是我,我会抓住球和球拍的当前坐标。对于球拍,您可以获得两组y坐标,以描述面向球的线。即:
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坐标来确定球是否击中了球拍的左侧或右侧。即:
if(ball.y > paddleYMid)
{
// Right side of the paddle.
}
else
{
// Left side of the paddle.
}
然后由你来进一步完善。
答案 1 :(得分:0)
由于桨叶始终是垂直的(与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));
答案 2 :(得分:0)
要找到球击中球拍的确切位置,您可以将问题表述为线交叉问题。 桨叶可以表示为桨叶的x坐标处的垂直线(如果需要,则为厚度,并且针对球直径进行校正)。然后球可以表示为沿着其运动矢量的一条线(如果它移动不受影响,该线可以简单地由其当前位置和下一个位置定义)。
现在可以使用线交叉算法解决问题。
由于桨是一条垂直线,所以方程式可以简化为只回答Y球将通过球拍X的问题。这也是线路裁剪遇到和解决的常见问题:http://en.wikipedia.org/wiki/Line_clipping(交点也可以直接计算,但我找不到公式atm)。