Android开发:游戏背景循环

时间:2011-09-25 11:34:57

标签: android multithreading timer game-loop

我正在使用Canvas/Surfaceview开发一个2D游戏并且遇到线程问题。 所以我想要完成的是后台的东西,例如: 每秒SpawnEnemy()或滴答秒或攻击。

我尝试过Thread.wait,但这只会引起痛苦,让我的游戏2fps。

这是我的gameLoop:

import android.graphics.Canvas;

public class GameLoopThread extends Thread {
       static final long FPS = 20;
       private GameView view;
       private boolean running = false;

       public GameLoopThread(GameView view) {
             this.view = view;
       }

       public void setRunning(boolean run) {
             running = run;
       }

       @Override
       public void run() {
             long ticksPS = 1000 / FPS;
             long startTime;
             long sleepTime;
             while (running) {
                    Canvas c = null;
                    startTime = System.currentTimeMillis();
                    try {
                           c = view.getHolder().lockCanvas();
                           synchronized (view.getHolder()) {
                                  view.onDraw(c);
                           }
                    } finally {
                           if (c != null) {
                                  view.getHolder().unlockCanvasAndPost(c);
                           }
                    }

                    sleepTime = ticksPS - (System.currentTimeMillis() - startTime);
                    try {
                           if (sleepTime > 0)
                                  sleep(sleepTime);
                           else
                                  sleep(10);
                    } catch (Exception e) {}
             }
       }
}

所以我想要一些在没有thread.wait的背景(秒)中滴答作响的东西。

2 个答案:

答案 0 :(得分:0)

你可以使用AsyncTask来在后台运行

答案 1 :(得分:0)

你应该让你的线程正常运行游戏大约60fps,参见这个例子:How can I use the animation framework inside the canvas?

如果你想让每一秒做某事,那么你要么在onDraw()中计算帧数,在每个第60帧上计算它,或者如果你需要更高的精度,那么在每个onDraw()中检查系统时间并做一些事情。一秒过去了。

你还应该考虑使用两种方法来绘制onDraw(),另一种方法用于从你的线程中调用的游戏逻辑。