0

私のゲームでは、レベルに負けたり勝ったりした後に画面を黒く描画し、画面に白でメッセージを描画したいと考えています。数秒遅れてから、タッチすると画面が消えるようにします。以下は私の draw() メソッドの一部です。問題は、sleep コマンドがテキストとキャンバスが描画された後であるにもかかわらず、画面が黒く描画されてテキストが描画される前に、画面がフリーズする (またはスレッドがスリープする) ことです。なぜこれが起こっているのですか?

if (state == WIN || state == LOSE){
        canvas.drawColor(Color.BLACK);
        message = "Touch Screen To Start";                                                
        canvas.drawText(message + "", mCanvasWidth / 2, mCanvasHeight / 2, white);
        try {
        GameThread.sleep(500);
        } catch (InterruptedException e) {
        e.printStackTrace();
        }
    }       
4

3 に答える 3

2

キャンバス関数は、返されるまで実際には何も表示されない気がします。特に、ハードウェア アクセラレーションを使用する Android 3.0 以上で実行している場合、またはダブル バッファリングを使用する構成の場合、実際には終了するまで画面が更新されません。

黒い画面を描画する代わりに、現在の時刻を保存します。何かのようなもの:

mStartTime = System.currentTimeMillis();

次に、プレスを監視する関数で、経過した秒数を確認し、次のように十分な時間が経過しているかどうかを確認します。

if( (System.currentTimeMillis() - mStartTime)/1000 > 5){
    //Put code here to run after 5 seconds
}

これにより、テキストが描画され、Ui スレッドがブロックされるのを回避できます (あらゆる点で大失敗です)。

于 2012-07-28T03:51:48.377 に答える
1

drawTextの呼び出しに、思ったよりも数分の1秒長くかかっている可能性があります。また、すぐにsleepを呼び出すため、描画する前に実際にスレッドをスリープしていることになります。

スリープを呼び出す前に、for(i <10000)などの小さなループを配置してみて、それが役立つかどうかを確認してください。

于 2012-07-28T02:34:16.850 に答える
0

CountDownTimer を使用する

 http://developer.android.com/reference/android/os/CountDownTimer.html


 new CountDownTimer(30000, 1000) {

 public void onTick(long millisUntilFinished) {
     mTextField.setText("seconds remaining: " + millisUntilFinished / 1000);
     // Here you do check every second = every 1000 milliseconds
 }

 public void onFinish() {
    // Here you can restart game after 30 seconds which is 30K milliseconds.
     mTextField.setText("done!");
 }
}.start();
于 2012-07-28T02:59:05.070 に答える