Как мне отложить метод пошаговой игры в Java Android? - PullRequest
1 голос
/ 02 февраля 2012

В простой карточной игре (человек против процессора) логика работает, но я хочу отложить поворот компьютера.

Я попытался использовать Thread.sleep(int milliseconds), который работает, но он портит порядок отображения изображений. Я не использую игровой цикл, я просто динамически обновляю ImageViews всякий раз, когда меняются карты. Проблема с Thread.sleep заключается в том, что все изображения обновляются только после Thread.sleep. Перед Thread.sleep не отображается только человеческая карта. Карта человека и карты компьютера отображаются после Thread.sleep.

Я использовал Thread.sleep так:

playPlayerCard(player); // Human first
displayPile(); // Display card pile (ImageView's)

player = nextPlayer(player); // Get's next player in Player mPlayers List<Player>

// Wait for computer to 'Think'
Thread.sleep(500);

playPlayerCard(player); //Computer's turn
displayPile(); // Display card pile (ImageView's)

Я неправильно использую Thread.sleep ()? Есть ли лучший / правильный путь? Я искал в Интернете и пытался использовать new Thread(), использовать handler.postDelayed(Runnable r, long milliseconds), а также CountDownTimer, но ни одна из них не работает, поскольку мои переменные: playPlayerCard(player); не являются окончательными переменными.

У меня всегда были проблемы с задержкой действий и появлением изображений в правильное время. Какие-либо предложения? Заранее спасибо.

Ответы [ 2 ]

5 голосов
/ 02 февраля 2012

Не могли бы вы просто реализовать логику Computer Playing в AsyncTask и запустить ее, когда человеческий поворот сделан?

Я думаю, что это будет иметь больше смысла, поэтому, как только компьютер завершит "игру", вы сможете определить действия, которые нужно предпринять в методе onPostExecute(), в вашем случае, я думаю, это будет раздача карт.

Было бы также очень просто заблокировать пользовательский ввод во время игры на компьютере, либо с помощью диалогового окна прогресса (что не совсем удобно для понятной мне игры), либо просто путем отключения кнопок:)

Вот документация .

Надеюсь, это поможет!

0 голосов
/ 02 февраля 2012

Я использовал решение из @Jakar и изменил мои переменные на class-scope, чтобы правильно использовать Handler и Runnable.Это сработало, задержка работает правильно, используя

Runnable r = new Runnable() {
    public void run() {
         playPlayerCard();
    }
};

mHandler.postDelayed(r, 500);

. Чтобы прояснить решение, мне пришлось извлечь аргументы из playPlayerCard(Player player) и использовать вместо этого переменную класса Player mPlayer; в playPlayerCard().

...