Потеря фокуса на SurfaceView после нажатия кнопки Home - PullRequest
0 голосов
/ 18 января 2012

Я разрабатываю игру на основе этого учебника .Мне удалось заставить большую часть игры работать, но когда пользователь нажимает кнопку «Домой», моя игра продолжает работать в фоновом режиме, и я могу приостановить ее, используя метод onPause, и все, но он никогда не запускает метод onResume.

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

Как я могу заставить его снова получить фокус, после того, как игра была отправлена ​​в фоновый режим после нажатия кнопки «Домой»?

Код моей активности:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);        
    panel = new Panel(this);
    // requesting to turn the title OFF
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    // making it full screen        
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);
    // set our MainGamePanel as the View
    setContentView(panel);
    Log.d(TAG, "onCreate");
}



     @Override
 public void onStart(){
     super.onStart();
     Log.d(TAG,"onStart");
 }

 @Override
 public void onRestart(){
     super.onRestart();
     Log.d(TAG,"onRestart");

 }
 @Override
 public void onResume(){    
     super.onResume();
     Log.d(TAG, "onResume");        
 }

 @Override
 public void onSaveInstanceState(Bundle savedInstanceState) {
     super.onSaveInstanceState(savedInstanceState);
     Log.d(TAG, "onSaveInstance");      
 }

 @Override
 public void onRestoreInstanceState(Bundle savedInstanceState) {
     super.onRestoreInstanceState(savedInstanceState);
     Log.d(TAG, "onRestoreInstance");     
 }

 @Override
 public void onPause(){
     super.onPause();
     Log.d(TAG,"onpause");      
 }


 @Override
 public void onStop() {
  super.onStop();
  Log.d(TAG, "onStop..");
 }


 @Override
 public void onDestroy() {
  super.onDestroy();
  Log.d(TAG, "onDestroy...");
 }

МойКонструктор панели:

 WhackEmPanel(Context c) {
  super(c); 
  this.context=c;
  loadAnimations();
  setCharacters();
  getHolder().addCallback(this);
  backGround = BitmapFactory.decodeResource(getResources(), R.drawable.background); 
  // create the game loop thread
  thread = new MainThread(getHolder(),this);  
  setFocusable(true);      
  //Generate Random Numbers for characters
  Picker = RandomPicker.RandomPick(8,500); //From 0 to 8, gives me 500 random integers
  picked=Picker.remove(0); 
 }

Я новичок в этом игровом программировании, но, насколько я понял, мне нужно снова вызвать setFocusable (true), но где?

РЕДАКТИРОВАТЬ: послеПо предложению DizzyThermal я удалил метод pause, оставив только журнал, и я не понимаю, почему он никогда не достигает метода onResume ()!

Ответы [ 2 ]

1 голос
/ 19 января 2012

Я нашел решение. Когда кнопка «Домой» была нажата, мой поток Gameloop все еще работал, никогда не вызывался onStop, и я предполагаю, что активность никогда не прекращалась должным образом. Теперь мой метод onPause фактически завершает выполнение Thread, и я сталкиваюсь с примером ошибки Lunar Lander.

Этот Блог помог мне решить эту проблему, добавив следующий код для моего создателя поверхности:

public void surfaceCreated(SurfaceHolder holder) {

  Log.d(TAG, "surfaceCreated");
 \\ <-- added fix
  if(thread.getState()== Thread.State.TERMINATED){
      thread = new MainThread(getHolder(),this); 
      thread.setRunning(true);
            thread.start();
 // <-- added fix
     }else {
  thread.setRunning(true);  //original code
  thread.start();           //original code
     }
 }

Мой метод onPause теперь фактически останавливает выполнение игрового потока.

 public void onPause(){
     super.onPause();
     panel.stopPLaying();
     Log.d(TAG,"onpause");      
 }
0 голосов
/ 18 января 2012

Вместо использования метода onResume () protected , попробуйте сделать его public ..

Также попробуйте переместить super.onResume(); к началу метода .. Я почти уверен, что он должен быть первым, что вызывается в функции " Overriden " ..

...