#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. Да, это действительно почти то же самое, просто немного другой подход. 🙂