我正在编写一个物理引擎,当球击中一个表面时,它以一半的速度反弹(velocity.y = -velocity)。然而,当球几乎处于静止状态时,它会不断地切换速度并开始通过平台缓慢下降,但如果我让它运行足够长时间,它仍将最终落下,这是不可接受的。我尝试编写一些代码来阻止它,但它检查方式太快,这是尝试检查它的更新方法。
public void update() {
velocity.y += Globals.GRAVITY.y;
if(canFall)
position.y += velocity.y;
position.x += velocity.x;
oldPosition.y = position.y;
oldPosition.x = position.x;
elapsedTime += 1 * Gdx.graphics.getDeltaTime();
if(elapsedTime >= 5){
if(oldPosition.y - 5 <= position.y && oldPosition.y + 5 >= position.y){
elapsedTime = 0;
canFall = false;
}else{
canFall = true;
elapsedTime = 0;
}
}
}
碰撞处理程序知道它何时击中球的顶部,这是我需要的唯一解决方案。如何检查球何时处于静止状态。
此代码会尝试检查球是否在几秒钟内没有移动,如果它没有将canFall
设置为false
。我需要一个通用检查,看看球是否应该停止。从下面的图片中可以看到球落入平台时的速度。图片显示球在十秒钟后“休息”,因为你可以看到球缓慢但肯定会掉进去。使用此“休息”速度每三秒钟,y位置下降1,速度从正变为负,因此您在图片中看到的速度不会持续为负。忽略已用时间变量非常感谢任何帮助!
答案 0 :(得分:1)
为什么让时间与它有关?我不是说它不应该,但它应该吗?所以可能会丢失if(elapsedTime ... )
条件。
这不是你想要的吗? 如果最后两个位置之间的垂直差异的大小可以忽略不计(相应地设置tolerance
;也许它是5),停止弹跳:< / p>
if(Math.abs(position.y - oldPosition.y) < tolerance)
{
canBounce = false;
...
}
else
{
canBounce = true;
...
}
或者,如果上面的...
没有其他任何内容需要更改:
canBounce = Math.abs(position.y - oldPosition.y) > tolerance;
另外,您不需要在以下细分中的某个地方{
和}
吗?也许不是,如果球垂直弹跳,但看起来x
也可以改变,这可能会使上面的代码需要调整。但下面的代码缩进方式让我觉得应该做的不仅仅是改变position.y
:
if(canFall)
position.y += velocity.y;
position.x += velocity.x;
oldPosition.y = position.y;
oldPosition.x = position.x;
最后,您需要将速度添加到位置。这似乎值得怀疑。乘以速度乘以时间?或者时间= 1总是? (怀疑它。)
问题可能是此方法的外部问题。有些东西需要让球y
变得低于深蓝色框顶部的y
。这段代码无法在不知道深蓝色框顶部的y
的情况下执行此操作(除非您应用物理公式?)。也许在参数列表中将此值包含为topOfDarkBlueBox
?
然后添加代码,例如:
if(position.y < topOfDarkBlueBox.y) position.y = topOfDarkBlueBox.y
我宁愿在工作中看到物理,但你可能会说,&#34;谁注意到了?&#34;
修改强>
你写道,&#34;碰撞处理程序知道它何时击中球的顶部,&#34;但我认为你的意思是#34;当球击中深蓝色盒子的顶部时#34;。也许调用碰撞处理程序而不是传递新参数topOfDarkBlueBox
?