重力无法正常工作

时间:2018-07-28 06:51:28

标签: lua game-physics

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

    -- 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是球中心的位置。

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

我设法使您的代码运行并重现了您所看到的行为。我也发现很难解决这个问题。原因如下:运动物理学涉及位置,该位置受速度矢量的影响,而速度矢量又受加速度矢量的影响。在您的代码中,所有这些都存在,但没有明确分开。触发函数和场函数都以某种方式相互作用,因此很难查看它们在最终位置计算中所扮演的角色。

到目前为止,最好和最容易理解的教程可以帮助您实现基本的物理知识,这是The Nature of Code(可在线免费阅读,并带有互动示例)。作为练习,我将大部分早期练习移植到了Lua中。我建议您看看他如何清楚地将位置,速度和加速度计算分开。

作为经验,将treeController.content = nil; 增加到更高的数字。当我这样做的时候,我注意到球最终会落到地面上,但是停顿当然太快了,它并没有以看起来自然的方式反弹。

还要定义g-它似乎并不会影响弹跳问题,只是要弄清楚那是什么。