1

我正在使用Canvas/Surfaceview线程开发 2d 游戏并且遇到问题。所以我想要完成的是背景中的一些事情,例如:每秒SpawnEnemy()或滴答秒或攻击。

我试过 Thread.wait 但这只会引起痛苦并使我的游戏达到 2fps。

这是我的游戏循环:

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) {}
             }
       }
}

所以我想要一些在后台(秒)没有线程等待的东西。

4

2 回答 2

0

你可以使用AsyncTask在后台运行一些东西

于 2011-09-25T11:39:46.267 回答
0

你应该让你的线程以大约 60fps 的速度正常运行游戏,看这个例子:如何使用画布内的动画框架?

如果您希望每一秒都做某事,那么您可以在 onDraw() 中计算帧数,在每 60 帧做一次,或者如果您需要更高的精度,那么在每个 onDraw() 中检查系统时间并在一秒钟内做某事过去。

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

于 2011-09-25T12:23:08.887 回答