0

在我的游戏中,我想在输掉或赢得一个关卡后将屏幕绘制为黑色,然后在屏幕上绘制一条白色消息。延迟几秒钟后,我希望屏幕在触摸时消失。下面是我的 draw() 方法的一部分。问题是屏幕冻结(或线程休眠)在屏幕被拉黑和文本被绘制之前,即使睡眠命令是在文本和画布被绘制之后。任何想法为什么会发生这种情况?

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

我有一种感觉,canvas 函数在返回之前实际上并没有显示任何内容。特别是如果您在具有硬件加速的 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 的调用比您意识到的要长几分之一秒,并且由于您立即调用 sleep,因此您实际上是在绘制之前使线程处于休眠状态。

尝试在调用 sleep 之前放置一个小循环 for( i < 10000 ) 或其他内容,看看是否有帮助。

于 2012-07-28T02:34:16.850 回答
0

使用倒计时

 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 回答