我正在开发一个小型 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);
            }
        });
    }

当游戏结束时,新的 Activity(MainMenu)正常启动,但不会对任何触摸事件做出反应。没有LogCat输出,也没有发生异常。更糟糕, lose()在主循环开始之前调用时工作正常。

我已经为此工作好几天了。我尝试直接从工作线程启动活动(不使用 Handlerlose())并在互联网上搜索了几个小时 - 没有任何帮助。UI 线程似乎被某种方式阻塞或陷入无限循环,我不知道如何解决这个问题。

一切都在 Nexus 4 设备上进行调试。

顺便提一句: MainMenu.onCreate() 以其他方式启动时工作正常。

请帮忙,ma3o

有帮助吗?

解决方案

当 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() 之前或之后)。

其他提示

相反,如果 While(true) 你可以有 While(myVar) 在哪里 myVar 是一个布尔值,当游戏应该运行时为 true,当您调用时设置为 false lose() 在你的情况下,你继续画画,尽管你不需要。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top