2012-01-17 2 views
0

나는이 tutorial을 기반으로 게임을 개발 중입니다. 나는 대부분의 게임을 작동시킬 수 있었지만 사용자가 홈 버튼을 누르면 내 게임은 백그라운드에서 계속 실행되며 onPause 메서드를 사용하여 일시 중지 할 수 있지만 onResume 메서드는 실행하지 않습니다.홈 버튼을 누른 후 SurfaceView에 포커스가 없어짐

사용자가 게임을 다시 시작하면 아무런 메서드도 호출되지 않고 내 패널의 포커스가 손실됩니다.

홈 버튼을 누른 후 게임이 백그라운드로 전송 된 후에 다시 초점을 맞출 수 있습니까?

내 활동 코드 :

@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를 호출 할 필요가 이해로 (참) 다시,하지만 어디?

편집 : DizzyThermal에서 제안한 후에는 일시 중지 메서드를 제거하고 로그 만 남기고, 왜 그것이 onResume() 메서드에 도달하지 않는지 이해할 수 없습니다! 대신 onResume()를 보호 방법을 만드는

답변

1

해결책을 찾았습니다. 홈 버튼이 눌려 졌을 때, 내 gameloop Thread는 여전히 실행 중이었고, onStop은 호출되지 않았으며, 그 활동이 절대로 적절하게 중단되지 않았다고 추측합니다. 이제 내 onPause 메서드는 실제로 스레드 실행을 완료하고 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 방법은 지금 실제로 게임 스레드 실행을 중지 :이 Blog

는 내 표면 작성자에게 다음 코드를 추가하여 버그를 해결하는 데 도움.

public void onPause(){ 
    super.onPause(); 
    panel.stopPLaying(); 
    Log.d(TAG,"onpause");  
} 
0

, 또한 .. 그것은 공공 만들기

을 시도하는 방법의 상단에 super.onResume();를 이동하려고 .. 나는 확신 "오버레이"함수에서 가장 먼저 호출해야합니다.

+0

아니요. 도움이되지 않았습니다. onResume 또는 다른 Overriden 메서드에 여전히 도달하지 않습니다. 코드가 지금과 같은 방식으로 내 대답을 편집했습니다. – caiocpricci2

+0

'super.onResume(); 앞에는 여전히 'panel.pauseGame (false);'가 있습니다. Home이 실행될 때 Android Activity Lifecycle은 onPause()에 도달해야합니다 (돌아 오기 전에 기다리는 시간에 따라 더 멀어 질 수도 있음). 다시 돌아 오면 실행을 계속하기 위해 onResume()을 통과해야합니다 .. super.onResume()은 메소드가 정상적으로 수행 할 작업을 포함하기 위해 포함됩니다.이 작업을 무시하지 않으면 수행 할 작업입니다. 이것이 정상적으로 수행되는 첫 번째 작업으로 포함 된 이유입니다. – DizzyThermal

+0

pauseGame의 유무와 상관없이 여전히 아무것도 변경하지 않습니다. 로그는 나에게 onResume, onRestart, onStart, 아무것도주지 않습니다. 집에 돌아온 후에 다시 돌아 오면 아무 방법도 호출되지 않습니다. 그리고 나는 왜 그런지 이해하지 못합니다. – caiocpricci2

관련 문제