2013-06-10 2 views
-1

У меня проблема. Чтобы сделать видеоигр, мне нужно реализовать функцию под названием update().Обновление объекта каждые x миллисекунд

Аргумент lastCallTime - это последний раз, когда мы вызвали обновление.

Он должен сделать следующее:

  1. Вычислить время, прошедшее с момента последнего вызова обновления.

  2. Если прошедшее время больше 20 [мс], чем ifUpdate = true.

  3. И сбросить последнее время для каждого объекта.

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);   
    } 
} 
+0

'LastUpdated = System.currentTimeMillis()' 'instrad из = 0 '. – darijan

+0

@darijan: На самом деле, вы бы хотели, чтобы 'lastUpdated = currentTime', я думаю. – thejh

+4

Вы должны взглянуть на шаблон Observer для этого. :) –

ответ

0

Некоторое время назад я написал что-то подобное. Метод обновления будет вызываться по скорости 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; 
    } 
} 

}

Смежные вопросы