3

我正在编写一个 Pong 游戏,但遇到了一个问题。

我试图弄清楚如何从一条线上反弹一个点。

我能想到的最好的方法是

  • 计算球的当前和未来位置。
    • 线段:{Ball.location, Ball.location + Ball.direction}(Ball.location 和 Ball.direction 使用自定义矢量/坐标类)
  • 计算生成的线段是否与任何墙壁或桨相交。
    • ???还不知道该怎么做(将在单独的问题中提问)
  • 在找到的第一个路口
    • 将球弹离底线
      • 创建一个三角形
        • a = 球的当前位置
        • b = 线的交点。
        • c = 最接近球在线上当前位置的点。
      • 找出球击中线的角度
        • 角度 = cos(距离(b,c)/距离(a,b))
      • 找到旋转球方向的角度
        • (90-角度)*2
      • 旋转球的方向并将其移动到新位置
        • 暂时忽略到达线的距离,不需要完全在线
  • 否则,如果没有交叉点
    • 将球移动到它的新位置。

这是一种可以接受的方法还是我错过了什么?

4

6 回答 6

5

你只需要检查球的中心是否在球拍的半径范围内,就可以判断它是否有时间反弹。有一个较老的问题,在计算反弹角度时有几个答案。

于 2009-05-14T00:13:48.323 回答
3

如果您想要真实的 Pong 感觉,那么计算新矢量比进行真实反射要容易得多。Pong 只是反转 dx 或 dy 的符号。如果球击中水平障碍,则否定 dy。垂直,然后否定 dx。

于 2009-05-14T00:15:21.080 回答
1

在您的游戏循环中,计算新球的位置,就好像没有统计信息一样。
然后检查新位置是否与骨缘相交或过去。如果满足任一条件,则通过将其从固定器上弹回来计算新的球位置。

在给定起点、角度和距离的情况下计算点的方法会派上用场:

Public Function TranslatePoint(ByVal tStartPoint As Point, _
ByVal tAngle as Decimal, ByVal tDistance As Decimal) As Point
于 2009-05-14T00:10:55.067 回答
0

您可能对N 教程感兴趣,其中讨论了游戏“N”中使用的碰撞检测和响应(包括反弹和摩擦)。

这些教程可能比你特别需要的更深入,但它们写得很好并且有交互式示例——简单的反弹是第一个主题。

于 2009-05-14T03:00:43.270 回答
0

这是我要做的:

1)假设你的乒乓边在线 x=a 和 x=b

2) 让你的球位置为 (x0, y0) 并在 Ax+By=C 线上行进

3)据此,您可以轻松计算(x1,y1)该线与墙相交的点

4) 知道(x0, y1+y0) 是反弹后的反射,就可以得到反弹后的直线方程。(球在交点下方 y1-y0 处,因此将在交点上方 y1+y0 处。)

5)给定两个方程,您可以绘制点(假设您知道速度)。

于 2009-05-14T00:14:43.157 回答
0

弹跳是物理领域的问题,而不是图形领域的问题。因此 OpenGL 并没有为它提供真正的支持。如果您查看硬件,您会注意到已经有类似于视频卡的单独物理卡,尽管最近的趋势是集成它们。

于 2009-05-14T08:20:02.597 回答