0

我正在制作我的第一个 android 游戏,但我的游戏线程有问题。问题是,当我暂停它并按返回或主页按钮时,我得到一个错误。“活动(在我的应用游戏中)没有响应。我的代码:

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

private Object mPauseLock;
private boolean mPaused;

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

public void setRunning(boolean run) {
    running = run;
    mPauseLock = new Object();
    mPaused = false;

}

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

        synchronized (mPauseLock) {
            while (mPaused) {
                try {
                    mPauseLock.wait();
                } catch (InterruptedException e) {
                }
            }
        }

    }

}

/**
 * Call this on pause.
 */
public void onPause() {
    synchronized (mPauseLock) {
        mPaused = true;
    }
}

/**
 * Call this on resume.
 */
public void onResume() {
    synchronized (mPauseLock) {
        mPaused = false;
        mPauseLock.notifyAll();
     }
   }
  }

我究竟做错了什么?

4

2 回答 2

1

首先,您是否尝试在应用程序运行时按下电源按钮?如果在您尝试后重新打开应用程序时应用程序仍在运行,那么您的线程代码和表面类就可以了。要解决您的问题(主页按钮部分),请将此方法添加到您的 appcompatactivity。

public class Game extends AppCompatActivity {
public int i = 0;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    requestWindowFeature(Window.FEATURE_NO_TITLE);
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);

    setContentView(new YourSurfaceGame(this,"player1"));
}
//Add this override method to your appcompatactivity
@Override
protected void onStart() {
    super.onStart();
    //Re-declare your surface game class is the main solution here
    setContentView(new YourSurfaceGame(this,"player1"));
}

@Override
protected void onPause() {
    super.onPause();
}
}

我花了几个小时才解决了按钮主页问题,尽管当我比较按下主页和电源按钮时我发现了一些奇怪的东西。如果您尝试此代码并开始注意到您的所有游戏进度都消失了,那么https://www.tutorialspoint.com/android/android_shared_preferences.htm就是答案。

我对其他游戏应用程序做了同样的事情,我的结论是正确的。按下主页或电源按钮后,游戏会暂停。实际上,如果您使用线程作为扩展,您会发现这个问题,而当您在主线程类中使用 timertask 作为扩展时,情况就不同了。不过,我以前从未尝试过。

于 2017-09-17T08:39:46.213 回答
0

很可能您的应用程序在恢复时尝试启动已停止的线程。这会导致错误并导致您的应用程序崩溃。

查看您的 Logcat 日志以进行检查。

于 2012-09-17T21:43:38.273 回答