首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java将不同的反射点分配到桨的不同部分

Java将不同的反射点分配到桨的不同部分
EN

Stack Overflow用户
提问于 2013-05-23 15:45:10
回答 3查看 1.2K关注 0票数 3

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

(球拍的边缘将与击打桨中部的效果不同)

桨扩展了Rectangle2D,所以我可以使用RecTangle2D的intersects()方法来确定球是否触及了它的任何部分。

能确定球在桨上的确切位置吗?

我打算做的是,

  • 在此基础上计算入射角和反射角。
  • 如果球击中了划桨上的x点.我会相应地改变反射角度。

谢谢

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-05-23 15:52:44

能确定球在桨上的确切位置吗?

如果是我,我会抓住当前的协调球和桨。对于桨,你可以得到两组y坐标,用来描述面向球的线。Ie:

代码语言:javascript
复制
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.

然后,您可以将桨的中点计算为:

代码语言:javascript
复制
int paddleYMid = (paddleY1 + paddleY2) / 2;

你可以通过比较y坐标来找出球是击中了桨的左边还是右边。Ie:

代码语言:javascript
复制
if(ball.y > paddleYMid)
{
   // Right side of the paddle.
}
else
{
   // Left side of the paddle.
}

然后由你来进一步完善。

票数 1
EN

Stack Overflow用户

发布于 2013-05-23 16:04:45

由于桨总是垂直的(平行于Y轴),球与桨的碰撞点将发生在与球的中心相同的y坐标上。这就是:

代码语言:javascript
复制
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速度的原始值。例如,要模拟完美的弹性碰撞,只需做:

代码语言:javascript
复制
ball.velocityX = -ball.velocityX;

为了考虑球在一个更高或更低的角度上的反射,你可以根据碰撞的位置从桨的中心缩放y的速度,例如。

代码语言:javascript
复制
ball.velocityY += SCALE_CONSTANT * (ball.centerY - ((paddle.topY + paddle.bottomY) / 2));
票数 0
EN

Stack Overflow用户

发布于 2013-05-23 17:24:37

为了找到球击中桨的确切位置,你可以把这个问题描述成一个线交问题。桨可以表示为一条垂直线在x坐标(如果需要+厚度,并纠正球直径)的桨。然后,球可以被表示为沿其运动矢量的一条线(这条线可以简单地由它当前的位置和它的下一个位置来定义,如果它不受阻碍地移动的话)。

这个问题现在可以用线交算法来解决。

由于桨是一条垂直线,所以方程可以简化为只回答Y将球通过桨X的问题。这也是一个常见的问题,并通过直线裁剪来解决:clipping (交点也可以直接计算,但我找不到公式atm)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16718348

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档