实现与帧率无关的振荡的正确方法是什么?我正在使用LibGDX库,它为更新循环提供增量时间。
目前,我的正弦波模式按预期工作,只要FPS处于健康的60平均值(由于轻微的gif捕获软件滞后,可能会略微偏斜):
然而,当帧速率下降时,模式会变得歪斜并且行为相当奇怪:
这是正弦波方法:
private void sineWaveDown(float speed, float amplitude, boolean mirror, float delta){
HitBox hitBox = getTransform().getHitBox();
int mirrored = 1;
if (mirror)
mirrored = -1;
Vector2 current = new Vector2(hitBox.x, hitBox.y);
current.y -= speed * delta;
current.x += MathUtils.sin(current.y * delta) * amplitude * mirrored;
hitBox.setPosition(current);
}
在此示例中,speed
为60,amplitude
为2。
HitBox
源自com.badlogic.gdx.math.Circle
,用于逻辑地表示您在上图中看到的圆圈。
修改:问题已得到解答。这是我的工作代码:
private void sineWaveDown(float delta){
HitBox hitBox = getTransform().getHitBox();
int mirrored = 1;
if (config.mirrored)
mirrored = -1;
Vector2 current = new Vector2(hitBox.x, hitBox.y);
current.y -= config.speed * delta;
elapsedTime = (elapsedTime + delta) % (1/config.frequency);
float sinePosition = mirrored * config.amplitude * MathUtils.sin(MathUtils.PI2 * config.frequency * elapsedTime + config.phase);
current.x = config.spawnPosition.x + sinePosition;
hitBox.setPosition(current);
}
答案 0 :(得分:2)
我没有找到一个很好的方法来做到这一点,而不使用经过的时间。您可以使用模数“清理”经过的值,以避免在经过很长时间后失去精度。
elapsed = (elapsed + deltaTime) % (1/FREQUENCY);
float sinePosition = amplitude * MathUtils.sin(MathUtils.PI2 * FREQUENCY * elapsed + PHASE);
我不确定你所做的是什么,基于x的正弦是什么,但你可以适应上述。