2012-07-04 35 views
0

我有我的GameLoop在我的Android PROJEKT一个问题(我的第一款Android PROJEKT):的Android Gameloop:游戏结束,并开始活动

我的GameView(SurfaceView)开始一个活动。

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();它冻结。

我试了很多,但没有任何工作。 前,感谢你的帮助

回答

0

我还没有找到确切的错误。

相反,我转换了一下代码。

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

不漂亮,但它的作品!

Pease out

0

我认为这个问题是您正在使用两个同步块,一个渲染 (在gameLoop内),另结束它。第二块必须等待 第一块停止执行,这从来不是,因此游戏结冰。

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

+0

感谢您的回答。 我已经使用你的想法,但它发生在与bevorher相同的现象。 – partykeller1408

+0

可以在gameLoop.join()冻结之前打印gameLoop.running的值吗?它的价值是什么?你也可以在游戏线程循环中打印它吗? –

+0

gameLoop.runnig的值在endgame()true开始。 – partykeller1408