平滑游戏中的2D平滑转向

我正在做一个2D 顶视图的基于网格的游戏。 在由不同的瓷砖组成的栅格上滚动的球。 瓷砖以各种方式与球相互作用。

我有困难干净地实施翻转瓷砖。 下面的图片代表网格中的一个单独的瓦片,它将球转向一个直角。

转动瓷砖

如果球从底部滚入,它顺利地改变方向并向右滚动。 如果从右侧滚入,则会平稳地转到底部。 如果球从顶部或者左边滚入,其轨迹保持不变。

瓷砖不应该改变球的速度的大小 – 只改变它的方向。

球具有速度和位置向量,并且瓦具有位置和维度向量。

我已经实现了这一点,但代码是混乱和越野车。 什么是一个优雅的方式来实现这一点,最好通过公式修改球的速度vector?

Solutions Collecting From Web of "平滑游戏中的2D平滑转向"

我假设你知道如何找出球何时进入特定的瓦片。 根据球进入瓦片的哪一侧,你应该移动它,直到球离开特定瓦片。 根据您的问题,当您检测到从上或左边进入的球时,您只需让它移动而不改变其速度。 我们假设球从右边进入,你应该让球移动四分之一圈。 有两种可能的情况:

  1. 如果你不使用物理引擎进行球运动,或者你不介意设置球的位置,你应该使用一个临时variablestheta ,并根据时间过去增加它,这里是确切的公式:

     theta += delta_time * (Ball_speed / Circle_radius) position = circle_center + circle_radius * vec2(sin(theta), cos(theta)) 

    其中circle_radius等于网格宽度的一半,在您的示例中, circle_center是平铺的右下角

  2. 如果你正在使用一个物理引擎,而你又不想弄乱它,那么你应该使用力量来保持球在轨道上。 在这种情况下,您应该根据以下公式计算每个更新的加速度:

     acceleration = (Circle_center - Ball_position) * (Ball_speed ^ 2) / (circle_radius ^ 2) 

    这次circle_radius是球位置和圆心的距离。 我知道它应该等于半块大小,但是由于各种计算错误,球可能会移出它的一点path,而使用dynamic距离只会有一点帮助。 我仍然建议当它要离开这个瓷砖的时候强行设置球的位置。

如果球从下边缘进入,在第一种方法中,你应该减lesstheta,而不是增加每一帧。 但是你不需要在第二种方法中改变任何东西。