2011-12-22 12 views
0

私は、ゲームスレッドの再生中にユーザーがデバイスの戻るボタンを押したときにゲームを開発中です。スクリーン上に警告ダイアログが表示されます。ユーザーがゲームを終了したくない場合スレッドを再開してアラートダイアログが消えるはずです。しかし、問題はゲームスレッドを再開できますが、以下のアラートダイアログをキャンセルできませんでした。私の戻るボタンのイベントコードスニペットです。警告ダイアログがキャンセルされない

public boolean onKeyDown(int keyCode, KeyEvent event) { 
    if (keyCode == KeyEvent.KEYCODE_BACK) { 

     MainGamePanel.thread.setRunning(false); 

     AlertDialog alertDialog = new AlertDialog.Builder(this).create(); 
      alertDialog.setTitle("Exit Alert"); 
      // alertDialog.setIcon(R.drawable.appicon); 

      alertDialog.setMessage("Do you really want to exit the Game?"); 
      alertDialog.setButton("Yes", new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog, int which) { 
       finish(); 
       return; 
      } }); 
      alertDialog.setButton2("No", new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog, int which) { 


        if(mainscreenOn) 
        { 
         dialog.cancel(); 
        } 
        else 
        { 
         dialog.cancel(); 
         GamePanel.thread.setRunning(true); 
         GamePanel.thread.run(); 
        } 


       return; 
      }}); 
      alertDialog.show(); 

     return true; 
    } 
    return super.onKeyDown(keyCode, event); 
} 

mainscreenOnフラグがtrueの場合、問題はそれがfalse.can誰が私を助けてくださいている場合...私はこの上で立ち往生していていますcancelled..but、警告ダイアログが取得している...

私は私はコントロールが起こっているコードをデバッグするとき

public class GameThread extends Thread { 

private static final String TAG = GameThread.class.getSimpleName(); 

// Surface holder that can access the physical surface 
private SurfaceHolder surfaceHolder; 
// The actual view that handles inputs 
// and draws to the surface 
private MainGamePanel gamePanel; 


// flag to hold game state 
public boolean running; 
public void setRunning(boolean running) { 
    this.running = running; 
} 

public GameThread(SurfaceHolder surfaceHolder, MainGamePanel gamePanel) { 
    super(); 
    this.surfaceHolder = surfaceHolder; 
    this.gamePanel = gamePanel; 
} 



@Override 
public void run() { 
    Canvas canvas; 
    Log.d(TAG, "Starting game loop"); 

    while (running) { 

     Log.v(""," ->Inside Thread!" + running); 
     canvas = null; 
     // try locking the canvas for exclusive pixel editing 
     // in the surface 
     try { 
      canvas = this.surfaceHolder.lockCanvas(); 
      synchronized (surfaceHolder) { 
       // update game state 
       this.gamePanel.update(); 
       // render state to the screen 
       // draws the canvas on the panel 
       this.gamePanel.render(canvas); 

       } 
     } finally { 
      // in case of an exception the surface is not left in 
      // an inconsistent state 
      if (canvas != null) { 
       surfaceHolder.unlockCanvasAndPost(canvas); 
      } 
     } // end finally 
    } 
} 



} 

...それは私のゲームの問題以下thread..givenが私のゲームのスレッドコードである...それは警告ダイアログの問題ではないことを知るようになりましたこのコードに貼り付けてここに貼り付けてください。

答えて

0

私はGamePanelの文、真とflaseに等しいmainscreenOnの両方のためにその作業罰金なしで、あなたのコードをテストしました。

私はあなたのケースで考えるmainScreenOnが falseの場合、そのはonClick()から戻っていない、またはGamePanel.thread.setRunning()GanePanel.thread.run()にそのstruckingを意味します。


このリンクをチェックすると役立つことがあります。スレッドの一時停止と再開について

How to pause/resume thread in Android


あなたはsetRunning(true)run()を呼んでいます。あなたのスレッドにRunnableオブジェクトがある場合は、run()に電話しなければならないと思います。あなたがRunnableオブジェクトを使用していない場合

Thread t = new Thread(new Runnable() { 
     public void run() { 
      // your task 
     } 
}); 

以下のように、私はrun()を呼び出す必要だと思いません。とにかくあなたはrunning変数でスレッドを制御しています。

これを確認してください。あまりにも自信がありません。

+0

ここからスレッドを呼び出すのは問題ですが、私はそれを修正する方法を教えてくれませんでした... –

+0

私はあなたを考えましたこの理由を知らない、申し訳ありません私はあなたの問題を解決するためにあなたを助けることはできません。 bye –

+0

もし私がrun()メソッドを呼び出していないのであれば、どうすれば呼び出すことができますか?setRunning(true)statement.butで試してみましたが、動作しません。 –

0

cancel()の代わりにダイアログのdismiss()を呼び出す必要があります。

dialog.dismiss(); 

は、私はあなたがcancelling.Youは、次のようにそれを行うことができます をチェックするべきではないと思うあなたはdialog.Soをキャンセルしている各条件については、この1

+0

not working .... –

0

を試してみてください。

alertDialog.setButton2("No", new DialogInterface.OnClickListener() { 
        public void onClick(DialogInterface dialog, int which) { 
         dialog.dismiss(); 
         if(!mainscreenOn) 
         { 
          GamePanel.thread.setRunning(true); 
          GamePanel.thread.run(); 
         } 


        return; 
       }}); 

編集:

を次に、それは「Yugandharバブー」で言及されたポイントをチェックし、その後は動作しませんButton.If正ボタンとマイナスにしてみてください。

AlertDialog.Builder builder = new AlertDialog.Builder(this);; 
       builder.setMessage("Are you sure you want to exit?") 
         .setCancelable(false) 
         .setPositiveButton("Yes", new DialogInterface.OnClickListener() { 
          public void onClick(DialogInterface dialog, int id) { 
           finish(); 
          } 
         }) 
         .setNegativeButton("No", new DialogInterface.OnClickListener() { 
          public void onClick(DialogInterface dialog, int id) { 
           dialog.cancel(); 
          } 
         }); 
       AlertDialog alert = builder.create(); 
       alert.show(); 
+0

私はこれを試しましたが、まだ使用していません...警告ダイアログはキャンセルされません。 –

関連する問題