Java Pong - 为桨的不同部分分配各种反射点

时间:2013-05-23 15:45:11

标签: java swing

我正在用Java做乒乓球,并希望通过为桨的每个部分分配不同的反射逻辑来使游戏更有趣,如下所示:

(球击中桨的外边缘会产生与撞击桨中间不同的效果)

enter image description here

paddle延伸Rectangle2D所以我可以使用Rectangle2D的intersects()方法来确定球是否触及了它的任何部分......

是否有可能确定球击中球的确切位置?

我打算做的是,

  • 根据...
  • 计算入射角和反射角
  • 如果球击中桨叶上的点x ...我会相应地改变反射角度

enter image description here

由于

3 个答案:

答案 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)。