0

問題が発生しています。ビデオゲームを作成するには、update() という関数を実装する必要があります。

引数 lastCallTime は、最後に update を呼び出した時刻です。

次のことを行う必要があります。

  1. update の最後の呼び出しから経過した時間を計算します。

  2. ifUpdate = true より経過時間が 20[ms] 以上の場合。

  3. そして、すべてのオブジェクトの lastUpdated 時刻をリセットします。

private long lastUpdated;               //The last updated time for this object.

public boolean update (long lastCallTime){
    boolean ifUpdate = false;

    long currentTime = System.currentTimeMillis();
    long delta = (currentTime - lastCallTime);
    if (delta >= 20){
        //Do something and
        ifUpdate = true;
        lastUpdated = 0;
    }
    return ifUpdate;
}

スレッドは、このメソッドを次のように呼び出します。

@Override
public void run(){
    long lastCallTime;
    int k = 0;

    lastCallTime = System.currentTimeMillis();
    while(true){
        //Do something
        boolean ifUpdate = update(lastCallTime);          
    }
}
4

1 に答える 1

1

少し前に、似たようなことを書きました。update メソッドは FPS レート (例では 24) で呼び出されます。そのため、更新されたメソッドによって消費される時間を計算する必要があります (変数timeDiff)。また、プロセスが指定された (変数) よりも多かれ少なかれスリープしていたかどうかがチェックoverSleepTimeされ、この時間が次のサイクルで加算/減算されます。

お役に立てば幸いです

long timeDiff, sleepTime;
long afterTime, beforeTime;
long overSleepTime = 0L;

int fps = 24; // the desire FPS
long period = 1000000000L / fps;

while(true) {
  beforeTime = System.nanoTime();

  // your game logic
  update();

  afterTime = System.nanoTime();

  // timeDiff is time needed by the update process
  timeDiff = afterTime - beforeTime;
  sleepTime = (period - timeDiff) - overSleepTime;

  if(sleepTime > 0) {
    try {
      Thread.sleep(sleepTime / 1000000L); // sleeptTime is in nano secs and sleep expects millis
    } catch(InterruptedException e) {}

    // checks if the thread has slept more than desired
    overSleepTime = (System.nanoTime() - afterTime) - sleepTime;

  } else {
    // negative sleeptTime means that the system can't be update at the desired rate
    overSleepTime = 0L;
  }
}

}

于 2013-06-10T09:58:35.930 に答える