Разработка Android: фоновая петля игры - PullRequest
1 голос
/ 25 сентября 2011

Я разрабатываю 2d Game, используя Canvas/Surfaceview, и у меня проблема с потоком.Так что я хочу сделать что-то на заднем плане, например: каждую секунду 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) {}
             }
       }
}

Итак, я хочу что-то, что тикает в фоновом режиме (в секундах), которое не thread.wait.

Ответы [ 2 ]

0 голосов
/ 25 сентября 2011

Вы должны сделать так, чтобы ваш поток запускал игру обычно со скоростью около 60 кадров в секунду, см. Этот пример: Как я могу использовать анимационную структуру внутри холста?

Если вы хотите, чтобы каждая секунда что-то делала, то вы либо подсчитываете кадры в onDraw (), на каждом 60-м кадре делаете это, или если вам нужна большая точность, тогда в каждом onDraw () проверяйте системное время и выполняйте что-нибудь, когда Прошла секунда.

Вам также следует рассмотреть возможность использования двух методов: один для рисования onDraw (), а другой - для игровой логики, которые вызываются из вашего потока.

0 голосов
/ 25 сентября 2011

вы можете использовать AsyncTask для чего-то, чтобы работать в фоновом режиме

...