вычитая из двойного

1

Я использую этот код, чтобы узнать, делится ли счет пользователей на 20.

if(hitCount % 20 == 0){
    interval = interval - 1; 
    Log.e("Score", "User score is divisible by 20 decreasing interval to " 
                   + interval);

    timer.setInterval(interval);
}

Единственная проблема заключается в том, что этот код находится в методе IUpdate в andengine, который обновляется каждую секунду.

Поэтому, если счет пользователя делится на 20 в течение более 1 секунды, он продолжает вычитать 1.

Я только хочу, чтобы он вычитал один раз, если счет пользователя делится на 20.

Какие-либо предложения?

Теги:
andengine

3 ответа

3
Лучший ответ

Вы можете сохранить внешний флаг:

bool alreadySet = false;

Затем в вашем коде установите или отключите его:

if(hitCount % 20 == 0) {
    if(!alreadySet) {
        alreadySet = true;
        // Continue with your code
    }
} else {
    alreadySet = false;
}

Я понимаю, что вы имеете в виду - это похоже на немного грязное решение.

  • 0
    Это звучит грязно ... Кажется, не выполняет то, что мне нужно. Мне нужно, чтобы он работал только ОДИН РАЗ в каждый раз, когда счет делится на 20.
  • 0
    @ coder_For_Life22: Это то, что он делает. Под «внешним флагом» я подразумеваю «поставить его на уровне класса, вне метода» - вы это сделали?
Показать ещё 2 комментария
2

Я знаю, что есть выбранный ответ, но:

Вместо того, чтобы проверять, делится ли счет на 20 в потоке обновления, почему бы вам не проверить его при обновлении оценки? Это уменьшит количество проверок за " %20" (повышение эффективности), а также решит вашу проблему.

  • 0
    Я обновляю счет одновременно.
  • 0
    Мне любопытно: почему ваш счет не увеличивается каждую секунду?
-3

Вы можете использовать флаг, чтобы проверить, был ли hitCount уже делимым на 20:

boolean bDivBy20 = false; // outside of the method
...
if(!bDivBy20 && hitCount % 20 == 0){
   bDivBy20 = true;
   interval = interval - 1; 
   Log.e("Score", "User score is divisible by 20 decreasing interval to " + interval);

   timer.setInterval(interval);
}

Кроме того, если вы хотите ввести блок if, но только выполните interval = interval - 1; линии interval = interval - 1; один раз, затем переместите проверку внутри внешнего блока if, например:

if(hitCount % 20 == 0){
   ...
   if (!bDivBy20) {
      ...
   }
   ...
}
  • 1
    Единственная проблема состоит в том, что он сбрасывает значение false каждую секунду, когда метод запускается снова .. так что это означает, что логическое значение действительно ничего не делает .. правильно?
  • 0
    @ coder_For_Life22: флаг явно выходит за пределы метода ... Я думал, что эта часть довольно очевидна. Я не понимаю, что не так с ответом.
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню