我正在开发一款能够在工作线程上处理画布绘制的小型Android游戏。游戏结束后,这个线程应该开始下一个活动,但不知何故,UI线程似乎被启动一个新函数阻止。
这是我的游戏主循环:
while(true)
// Perform Ticks until the player makes a mistake
c = _surfaceHolder.lockCanvas();
if ((toDraw = rh.performTick()) == null) {
lose();
break;
}
_surfaceHolder.unlockCanvasAndPost(draw(toDraw,c));
}
函数performTick()
处理游戏逻辑并在游戏结束时返回null
。 draw()
执行渲染。这两个函数都很完美 - 问题是lose()
,它除了启动一个新的Activity之外什么也没做:
protected void lose() {
Handler handler = new Handler(Looper.getMainLooper());
handler.post(new Runnable() {
@Override
public void run() {
Intent intent = new Intent(_context, MainMenu.class);
_context.startActivity(intent);
}
});
}
当游戏结束时,新的Activiy(MainMenu)会正常启动,但不会对任何触摸事件作出反应。没有LogCat输出,也没有发生异常。更糟糕的是,lose()
在主循环开始时调用它时正常工作。
我已经为此工作了好几天了。我试图直接从工作线程启动Activity(不使用Handler
中的lose()
)并在互联网上搜索了几个小时 - 没有任何帮助。似乎UI线程以某种方式被阻塞或陷入无限循环,我不知道如何解决这个问题。
所有内容都在Nexus 4设备上进行调试。
顺便说一下:MainMenu.onCreate()
以另一种方式开始正常工作。
请帮忙, MA3o
答案 0 :(得分:0)
当if语句为true时,您不会解锁画布。休息会让你离开,让画布锁定。
while(true)
// Perform Ticks until the player makes a mistake
c = _surfaceHolder.lockCanvas();
if ((toDraw = rh.performTick()) == null) {
lose();
break;
}
// this line won't be executed whether the if statement above is true
_surfaceHolder.unlockCanvasAndPost(draw(toDraw,c));
}
你也应该在if语句中解锁(在lose()之前或之后)。
答案 1 :(得分:0)
相反,如果While(true)
你可以While(myVar)
,其中myVar
是一个布尔值,当游戏应该运行时为true,当你调用lose()
时设置为false在你的情况下你继续画,虽然你不需要。