Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/185.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/kubernetes/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android Gameloop:结束游戏并开始活动_Java_Android_Multithreading_Surfaceview_Game Loop - Fatal编程技术网

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

Java Android Gameloop:结束游戏并开始活动,java,android,multithreading,surfaceview,game-loop,Java,Android,Multithreading,Surfaceview,Game Loop,我的Android项目(我的第一个Android项目)中的GameLoop有问题: 我有一个GameView(SurfaceView)启动的活动 GameView(SurfaceView)启动游戏线程 public void surfaceCreated(SurfaceHolder holder) { Log.d("GameView", "surfaceCreate"); surfaceHolder = holder; synchronized (this) {

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

我有一个GameView(SurfaceView)启动的活动

GameView(SurfaceView)启动游戏线程

    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);
            }
        }
    }

}
现在我可以玩了。到目前为止,一切都很好

如果玩家丢失了一个新的活动(GameOver),游戏线程将停止。 他在这里撞车了

    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()之后它冻结

我试了很多,但都没用。
感谢您之前的帮助

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

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

我没有找到确切的错误

相反,我对代码进行了一些转换

    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;
}
我总结的每件事都是我结束活动的地方

((_1GameActivity)getContext()).finish();
不漂亮,但它的工作


走开

谢谢你的回答。我使用了你的想法,但它出现了与bevorher相同的现象。你能在gameLoop.join()冻结之前打印gameLoop.running的值吗?它的价值是什么?您还可以在游戏线程循环中打印它吗?gameLoop.runnig的值位于endgame()true的开头。@Ebrahim如果删除synchronize关键字,您需要使running变为volatile,否则游戏循环可能永远看不到更新的值。
((_1GameActivity)getContext()).finish();