我在游戏中的物理代码是这样的:
-- 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是球中心的位置。
答案 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
-它似乎并不会影响弹跳问题,只是要弄清楚那是什么。