2012-12-04 51 views
1

我作出了「保衛城堡」風格的Android應用程序。遊戲完成,但我只需要幫助關閉我的表面視圖併爲玩家輸掉遊戲時開始新的活動。開始由布爾在GameThread(機器人)觸發新的活動

對於輸掉比賽的條件是隻是在我GameThread班布爾變量。該變量稱爲「丟失」,默認情況下設置爲false。當城堡的生命降到1以下時,迷失設置爲真,並且音效起作用。

理想情況下,我想停止當前循環的聲音效果,並打開一個新的活動(這是已經取得和工作)時,迷失正確的。

主要活動是如下:

import android.app.Activity; 
import android.content.Intent; 
import android.content.res.Configuration; 
import android.os.Bundle; 
import android.view.MotionEvent; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.view.Window; 
import android.view.WindowManager; 
import android.widget.Button; 

public class MainActivity extends Activity { 

    Button btn_startGame; 
    Activity activity; 

    GameView mGameView; 

    /** 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); 

     activity = this; 

     setContentView(R.layout.main); 

     btn_startGame = (Button) findViewById(R.id.btnStartGame); 
     btn_startGame.setOnClickListener(new OnClickListener() { 

      //@Override 
      public void onClick(View v) { 
       mGameView = new GameView(activity); 
       setContentView(mGameView); 
       mGameView.mThread.doStart(); 
      } 
     }); 
    } 

    @Override 
    public boolean onTouchEvent(MotionEvent event) { 
     try { 
      mGameView.mThread.onTouch(event); 
     } catch(Exception e) {} 

     return true; 
    } 

    @Override 
    public void onConfigurationChanged(Configuration newConfig) { 
     // ignore orientation/keyboard change 
     super.onConfigurationChanged(newConfig); 
    } 
} 

的surfaceview在這個類稱爲GameView創建:

import android.content.Context; 
import android.content.Intent; 
import android.os.Handler; 
import android.os.Message; 
import android.util.Log; 
import android.view.SurfaceHolder; 
import android.view.SurfaceView; 
import android.view.SurfaceHolder.Callback; 

public class GameView extends SurfaceView implements Callback { 

    Context mContext; 
    GameThread mThread; 

    public GameView(Context context) { 
     super(context); 
     this.mContext = context; 

     getHolder().addCallback(this); 

     mThread = new GameThread(getHolder(), mContext, new Handler() { 
      @Override 
      public void handleMessage(Message m) { 
       // Use for pushing back messages. 
      } 
     }); 

     setFocusable(true); 
    } 

    //@Override 
    public void surfaceChanged(SurfaceHolder holder, int format, int width, 
      int height) { 

     Log.d(this.getClass().toString(), "in SurfaceChanged()"); 
    } 

    //@Override 
    public void surfaceCreated(SurfaceHolder holder) { 
     Log.d(this.getClass().toString(), "in SurfaceCreated()"); 
     mThread.running = true; 
     mThread.start(); 
    } 

    //@Override 
    public void surfaceDestroyed(SurfaceHolder holder) { 
     Log.d(this.getClass().toString(), "in SurfaceDestroyed()"); 

     boolean retry = true; 
     mThread.running = false; 
     while (retry) { 
      try { 
       mThread.join(); 
       retry = false; 
      } catch (InterruptedException e) { 
      } 
      GameThread.music.stop(); 
      GameThread.groan1.stop(); 
      GameThread.groan2.stop(); 
      GameThread.walk.stop(); 

      GameThread.music.release(); 
      GameThread.groan1.release(); 
      GameThread.groan2.release(); 
      GameThread.walk.release(); 
      GameThread.shoot.release(); 
     } 
    } 

} 

的GameThread類包含所有的繪製的,邏輯和所有運行方法(如下)。

@Override 
    public void run() { 
     // check if condition here 
     if(lost){ 
      mContext.runOnUiThread(new Runnable() { 
      @Override 
      public void run() { 
       //start Activity here 

        Intent intent = new Intent(mContext, LoseActivity.class); 
        mContext.startActivity(intent); 
      } 
      }); 
      } 
      else{ 
     if (running == true) { 
      while (running) { 
       Canvas c = null; 
       try { 
        c = mHolder.lockCanvas(); 
        if (width == 0) { 
         width = c.getWidth(); 
         height = c.getHeight(); 

         player.x = 50; 
         player.y = 45; 
        } 

        synchronized (mHolder) { 
         long now = System.currentTimeMillis(); 

         update(); 
         draw(c); 
         ifps++; 

         if (now > (mLastTime + 1000)) { 
          mLastTime = now; 
          fps = ifps; 
          ifps = 0; 
         } 
        } 
       } finally { 
        if (c != null) { 
         mHolder.unlockCanvasAndPost(c); 
        } 
       } 
      } 
     } 
     } 

我想要開始的活動叫做LoseActivity.class。提前感謝您的幫助。如果有人需要進一步的代碼/解釋,我將非常樂意發佈它。

回答

1

使用runOnUiThread從主題出發的活動爲:

更改您的主要活動爲:

public class MainActivity extends Activity { 

    Button btn_startGame; 
    Activity activity; 

    GameView mGameView; 

    /** 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); 

     activity = this; 

     setContentView(R.layout.main); 

     btn_startGame = (Button) findViewById(R.id.btnStartGame); 
     btn_startGame.setOnClickListener(new OnClickListener() { 

      //@Override 
      public void onClick(View v) { 
       mGameView = new GameView(activity,MainActivity.this); 
       setContentView(mGameView); 
       mGameView.mThread.doStart(); 
      } 
     }); 
    } 
    ///your code..... 

更改GameView類爲:

public class GameView extends SurfaceView implements Callback { 

    Context mContext; 
    Activity contextx; 
    GameThread mThread; 

    public GameView(Context context,Activity contextx) { 
     super(context); 
     this.mContext = context; 
     this.contextx=contextx; 

     getHolder().addCallback(this); 

     mThread = new GameThread(getHolder(), mContext, new Handler() { 
      @Override 
      public void handleMessage(Message m) { 
       // Use for pushing back messages. 
      } 
     }); 

     setFocusable(true); 
    } 
    //your code here.......... 

@Override 
    public void run() { 
     // check if condition here 
     if(lost){ 
      contextx.runOnUiThread(new Runnable() { 
      @Override 
      public void run() { 
       //start Activity here 

        Intent intent = new Intent(contextx, LoseActivity.class); 
        contextx.startActivity(intent); 
      } 
      }); 
      } 
      else{ 
    //your code here......... 
+0

當我您的代碼粘貼到我的GameView構造函數,我得到一個錯誤,說:「方法runOnUiThread(新的Runnable(){})是未定義的類型上下文」。這是什麼意思,我該如何解決?此外,假設這是工作,我只是將一個if語句的意圖檢查,如果失去= true? – Mike

+0

不要將我的代碼放在GameView構造函數中。只需將它複製到您希望在Thread的run方法內的Thread中啓動活動並將您的if條件放入runOnUiThread的run方法內。我認爲這會工作F9 –

+0

看到我的編輯答案 –