2016-06-28 6 views
0

Я следую этому руководству по разработке игр, и я столкнулся с чем-то, что немного озадачивает меня.Ссылка на текущую ссылку для Android SurfaceView

Итак, в учебнике создан класс, который расширяет SurfaceView, реализующий Runnable, для управления представлением содержимого основной игры. Вид поверхности устанавливается как вид контента основной деятельности следующим образом: определяется класс

public class MainActivity extends Activity { 

    private GameView gameView; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     gameView = new GameView(this); 
     setContentView(gameView); 
    } 

    @Override 
    protected void onPause() { 
     super.onPause(); 
     gameView.pause(); 
    } 

    @Override 
    protected void onResume() { 
     super.onResume(); 
     gameView.resume(); 
    } 
} 

SurfaceView следующим образом:

public class GameView extends SurfaceView implements Runnable { 
    Thread gameThread = null; 
    private boolean playing; 

    public TDView(Context context) { 
     super(context); 

     // other game logic 
    } 

    public void pause() { 
     playing = false; 
     try { 
      gameThread.join(); 
     } catch (InterruptedException e) { 
     } 
    } 

    public void resume() { 
     playing = true; 
     gameThread = new Thread(this); 
     gameThread.start(); 
    } 

    @Override 
    public void run() { 
     while (playing) { 
      update(); 
      draw(); 
      control(); 
     } 
    } 
} 

Не поймите меня неправильно - код работает отлично, но я смущен относительно , где переменная gameThread получает экземпляр? В моем проекте нет строки кода, указывающей на это, кроме того, в методе возобновления. Является ли метод resume для создания экземпляра GameView, или есть что-то еще, что мне не хватает?

Извините, если это глупый вопрос, но я не мог понять, как это сделать.

+0

В 'gameThread = new Thread (this); реализация Runnable, переданная конструктору Thread, и' gameThread.start() 'выполняет метод Overwritten' run() '. См. [Link] (https://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html#Thread (java.lang.Runnable)) –

+0

Но этот код находится в резюме() метод GameView. Этот метод называется созданием экземпляра GameView? – Nirri

+1

Он вызывается, когда игровое представление возобновляется; это должно быть после отображения представления и «активного», так что экземпляр «Thread» игры не пытается манипулировать «SurfaceView», если он недействителен для рендеринга. Не видя оставшегося кода, это, вероятно, происходит во время жизненного цикла активности (например, «Activity.onResume») и/или пункта меню, чтобы начать/приостановить/возобновить игру. –

ответ

1

pause() не будет вызываться, если действие не возобновлено. Таким образом, этот подход прекрасен. Каждый раз, когда pause() называется gameThread, он не является нулевым.

+0

Я вижу, я должен был смотреть на жизненный цикл деятельности. Благодаря! – Nirri

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