修正了时间步和游戏速度

时间:2014-03-31 22:58:11

标签: java loops render updates fixed

这是我的第一场比赛,而且我没有经验丰富的程序员,但我已经研究了很多,而且我在过去的几周里每天都参与这个游戏。我每天在这个网站上研究不同的东西,我发现你的帖子非常有帮助:)

我有一个关于固定时间步长循环的问题,无法解决为什么更改更新之间等待的时间会影响整个游戏移动的速度。也许有我想念的东西或者我不了解的东西

我的循环看起来像这样:

private void gameLoop(){
    final double updateWaitTime = 1000000000/50;
    double nextUpdateTime = System.nanoTime();
    while(running) {
        double now = System.nanoTime();
        while( now > nextUpdateTime) {
            updateGame(now);
            nextUpdateTime += updateWaitTime;
        }
        double interpolation = (now+updateWaitTime-nextUpdateTime)/updateWaitTime;
        drawGame(interpolation);
    }
}

如果我减少updateWaitTime的值,我的游戏移动速度会快得多,因为它会得到更新。

执行我的运动的方法看起来像这样,它们都获得getNanoSecond()的当前时间,该值保持与gameLoop设置的相同的值#34; now"如

protected void travel(){
    if(moveShotTime <= c.getNanoSecond()){
        setX(getX()+dx);
        setY(getY()+dy);
        moveShotTime = c.getNanoSecond()+bulletMoveDelay;
    }
}


//[0] = degree. [1] = distance. [2] = movementspeed
public void move(){
    if(moves.isEmpty() == false){
        ArrayList<double[]> movementDirection = moves.get(0);
        if(movementDirection.isEmpty() == false){
            double[] oneMove = movementDirection.get(0);
            if(getNextMoveTime() <= c.getNanoSecond()){
                else if(oneMove[1] > distanceMoved){
                    double radian = (oneMove[0]/360)*2*Math.PI;
                    double dx = round((Math.cos(radian)*oneMove[2]), 9);
                    double dy = round((Math.sin(radian)*oneMove[2]), 9);
                    double dz;
                    if(dx<0){
                        dz = round(dx/(Math.cos(radian)), 5);
                    }
                    else if(dx==0){
                        dz = dy;

                    }
                    else if(dy==0){
                        dz = dx;
                    }
                    else{
                        dz = round((dx/(Math.cos(radian))), 5);
                    }
                    setX(getX()+dx);
                    setY(getY()+dy);

                    if(dz<0){
                        distanceMoved = distanceMoved-dz;
                    }
                    else{
                        distanceMoved = distanceMoved+dz;
                    }

                    movedX = movedX + dx;
                    movedY = movedY + dy;
                }
                else{

                    movementDirection.remove(0);
                    distanceMoved = 0;

                }
            }
        }
        else{
            setPreviousX(getX()-movedX);
            setPreviousY(getY()-movedY);    
            moves.remove(0);
        }
    }
    else{
    }
}

所以我想知道为什么更改updateWaitTime会影响一切的速度。由于我使用时间戳作为何时再次执行动作的参考,因此在我看来它不应该改变游戏更新的频率,只要它比时间步长更频繁。在游戏里面。我是新手,我肯定在这里遗漏了一些东西。我还想问一下PC和Android上游戏的常见更新时间是什么?如果我无法弄清楚这一点,我将不得不设置一个更新时间,我无法从此处改变工作(因为我必须调整游戏中的所有内容)。

提前致谢并感谢本网站上所有精彩信息! :)

0 个答案:

没有答案