2011-07-25 8 views
0

私はJavaで書かれた簡単なAndroidゲームを作っています。ここでsetContentView()スレッド内

public void startTheGame(View v) { 
theGame = new Panel(this); 
    setContentView(theGame); 
} 

は、パネルのコードは(ある:私は「startTheGame」と呼ばれるメソッドを呼び出すボタンを持っている「メイン」レイアウトインサイド

私は私の活動を持っている...

public class GameName extends Activity{ 
... 
public void onCreate(Bundle savedInstanceState) { 
super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
} 

簡略化)

class Panel extends SurfaceView implements SurfaceHolder.Callback { 
    public GameThread _thread; 
    public Panel(Context context) { 
     super(context); 
     getHolder().addCallback(this); 
     setFocusable(true); 
    } 
    ... 
    @Override 
    public void surfaceCreated(SurfaceHolder holder) { 
     _thread = new GameThread(getHolder(), this); 
     _thread.setRunning(true); 
     _thread.start(); 
    } 
... 
} 

私が見ることができるように、私は "GameThread"クラスを開始しています...ここではそれは以下です:

class GameThread extends Thread { 
    private SurfaceHolder _surfaceHolder; 
    private Panel _panel; 
    private boolean _run = false; 

    public GameThread(SurfaceHolder surfaceHolder, Panel panel) { 
     _surfaceHolder = surfaceHolder; 
     _panel = panel; 
    } 

    public void setRunning(boolean run) { 
     _run = run; 
    } 
      @Override 
    public void run() { 
     Canvas c; 
     while (_run) { 
      c = null; 

      try { 
        ... 

        if (health <= 0) { 
         _run = false; 

         //change views? 
         setContentView(R.layout.over); 

        } 

        c = _surfaceHolder.lockCanvas(null); 
        synchronized (_surfaceHolder) { 
         _panel.onDraw(c);      
        } 

        ... 

       } finally { 
        // do this in a finally so that if an exception is 
        // thrown 
        // during the above, we don't leave the Surface in an 
        // inconsistent state 
        if (c != null) { 
         _surfaceHolder.unlockCanvasAndPost(c); 
        } 
        try { 
         Thread.sleep(60); 
        } catch (Exception e) { 
        } 
       } 


      } 

     } 

うまくいけば、健康が= 0 <であれば、それはスレッドを停止し、私は「オーバー」と呼ばれる、私が作成した別のレイアウトに変更しようとしていることがわかります。

画面の更新(描画)が停止するだけですが、新しいパネルは表示されません。

私が試してみた:

GameName cs = ((GameName)getApplicationContext()) 
cs.setContentView(R.layout.over); 

しかし、私はClassCastExceptionが取得しています...

を助けてください!

答えて

0

ApplicationContextをメインActivityGameName)にキャストすることはできません。同じものではないためです。ある意味では、getApplicationContext()は、最初のぬいぐるみActivityに対応していませんが、アプリケーション自体に対応しています。

私には、単一のActivityのレイアウトと動作を変更しようとするのではなく、別個の活動を試みるべきです。それはあなたにとってよりシンプルで、あなたが直面している種類の問題を避けることができます。 実際には、setContentView()の各コードはスイッチに対応する必要があります。

  • WelcomeActivity(ここでは、おそらくGameName):ゲームのオプションを選択し、
  • PlayingActivityを開始します。ゲーム自体

    この方法で、あなたのようなものを持っているでしょう。これが実際のゲームプレイの場所です。

  • GameOverActivity:/スコア、またはあなたがゲームはあなたがやっているゲームの種類を知らなくても、

これを終了したら、表示したいと思い何かを表示しますが、このスケルトンは、アーケード/アクションとうまく動作するはずです、ロールプレイ冒険、さらには迷路/神のゲーム。

+0

私は別のアクティビティに変更することができますか?他の活動からですか? – sirmdawg

+0

はい、各アクティビティは一意のコンテンツビューに関連付けられます。または、2人は、肖像画と風景を区別したいと思うでしょうか?変化は技術的なものであれば問題ありません。避けるべきことは、いくつかの役割を持つアクティビティを持つことです。 – Shlublu

+1

ターゲットがAPIレベル5以上であれば、新しいアクティビティを開始する前に 'overridePendingTransition(0、0)'を呼び出してアクティビティアニメーションを取り除くことができます。 –

0

Handlersを探してみることをおすすめします。現在のスレッドを気にすることなくUIスレッドと安全に通信できます。

関連する問題