Android Gameloop:结束游戏并开始活动

Posted

技术标签:

【中文标题】Android Gameloop:结束游戏并开始活动【英文标题】:Android Gameloop: End Game and start Activity 【发布时间】:2012-07-04 09:26:21 【问题描述】:

我的 android 项目(我的第一个 Android 项目)中的 GameLoop 有问题:

我有一个 GameView (SurfaceView) 启动的 Activity。

setContentView(new GameView(this));

GameView (SurfaceView) 启动 GameThread。

    public void surfaceCreated(SurfaceHolder holder) 
    Log.d("GameView", "surfaceCreate");
    surfaceHolder = holder;
    synchronized (this)                //Must be executed exclusively
        if (gameLoop == null) 
            gameLoop = new GameLoop();  //Start animation here
            gameLoop.start();
        
    


    private class GameLoop extends Thread 

    public boolean running = true;

    public void run() 
        Canvas canvas = null;
        final SurfaceHolder surfaceHolder = GameView.this.surfaceHolder;

        while (running) 
            try 
                canvas = surfaceHolder.lockCanvas();
                synchronized (surfaceHolder) 
                    update();

                    checkCollision();

                    render(canvas);
                
             finally 
                if (canvas != null)
                    surfaceHolder.unlockCanvasAndPost(canvas);
            
        
    


现在我可以玩了。至此,一切正常。

如果玩家丢失了一个新的 Activity (GameOver) 启动并且 GameThread 停止。 他在这里崩溃了!

    public void endgame() 

    Log.d("GameView", "ENDGAME");

    this.score.setStopscoring(true);
    this.box.stop();

    synchronized (surfaceHolder) 
        boolean retry = true;
        if (gameLoop != null)  
            gameLoop.running = false;
            while (retry) 
                try 
                    gameLoop.join();
                    retry = false;
                 catch (Exception e) 
                
            
        

    

    Context context = getContext();
    context.startActivity(new Intent(context, _1GameOver.class));   


gameLoop.join(); 之后它会冻结。

我尝试了很多,但没有任何效果。 之前谢谢你的帮助

【问题讨论】:

【参考方案1】:

我认为问题在于您使用了两个同步块,一个用于渲染 (在gameLoop内),另一个结束它。第二块必须等待 第一个停止执行,这永远不会,因此游戏冻结。

尝试从第二部分中删除“ synchronized (surfaceHolder) ”语句 您发布的代码。

【讨论】:

感谢您的回答。我使用了你的想法,但它发生了与bevorher相同的现象。 你能在 gameLoop.running 在 gameLoop.join() 冻结之前打印它的值吗?它的价值是什么?你也可以在游戏线程循环中打印它吗? gameLoop.runnig 的值在 endgame() 的开头为真。 @Ebrahim 如果你去掉 synchronize 关键字,你需要让运行 volatile 或者游戏循环可能永远看不到更新的值。【参考方案2】:

我没有找到确切的错误。

相反,我稍微转换了代码。

    public void surfaceDestroyed(SurfaceHolder holder) 

        boolean retry = true;

        if (gameLoop != null) 

            gameLoop.running = false;

            while (retry) 
                try 
                    gameLoop.join();
                    retry = false;  
                 catch (InterruptedException e) 
                
            
        
        gameLoop = null;

以及我在关闭 Activity 时得出的所有结论。

((_1GameActivity)getContext()).finish();

不漂亮,但它有效!

打个招呼

【讨论】:

以上是关于Android Gameloop:结束游戏并开始活动的主要内容,如果未能解决你的问题,请参考以下文章

Android Gameloop (openGL ES 2.0) 的问题

重置游戏循环/重启游戏java swing

在 Windows 窗体中实现 gameloop [关闭]

C# 控制台应用程序 - gameloop / 多个对象

如何暂停和恢复 GameLoop?

gameloop和deltatime插值c ++