2012-02-01 18 views
1

単純なカードゲーム(人間対CPU)ではロジックは機能しますが、コンピュータの回転を遅らせたいと思います。JavaのAndroidでターンベースのゲームのメソッドを遅らせるには

私は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()が間違っを使用していますか?より良い/正しい方法がありますか?私はオンラインで検索し、handler.postDelayed(Runnable r, long milliseconds)CountDownTimerを使ってnew Thread()を使ってみましたが、私の変数:playPlayerCard(player);は最終変数ではないので、何の仕事もしていません。

私はいつも正しい時間に動作と画像を表示するのに問題がありました。助言がありますか?前もって感謝します。

+0

まあ、あなたは変数をグローバルにすることができます - すべてのメソッドの外でクラス本体でそれらを定義します。その後、ハンドラを使用することができます。 – Jakar

+0

@ジャカル、それは働いて、ありがとう。私はHandlerとRunnableを使用しています。必要なすべての変数(クラス変数に1つ、悪くない)を変更しました。 – SuckerForMayhem

答えて

0

@ Jakarのソリューションを使用し、HandlerとRunnableを正しく使用するために変数をクラススコープに変更しました。これは働いていた遅延が正しく解決策を明確にするため

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

mHandler.postDelayed(r, 500); 

を使用して動作します、私はplayPlayerCard(Player player)から引数を取り出し、代わりにplayPlayerCard()にクラススコープPlayer mPlayer;変数を使用する必要がありました。

5

コンピュータの再生ロジックをAsyncTaskに実装し、人間のターンが完了したときに起動できませんでしたか?

私はそれがコンピュータが "再生"を行うとすぐにonPostExecute()方法で取るべき行動を決定することができますように、それははるかに意味があると思う、私はそれがカードを扱うだろうと思う。

コンピュータの再生中にまた:)(すべて私が理解ゲームのそれにpleasentではありません)進捗ダイアログで、または単にボタンを無効にすることで、どちらか、ユーザー入力をブロックするために

を本当に簡単になりますここにはdocumentationがあります。

希望すると便利です。

+0

助けてくれてありがとう、私はAsyncTaskについて知りませんでした。私は見てみると、それを試してみましょう、ターンベースのスタイルを行うのより効率的な方法のように見えます。まず最初にクイックフィックスをして、後でこの方法で試すことができるかどうかを確認します。 – SuckerForMayhem

+0

私は現在HandlerとRunnableを使用していますが、情報のおかげでAsyncTaskを使うことができます。 – SuckerForMayhem

関連する問題