В игре несколько цветных шариков появляются каждую секунду и исчезают. Игрок должен выбрать правильную последовательность.
Нажав на паузу, игра должна быть остановлена (таймер и процесс игры, как например вызов Time.timeScale = 0
в Unity). Цвета ежесекундно появляются с помощью Handler
.
private void displayColors(final int quantity) {
runOnUiThread(new Runnable() {
@Override
public void run() {
delta=0;
final ImageView[] displayingColors = new ImageView[quantity];
final RelativeLayout.LayoutParams displayingColorsLayoutParams[] = new RelativeLayout.LayoutParams[k];
for (int count = 0; count < quantity; count++) {
displayingColors[count] = new ImageView(getApplicationContext());
displayingColorsLayoutParams[count] = new RelativeLayout.LayoutParams(height, width);
displayingColorsLayoutParams[count].setMargins(marginLeft, marginTop, 0, 0);
}
for (int count = 0; count < quantity; count++) {
final int index = count;
handler.postDelayed(new Runnable() {
@Override
public void run() {
displayingColors[index].setImageResource(a random image);
gameBoard.addView(displayingColors[index], displayingColorsLayoutParams[index]); //colors appearing
if (index >= 1)
colorsGameBoard.removeView(displayingColors[index - 1]); //colors disappearing
}
}, 1000 * (index + 1));
}
handler.postDelayed(new Runnable() {
@Override
public void run() {
colorsGameBoard.removeView(displayingColors[colorsNumber - 1]);
chooseColorsFromList(colorsNumber);
delta=100;
}
}, 1000 * (k + 1));
}
});
}
А это поток, проверяющий время:
private class CheckTime implements Runnable {
@Override
public void run() {
while (timeAmount > 0) {
try {
Thread.sleep(100);
timeAmount = timeAmount - delta;
} catch (InterruptedException e) {
e.printStackTrace();
}
if (timeAmount <= 0)
runOnUiThread(new Runnable() {
@Override
public void run() {
//Game Over UI process
}
});
}
}
У меня delta
либо 0 (когда шарики показываются) либо 100 (когда игрок выбирает последовательность)․ Я могу остановить время через delta = 0
, но как остановить и Handler
?
Насколько знаю я, любой .post
или .postDelayed
можно остановить методом .removeCallbacks
, если конечно процесс не успел запуститься:
Создадим для примера две переменные классов Runnable
и Handler
:
Runnable runnable = new Runnable() {
@Override
public void run() {
Log.e("Run", "Run Forest! RUN!!!");
}
};
Handler handler = new Handler();
После чего попробуем запланировать запуск процесса и отменить его:
handler.postDelayed(runnable, 1000);
handler.removeCallbacks(runnable);
В лог ничего не выйдет :)
Можно попробовать создать Timer
(https://developer.android.com/reference/java/util/Timer.html) и зашедулить ему TimerTask
с необходимым delay
, где в теле происходит handler.post(Runnable)
.
Чтобы отменить выполнение такой таски достаточно вызвать Timer.cancel()
.
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Есть готовый десктопный проект на Java, с GUI интерфейсомПроект был разработан в среде Intellij Idea
Есть сайт профкома универераХочу добавить новости с главной страницы к себе в приложуху
Здравствуйте, имеется Volley поток и такой кастомный адаптерРазмещение изображений идет, но вот на простеньком добавлении textview к к этому же