Как остановить процесс игры?

317
22 апреля 2017, 22:50

В игре несколько цветных шариков появляются каждую секунду и исчезают. Игрок должен выбрать правильную последовательность. Нажав на паузу, игра должна быть остановлена (таймер и процесс игры, как например вызов 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?

Answer 1

Насколько знаю я, любой .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);

В лог ничего не выйдет :)

Answer 2

Можно попробовать создать Timer (https://developer.android.com/reference/java/util/Timer.html) и зашедулить ему TimerTask с необходимым delay, где в теле происходит handler.post(Runnable).

Чтобы отменить выполнение такой таски достаточно вызвать Timer.cancel().

READ ALSO
Создание ехе файла с java проекта

Создание ехе файла с java проекта

Есть готовый десктопный проект на Java, с GUI интерфейсомПроект был разработан в среде Intellij Idea

219
Анимация поворота картинки

Анимация поворота картинки

Добрый день, в программировании на Android еще новичок

271
Распасрить JSON в Retrofit2, не зная API

Распасрить JSON в Retrofit2, не зная API

Есть сайт профкома универераХочу добавить новости с главной страницы к себе в приложуху

238
добавить View элемент(text view) в Адаптер(Volley, JSON)

добавить View элемент(text view) в Адаптер(Volley, JSON)

Здравствуйте, имеется Volley поток и такой кастомный адаптерРазмещение изображений идет, но вот на простеньком добавлении textview к к этому же

207