要运行我在Android上创建的游戏,我一直在使用GamePanel包含方法onDraw()和onTouch()。我也一直在使用GameThread类,它反复调用onDraw()和update()。
我的活动实例化GamePanel,我的GamePanel实例化GameThread。
我的onPause()只是将线程内的while循环中的条件设置为false。我的onResume()过去只是设置为等于true,但每次我尝试恢复应用程序时都会给我一个强制关闭错误(参见编辑#1 )。
因此,为了解决问题,我只是重新实例化了线程,
thread = new GameThread(getHolder(), this);
这解决了问题的一部分,允许我最小化应用程序,然后重新打开它没有问题。但是,当我在应用程序中并锁定手机然后解锁它(打开和关闭屏幕)时,线程永远不会启动。这只是我的游戏处于冻结状态。
我知道我对这个问题的解决方案非常时髦,我很想学习一种更为公认和干净的方法来完成这一切。
这是代码(我遗漏了一些似乎不相关的行):
GameActivity:
void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
gamePanel = new MainGamePanel(this);
setContentView(gamePanel);
}
protected void onPause() {
super.onPause();
gamePanel.shutDown();
}
protected void onResume() {
super.onResume();
gamePanel.startUp();
}
的GamePanel
public MainGamePanel(Context context) {
super(context);
getHolder().addCallback(this); //adding the callback (this) to the surface holder to intercept events
thread = new GameThread(getHolder(), this); // create the game loop thread
setFocusable(true); // make the GamePanel focusable so it can handle events
}
public void startUp() {
thread = new GameThread(getHolder(), this);
}
public void shutDown() {
thread.setRunning(false);
}
GameThread
public GameThread(SurfaceHolder surfaceHolder, MainGamePanel gameView) {
this.surfaceHolder = surfaceHolder;
this.gameView = gameView;
this.run = true;
}
public void setRunning(boolean run) {
this.run = run;
}
public void run() {
Canvas c;//
while (run) {
c = null;
try {
c = surfaceHolder.lockCanvas(null);
synchronized (surfaceHolder) {
gameView.update();
gameView.onDraw(c);
}
} finally {
if (c != null) {
surfaceHolder.unlockCanvasAndPost(c);
}
}
}
}
如果您需要更多信息或如何让我的问题更清晰,请告诉我(同样,我是否以可理解的庄园展示我的代码?)。
一点点帮助将会有很长的路要走。如果您能提出任何建议,请提前致谢。
- 编辑#1 -
当我关闭力量时,这是我的日志猫错误。
12-23 14:01:34.288: E/AndroidRuntime(9484): java.lang.IllegalThreadStateException: Thread already started.
- 编辑#2 -
我尝试了你所说的并将我的run()方法改为:
@Override
public void run() {
Canvas c;
while (true) {
if (run) {/* run game thread */
c = null;
try {
c = surfaceHolder.lockCanvas(null);
synchronized (surfaceHolder) {
gameView.update();
gameView.onDraw(c);
}
} finally {
if (c != null) {
surfaceHolder.unlockCanvasAndPost(c);
}
}
} else {
try {
Thread.sleep(100);
} catch (Exception e) {
}
}
}
}
当我锁定手机时它起了作用,但是当我最小化应用程序并重新打开它时,我看到了一个黑屏,几秒钟后弹出“MyApp没有响应。”你要关闭它吗? ”。我检查了它到达的位置,它似乎到达onPause()和shutDown(),但它从未进入onResume();.此外,有时甚至在调用onPause()或shutDown()之后调用update(),这很奇怪。 (从LogCat获得信息)