2015-03-17 2 views
1

Это не очень необходимо, мне просто интересно узнать, что думают другие. Я знаю, что это бесполезно, это просто весело.Код запуска каждые X секунд (Java)

Теперь я знаю, как это сделать, это довольно просто. Я просто пытаюсь найти способ сделать это по-другому, что не требует создания новых переменных, которые заполняют мой класс.

Вот как я бы это сделать:

float timePassed = 0f; 
public void update(){ 
    timePassed += deltatime;//Deltatime is just a variable that represents the time passed from one update to another in seconds (it is a float) 
    if(timePassed >= 5){ 
     //code to be ran every 5 seconds 
     timePassed -= 5f; 
    } 
} 

То, что я хочу знать, если есть способ сделать это без пройденного переменного времени. У меня есть переменная statetime (time since loop), которую я использую для других вещей, которые могут быть использованы для этого.

+0

Возможно ли использовать весну? –

+0

Я хочу что-то только на Java. Никаких API-интерфейсов не требуется. Там должно быть какое-то математическое решение. – vedi0boy

+0

Это то, что вы хотите? http://stackoverflow.com/questions/4544197/how-do-i-schedule-a-task-to-run-at-periodic-intervals – mazaneicha

ответ

2

Если цель состоит в том, чтобы запускать код каждые X секунд, моим первым выбором было бы использовать util.Timer. Другой вариант - использовать ScheduledExecutorService, который добавляет пару улучшений по сравнению с util.Timer (лучше обработка исключений для одного).

Я стараюсь избегать Swing.Timer, так как я предпочитаю оставлять EDT (поток отправки событий) незагроможденным.

Многие люди пишут «игровой цикл», который ближе к тому, что вы начали. Поиск по «игровому циклу», вероятно, даст вам несколько вариантов, в зависимости от того, хотите ли вы сохранить стабильную ставку или нет.

Иногда в ситуациях, когда вы не хотите постоянно тестировать и перезагружать, можно объединить две функции с помощью операции «И». Например, если вы И 63 до целого числа, у вас есть диапазон 0-63 для итерации. Это хорошо работает на диапазонах, которые имеют мощность 2.

В зависимости от структуры вашего кода вызова вы можете передать переменную «statetime» в качестве параметра и протестировать, если она больше вашего желаемого X. Если вы сделал это, я полагаю, что шаг в вызываемом коде сбрасывает «statetime» на ноль.

Другая идея - передать метод «startTime» методу обновления. Затем ваш таймер проверит разницу между currentTimeMillis и startTime, чтобы узнать, прошло ли X секунд или нет. Опять же, код, который вы вызываете, должен, вероятно, установить новый «startTime» как часть процесса. Самое приятное в этом методе заключается в том, что нет необходимости увеличивать истекшее время.

Пока я штампует идеи: могли бы также создать будущее «targetTime» переменную и испытание, если currentTimeMillis() - targetTime> 0.

или targetTime начальный промежуток может быть неизменны, который часто обеспечивает легкий плюс , в зависимости от того, как они используются.

+0

Спасибо за ответ! Я бы использовал ScheduledExecutorService. Я немного прочитал об этом в Интернете, и похоже, что все будет хорошо. У меня на самом деле нет планов по сбросу statetime (я использую его для расчета кадров анимации спрайтов). Если у кого-то есть математическое решение, которое было бы здорово, если бы я не согласился с этим в качестве ответа. Я бы предпочел не использовать ScheduledExecutorService, но если это лучший способ, чем я. – vedi0boy

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