Как настроить, чтобы что-то происходило через определенное количество времени?

#java #android #timer

#java #Android #таймер

Вопрос:

Прямо сейчас я программирую игру для Android и сталкиваюсь с проблемой, что при столкновении с врагом моя полоса здоровья падает СЛИШКОМ быстро.

Я хочу разрешить ему регистрировать только два попадания каждую секунду. На данный момент кажется, что анимация проходит 50 кадров за 1-2 секунды.

Пожалуйста, дайте мне идеи о том, как я могу решить свою проблему.

Спасибо!

Ответ №1:

Как насчет сохранения метки времени, когда произошло последнее столкновение, в вашем объекте player, и сравнения текущего времени с ним при обнаружении столкновения? Если прошло достаточно времени, уменьшите работоспособность. Таким образом, вы не привязаны к возможной изменяющейся частоте кадров.

Комментарии:

1. Это решило мою проблему, другие ответы были отличными и все такое. Я обнаружил, что это самое быстрое решение… может быть, не самый лучший? Я бы рекомендовал прочитать все эти ответы тому, кто ищет.

2. Скалли описывает способ, которым я это сделал, ниже. Используя текущую временную метку, а также частоту кадров и таймер.

Ответ №2:

Лучшее решение для запуска чего-либо через определенное количество времени immo — это использовать временную задачу. Например, этот код выполняется на 31. Декабрь 2011.

 Timer timer = new Timer();
timer.schedule(new TimerTask( 

public void run() {

    System.out.println("done");

}),

new Date(2011, 12, 31));
  

Комментарии:

1. Разве это не открывает другой поток и не использует больше ресурсов? Это неэффективно для мобильного программирования?

Ответ №3:

Поместите задание в AsyncTask , где doInBackground() метод ведет обратный отсчет, отправляет обновление хода выполнения, а затем на некоторое время переходит в спящий режим.

Псевдокод:

 doInBackground(int howMuch) {
   while (howMuch > 0 ) {
       publishProgress(howMuch);
       Thread.sleep(1000 / howMuch);
  } 
}

onProgressUpdate(int current) {
     updateProgressBar(current);
}
  

Ответ №4:

может быть, даже проще сделать Runnable и заставить его переключать флаг invincible на false при срабатывании.

 mHandler = new Handler() (during onCreate)
notInvincible = true;

-- get damaged --
if(damaged amp;amp; notInvincible ){
  notInvincible = false;
  mHandler.postDelayed(new Runnable(){ void run() { notInvincible = true; }},DELAYTIME);
}
  

но AsyncTask также позволил бы вам это сделать.

Ответ №5:

Обычный способ сделать что-то подобное — посчитать время фрейма (время, прошедшее с последнего фрейма). С помощью этого времени вы можете сделать все движения зависящими от времени, а также обрабатывать такие вещи, как эти таймеры.
Для такого столкновения вы бы добавили в свой класс player атрибут со временем, прошедшим с момента последнего попадания. В каждом кадре этот атрибут суммируется со временем кадра. Затем вы можете проверить время, прошедшее с момента последнего столкновения. После попадания вы можете установить таймер обратно на ноль. Потоки не задействованы.

Комментарии:

1. Перект.. На самом деле именно так я и поступил с ответом на временную метку.. Большое вам спасибо!

2. Да, это действительно почти то же самое, просто немного другой подход. 🙂