重力无法正常工作
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
- 它似乎不会影响弹跳问题,但只是为了弄清楚那是什么。
我游戏中的物理代码是这样的:
-- 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
- 它似乎不会影响弹跳问题,但只是为了弄清楚那是什么。