2012-07-04 6 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); 
      } 
     } 
    } 

} 

И теперь я могу играть. До этого момента все в порядке.

Если игрок проиграл новое действие (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)); 

} 

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

Не очень, но это работает!

Очистить

0

Я думаю, проблема в том, что вы используете два синхронизированных блока, один для рендера (в пределах игры), а другой - для завершения. Второй блок должен дождаться первого , чтобы остановить выполнение, что никогда не было, поэтому игра зависает.

Попробуйте удалить инструкцию «synchronized (surfaceHolder)» из второго фрагмента кода , который вы опубликовали.

+0

Спасибо за ваш ответ. Я использовал вашу идею, но это произошло с теми же явлениями, что и bevorher. – partykeller1408

+0

Вы можете распечатать значение gameLoop.running как раз перед тем, как оно зависнет в gameLoop.join()? Какова его ценность? Также вы можете распечатать его в цикле игрового потока? –

+0

Значение gameLoop.runnig находится в начале эндшпиля() true. – partykeller1408

Смежные вопросы