2011-12-22 161 views
0

我應該怎麼做才能在showExitDialog()這裏調用線程的pause()方法? 這裏開始遊戲類在ExitDialog上暫停線程

package game.mainmenu; 


import game.view.ViewPanel; 
import android.app.Activity; 
import android.app.AlertDialog; 
import android.content.DialogInterface; 
import android.os.Bundle; 
import android.view.KeyEvent; 
import android.view.Window; 
import android.view.WindowManager; 

public class StartGame extends Activity { 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     requestWindowFeature(Window.FEATURE_NO_TITLE); 
     getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); 

     setContentView(new ViewPanel(this));  

    } 

    @Override 
    protected void onPause() { 
     super.onPause(); 
     //saveScores(); 
     this.finish(); 
     System.exit(1);// pause game when Activity pauses 
    } 


    @Override 
    public boolean onKeyDown(final int pKeyCode, final KeyEvent pEvent) { 

     if (pKeyCode == KeyEvent.KEYCODE_BACK 
       && pEvent.getAction() == KeyEvent.ACTION_DOWN) { 
      showExitDialog(); 

      return true; 
     } 

     return super.onKeyDown(pKeyCode, pEvent); 
    } 

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

     AlertDialog alert = builder.create(); 
     //alert.setIcon(android.R.drawable.star_on); 
     alert.show(); 

    } 
} 

這裏有類主線程

public class ViewManager extends Thread 
{ 
    //some states here 
    public static final int STATE_LOSE = 1; 
    public static final int STATE_PAUSE = 2; 
    public static final int STATE_READY = 3; 
    public static final int STATE_RUNNING = 4; 
    public static final int STATE_WIN = 5; 

    //..some not mention code here../ 

    public ViewManager(SurfaceHolder surfaceHolder, Context context) 
    { 
     mSurfaceHolder = surfaceHolder; 
     mRunning = false; 
     mHealthBar = new Rect(0,0,0,0); 
     mLinePaint = new Paint(); 
     mLinePaint.setAntiAlias(true); 
     mLinePaint.setARGB(255, 0, 255, 0); 
     mLinePaint.setTextSize(16); 
     mLinePaint.setStrokeWidth(3); 
     mContext = context; 
     Resources res = context.getResources(); 

     //..some not mention code here../ 
     InitElements(res); 

     mHero = new PlayerAnimated(mPlayerImage, FIELD_WIDTH/2, 600, 64, 64, 3, 3, context, mEnemiesList); 
     //mBoom = new Explosion(mExplosionImage, 200, 500, 64, 64, 7, 7); 
     mEnemyImage = BitmapFactory.decodeResource(res, R.drawable.enemyone); 

     setState(STATE_RUNNING); 

    } 


    /** 
     * threads state 
     * @param running 
     */ 
     public void setRunning(boolean running) 
     { 
      mRunning = running; 
     } 

     //..some not mention code here../ 

     public void run() 
     { 
      while (mRunning) 
      { 
       Canvas canvas = null; 
       try 
       { 
        // подготовка Canvas-а 
        canvas = mSurfaceHolder.lockCanvas(); 
        synchronized (mSurfaceHolder) 
        { 
         if(mMode == STATE_RUNNING){ 

          // draw if not paused 
          addEneimes(mContext); 

          updateStuff(); 

          doDraw(canvas); 
         } 
         else 
         { 
          pauseDraw(canvas); 
         } 
         ViewPanel.displayFps(canvas, aString); 

         aString = Integer.toString(hudscore.getScore()); 

        } 
       } 
       catch (Exception e) { } 
       finally 
       { 
        if (canvas != null) 
        { 
         mSurfaceHolder.unlockCanvasAndPost(canvas); 
        } 
       } 
      } 
     } 

     //..some not mention code here../ 

    public void pause() { 
     synchronized (mSurfaceHolder) { 
      setState(STATE_PAUSE); 
      mLastFiredTime = System.currentTimeMillis() + 100; 
     } 
    } 

    public void unpause() { 
     // 
     synchronized (mSurfaceHolder) { 
      setState(STATE_RUNNING); 
      mLastFiredTime = System.currentTimeMillis() + 100; 
     } 
    } 

    public void setState(int mode) 
    { 
     mMode = mode; 
    } 

    public void pauseDraw(Canvas canvas) 
    { 
     canvas.drawBitmap(Bitmap.createBitmap(FIELD_WIDTH, FIELD_HEIGHT, Bitmap.Config.RGB_565), 0, 0, null); 
    } 
} 
+0

但你甚至沒有在主代碼的任何地方創建線程... – Tudor 2011-12-22 12:55:04

+0

我ViewPanels類創建的線程。或者你的意思是我應該在'StartGame'活動中創建它? – user1107378 2011-12-22 12:59:08

回答

0

不是真的一個清晰的問題,因爲你沒有告訴我們要在其中創建和主代碼啓動線程。讓我們假設它是裏面的onCreate:

public class StartGame extends Activity { 

    private ViewManager viewManager = new ViewManager(); 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     requestWindowFeature(Window.FEATURE_NO_TITLE); 
     getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); 

     setContentView(new ViewPanel(this));  

     viewManager.start(); // start viewManager thread 
    } 

    // other methods 

    public void showExitDialog() { 

     viewManager.pause(); // call pause 

     // rest of code 
    } 
} 
+0

嗯,現在我想我明白了。我可以讓ViewPanel nad中的暫停方法只是從這個活動調用它不是嗎? – user1107378 2011-12-22 13:02:03

+0

@ user1107378:的確,這是另一個不錯的選擇。 – Tudor 2011-12-22 13:02:50