与帧率无关的正弦波模式

时间:2014-06-30 18:18:01

标签: java libgdx frame-rate sine

实现与帧率无关的振荡的正确方法是什么?我正在使用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);
}

1 个答案:

答案 0 :(得分:2)

我没有找到一个很好的方法来做到这一点,而不使用经过的时间。您可以使用模数“清理”经过的值,以避免在经过很长时间后失去精度。

elapsed = (elapsed + deltaTime) % (1/FREQUENCY);

float sinePosition = amplitude * MathUtils.sin(MathUtils.PI2 * FREQUENCY * elapsed + PHASE);

我不确定你所做的是什么,基于x的正弦是什么,但你可以适应上述。