java - 帧率与重力无关

标签 java frame-rate gravity delta

我遇到了重力随帧速率变化而严重变化的问题。当我以 160 fps 运行时,我的玩家在空中跳跃几米然后掉落,但在大约 10 fps 时,我的玩家跳跃半米然后掉落。我的重力代码如下:

public void fall(long delta) {
    float increase = acceleration * ((delta) / 1000000000); //changes delta time (nanoseconds) to seconds
    if(player.y + velocity + increase < -1.15f) {
        if(velocity + inc < terminal_velocity) {
            velocity += inc;
        }
        player.y += velocity;
    }else{
        player.y = -1.15f;
        velocity = 0;
    }
}

我称之为:

while(!close_request) {
        now = getTime();
        int delta = getDelta(now);

        player.fall(delta);

        ........other functions.........

    }

我认为实现增量可以防止玩家改变速度太快或太慢,但它实际上让情况变得更糟。我认为这是因为随着帧之间的时间增加,速度也会增加,从而导致玩家异常快速地下落。这是因为随着 FPS 的增加,玩家会跳得更高。有什么想法吗?

最佳答案

您的问题在这一行:

player.y += velocity;

它没有考虑到速度是“距离除以时间”。

您正确地建模了加速度:

v = u + a * t   // v = current velocity, a = acceleration, t = time

但不是距离,对于足够小的delta是:

delta_s = v * delta_t

您需要将velocity乘以delta,然后再将其添加到该位置。

关于java - 帧率与重力无关,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14024057/

相关文章:

android - 布局重力不适用于LayoutParams

android - TextView的自定义布局和重力(水平重力有效,但垂直重力失败)

Java 反射 getDeclaredMethod 抛出 NoSuchMethodException

java - 扫描仪返回未找到行

opencv - 获取 OpenCV 的当前 FPS

android - 你如何用opengl es显示fps(android)

java - 如何在Windows命令行中正确设置类路径

Java AWT/Swing : paintComponent issue with custom JPanel(s)

ffmpeg - ts文件的帧率控制

android - 使用重力来确定世界引用系?