【问题标题】:How to use time delta to make movement independent from how fast game runs?如何使用时间增量使运动独立于游戏运行的速度?
【发布时间】:2020-07-03 19:33:19
【问题描述】:

我想让运动独立于游戏速度。我的意思是如果我的游戏 UPS 是 60 或 30 游戏对象的速度将是相同的。如果 UPS 为 60,则玩家每刻移动一秒钟 60 ticks * (speed / 60) 像素。或者如果 UPS 是 30,那么玩家在一秒钟内移动30 ticks * (speed / 30) 像素每刻。距离是一样的。我在我的游戏中使用这种方法。

public class Bullet extends GameObject {

    private double vx, vy, g;

    public Bullet(double x, double y, double vx, double vy) {
        this.vx = vx;
        this.vy = vy;
        setX(x);
        setY(y);
        g = 8.0 / GameContainer.getUPS();
    }

    public void tick() {
        setX(getX() + vx);
        setY(getY() + vy);
        vy += g;
    }

    public void render(Graphics2D g) {
        g.setColor(new Color(255, 128, 0));
        g.fillOval((int) getX(), (int) getY(), 4, 4);
    }

}

玩家的动作很好。但是当我改变我的 UPS 游戏球的速度时。
https://imgur.com/a/UePTqv3

【问题讨论】:

标签: java game-development


【解决方案1】:

这可能与您编写游戏循环的方式有关。 如果你只在一个while循环中调用tick(),游戏会在不同的计算机上运行得更快或更慢。 为了防止这种情况发生,您可以使用类似这样的游戏循环:

public void run()
{
    long lastTime = System.nanoTime();
    double delta = 0.0;
    double amountOfTicks = 60.0;
    double ns = 1000000000 / amountOfTicks;
    while(running)
    {
        long now = System.nanoTime();
        delta += (now - lastTime) / ns;
        while(delta > 1)
        {
            delta--;
            tick();
        }
        render();
    }
}

之所以有效,是因为它不取决于您计算机的滴答速度,而是取决于实际时间。希望我能帮上忙。

【讨论】:

    【解决方案2】:

    伪代码...

    void GameLoop()
    { 
        while( notAborting ) 
        {
        
            static float deltaTime = 0.0f;
            //Get current Time T1
            
            //pass this deltaTime as argument to update function, 
            //and multiply every thing that updates its location 
            //by deltaTime, this way you will have frame rate independent 
            //movememnt and update.
            Update(deltaTime);
            
            //render as usual
            Render();
            
            //update deltatime, time of 1 frame drawn
            deltaTime = /*Get current Time*/ T2 - T1; (in seconds)
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-08-05
      • 2022-10-17
      • 1970-01-01
      • 1970-01-01
      • 2020-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多