重力无法正常工作

Gravity not working correctly

我游戏中的物理代码是这样的:

    -- dt = time after each update
    self.x = math.floor(self.x + math.sin(self.angle)*self.speed*dt)
    self.y = math.floor(self.y - math.cos(self.angle)*self.speed*dt)
    -- addVector(speed,angle,speed2,angle2)
    self.speed,self.angle = addVector(self.speed,self.angle,g,math.pi)`

落地后反弹的代码是:

    self.angle = math.pi - self.angle
    self.y = other.y - self.r`

函数 addVector 在此处定义:

    x = math.sin(angle)*speed + math.sin(angle2)*speed2
    y = math.cos(angle)*speed + math.cos(angle2)*speed2
    v = math.sqrt(x^2 + y^2)
    a = math.pi/2 - math.atan(y,x)
    return v,a

但是当我在模拟中放置一个没有任何阻力或弹性的球时,每次弹跳后球的高度都会越来越高。知道可能导致问题的原因吗?

编辑:self.r是半径,self.x和self.y是球心的位置。

你的Y轴向下增加向上减少。
self.y = math.floor(..) 使你的球每帧向上移动一点。
解决方案是以最大精度存储您的坐标。
您可以创建新变量 y_for_drawing = math.floor(y) 以在具有整数坐标的像素处绘制球,但您的主要 y 值必须具有小数部分。

我已经设法让您的代码 运行 重现您所看到的行为。我也发现很难弄清楚这个问题。原因如下:运动物理学涉及位置,位置受速度矢量影响,而速度矢量又受加速度矢量影响。在您的代码中,这些都在那里,但绝不是明确分开的。 trig 函数和 floor 函数都以某种方式相互作用,因此很难看出它们在最终位置计算中扮演什么角色。

迄今为止,帮助您实现基础物理学的最好、最容易理解的教程是 The Nature of Code(免费在线阅读,带有交互式示例)。作为练习,我将大部分早期练习移植到 Lua 中。我建议你看看他是如何清楚地将位置、速度和加速度计算分开的。

作为实验,将 g 增加到更高的数字。当我这样做时,我注意到球最终会落到地面上,但当然弹跳太快了,它没有以一种看起来很自然的方式弹跳。

此外,定义 other.y - 它似乎不会影响弹跳问题,但只是为了弄清楚那是什么。