2012-01-17 10 views
0

私はこのtutorialに基づいてゲームを開発しています。 私はほとんどのゲームを動作させることができましたが、ユーザーがホームボタンを押したときに、ゲームはバックグラウンドで実行され続けます。また、onPauseメソッドを使用してゲームを一時停止できます。ホームボタンを押した後、SurfaceViewにフォーカスを失う

ユーザーがゲームを再開すると、どのメソッドも呼び出されず、パネルのフォーカスが失われます。

ホームボタンを押した後、ゲームがバックグラウンドに送信された後、再びフォーカスを得ることができますか?

My活動コード:

@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..."); 
} 

Myパネルコンストラクタ:

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からの提案の後、私は一時停止メソッドを削除し、ログだけを残して、なぜそれがonResume()メソッドに到達しないのかわかりません!

答えて

1

私は解決策を見つけました。ホームボタンが押されたとき、私のgameloopスレッドはまだ実行されていました、onStopは呼び出されませんでした、そして、私はそのアクティビティが決して適切に停止されなかったと推測しています。今、私のonPauseメソッドは実際にスレッドの実行を終了し、Lunar Landerの例のバグを実行します。

このBlogは私の表面の作成者に以下のコードを追加することによって、バグを解決する私を助け:

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

代わりonResumeを(作る)方法を保護し、それ公共作ってみてください。..

また、メソッドの先頭にsuper.onResume();を移動してみてください..私はそのかなり確信しています"オーバーライド"関数で呼び出される最初のものである必要があります。

+0

いいえ..役に立たなかった。 onResumeやその他のOverridenメソッドにはまだ到達していません。私は、コードが今のところどのようになっているか、私の答えを編集しました。 – caiocpricci2

+0

'super.onResume();の前にまだ' panel.pauseGame(false); 'があります。ホームがヒットしたときにAndroidアクティビティライフサイクルがonPause()に到達する必要がありますそれを元に戻すには、onResume()を実行して実行を続行する必要があります。super.onResume()は、メソッドが通常どおりに行うようにするために含まれています。これをオーバーライドしなかった場合の処理​​です。これが通常行われる最初のものとして通常含まれている理由です。 – DizzyThermal

+0

pauseGameの有無にかかわらず、何も変更されませんが、ログはまだ私にonResume、onRestart、onStart、何も与えません。私が帰宅した後に帰った後、どの方法も呼ばれません。そして、なぜ私は理解していない。 – caiocpricci2

関連する問題