Java замедляет цикл, не замедляя остальную часть программы

Я создаю видеоигру, и у меня есть цикл for, который восстанавливает ваше здоровье.

public void recoverHealth() {
    if (curHealth < finalHealth) {
        for (double i = 0; i < finalHealth; i = i + 0.1) {
            curHealth = curHealth + 0.1;
            System.out.println("health: " + curHealth);
        }
    }
}

Но проблема в том, что java проходит через это так быстро, что проходит от 0 до 20, прежде чем игра даже запустится. Как я могу замедлить метод recoveryHealth() без замедления всей игры, например, Thread.sleep не работает.

try {
    Thread.sleep(1000);
} catch (Exception e) {
    e.printStackTrace();
}

Любые идеи?


person Bryce Hahn    schedule 21.03.2014    source источник
comment
Запустите метод регенерации здоровья в отдельном потоке, в котором вы вызываете Thread.sleep.   -  person takendarkk    schedule 21.03.2014
comment
То, как вы это сделаете, сильно зависит от того, как реализована остальная часть вашей игры, и мы не можем дать вам здесь хороший ответ. Вы можете создать отдельный поток (и реализовать надлежащую синхронизацию), вы можете запускать свое приложение с фиксированной, контролируемой частотой кадров и увеличивать работоспособность один раз за кадр, вы можете запустить отдельный таймер, который периодически увеличивает работоспособность и т. д.   -  person Jason C    schedule 21.03.2014
comment
Кроме того, кстати, проблема не в том, что Java делает это слишком быстро; это то, что вы делаете это в цикле for, который не завершается, пока не будет добавлено все здоровье. К моменту выхода из цикла все работоспособность будет восстановлена ​​независимо от того, как быстро вы делаете это в цикле, поэтому, если вы вызовете эту функцию, как только ваша программа запустится, она выполнит этот цикл перед перемещением. чтобы сделать следующее. Отсюда предложения для потоков, покадровых обновлений, таймеров и т. д.   -  person Jason C    schedule 21.03.2014
comment
Заставьте вас восстанавливатьHealth() a TimerTask вопреки распространенному мнению TimerTasks очень полезны.   -  person Puru--    schedule 21.03.2014


Ответы (2)


Поместите recoverHealth в отдельный поток и используйте Thread.sleep(), как вы описываете.

person merlin2011    schedule 21.03.2014

Добавьте это в свою игровую программу, где доступен curHealth.

timer = new Timer();
timer.schedule(new TimerTask (){
    public void run() {
        curHealth = curHealth + 0.1;
    }
}, 1000);
person Puru--    schedule 21.03.2014