2011-07-10 18 views
3

私はAndroid 2.x用に開発しているゲームを持っています。プレイヤーが敗れたとき、私はそれを自動的に終了し、ゲームの前のメニューに戻りたいと思います。これは簡単な質問かもしれませんが、どうすればいいですか?SurfaceViewを自動的に終了

私はGameActivityを呼び出します。これはGameActivityを呼び出します。GameActivityはゲームロジックが存在するGameView(SurfaceViewの実装)を呼び出します。

更新:いいえ、それよりも複雑です。このゲームを作るために、私はスレッドを使ったMoonLanderの例に従った。

GameView

public class GameActivity extends Activity 
{ 
GameView gameView; 
GameThread gThread; 

/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    gameView = new GameView(this); 
    setContentView(gameView); 

    gThread = gameView.getThread(); 
    gThread.doStart(); 
} 

}

GameView

package com.cp.balldrop; 

public class GameView extends SurfaceView implements SurfaceHolder.Callback 
{ 
    class GameThread extends Thread 
    { 


    public GameThread(SurfaceHolder sHolder, Context context, Handler handler) 
    { 
     //Code 
    } 

    public void doStart() 
    { 
     synchronized (mSurfaceHolder) 
     { 

     } 
    } 

    @Override 
    public void run() 
    { 
     while (running) 
     { 
      Canvas c = null; 
      try 
      { 
       c = mSurfaceHolder.lockCanvas(null); 
       synchronized (mSurfaceHolder) 
       {  
        doDraw(c); 
       } 
      } 
      finally 
      { 
       if (c != null) 
       { 
        mSurfaceHolder.unlockCanvasAndPost(c); 
       } 
      } 
     } 
    } 

    protected void doDraw(Canvas canvas) 
    { 
      //code 
    } 
} 

/** Handle to the application context, used to e.g. fetch Drawables. */ 
private Context mContext; 

/** Pointer to the text view to display "Paused.." etc. */ 
private TextView mStatusText; 

/** The thread that actually draws the animation */ 
private GameThread gThread; 

public GameView(Context context) 
{ 
    super(context); 

    // register our interest in hearing about changes to our surface 
    SurfaceHolder holder = getHolder(); 
    holder.addCallback(this); 

    // create thread only; it's started in surfaceCreated() 
    gThread = new GameThread(holder, context, new Handler() 
    { 
     @Override 
     public void handleMessage(Message m) 
     { 
      // mStatusText.setVisibility(m.getData().getInt("viz")); 
      // mStatusText.setText(m.getData().getString("text")); 
     } 
    }); 

    setFocusable(true); 
} 

public GameThread getThread() 
{ 
    return gThread; 
} 

public void surfaceCreated(SurfaceHolder holder) 
{ 
    gThread.start(); 
} 

@Override 
public void surfaceDestroyed(SurfaceHolder holder) 
{ 
    boolean retry = true; 
    gThread.setRunning(false); 

    while (retry) 
    { 
     try 
     { 
      gThread.join(); 
      retry = false; 
     } 
     catch (InterruptedException e) 
     { 
     } 
    } 
} 
} 

答えて

3

が、私は私のsurfaceviewのdoTouchから次のメソッドを呼び出します。

public void doLose() { 
      synchronized (mSurfaceHolder) { 
       //quit to mainmenu 
       ((Activity) mContext).finish(); 
      }    
     } 

これが私のメイン・メニューの活動で私をバック投棄、surfaceviewとそれをホストする活動を停止しているようです。キャストと定義済みのコンテキストに注意してください。

2

何GameActivityにfinish()を呼び出してはどうですか?私のスレッドで

+0

これはGameActivityを終了しますが、ゲームの開始直後に終了します。 –

+0

それでは、プレーヤーが弛んだときに呼び出すべきです。 – mibollma

+0

@JesseJ @mibollmaええ、あなたがゲームを失ったときはどこでもfinish()を呼び出してください。サーフェスが破棄され、その時点でスレッドが停止するため、スレッド処理自体が処理されるはずですが、おそらくは結合にタイムアウトを設定することになります。 – Idistic

関連する問題