2011-09-25 62 views
1

我正在开发一个使用Canvas/Surfaceview的2D游戏,并且存在线程问题。 所以我想要完成的是背景中的一些东西,例如: 每秒SpawnEnemy()或打勾秒或攻击。Android开发:游戏后台循环

我试过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。

回答

0

你应该让你的线程运行的游戏通常约60fps的,看下面的例子:How can I use the animation framework inside the canvas?

如果您想为每一秒做一些事情,那么你要么在onDraw()中计算帧数,要在每个第60帧上进行计数,或者如果您需要更高的精度,则每次onDraw()都会检查系统时间,并在一秒钟后执行某些操作。

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

0

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