2016-07-27 6 views
0

私はメインアクティビティを持っており、対応するXMLレイアウトにはゲームオブジェクト(私のタンクと10人の敵)、タンクと火の弾丸を制御するためのボタン、スコアを表示するTextViewを描画するカスタムビューがあります。私のカスタムビューは、半画面のゲームボードであるGameSurfaceView Javaクラスです。 ここに私のコードのいくつかは次のとおりです。GameSurfaceViewでコンテキストを取得するには?

public class GameSurfaceView extends SurfaceView implements Runnable { 
    private static Context gContext; 
    public GameSurfaceView(Context context, AttributeSet attributeSet) { 
     super(context, attributeSet); 
     holder = getHolder(); 
     holder.addCallback(new SurfaceHolder.Callback() { 
     resume(); 
     gContext = context; 
    } 
    public void resume() { 
     isRunning = true; 
     gameThread = new Thread(this); 
     gameThread.start(); 
    } 
    public void pause() { 
     isRunning = false; 
     boolean retry = true; 
     while (retry) { 
      try { 
       gameThread.join(); 
       retry = false; 
      } catch (InterruptedException e) { 
       // try again shutting down the thread 
      } 
     } 
    } 
    @Override 
    public void run() { 
     while (isRunning) { 
      // We need to make sure that the surface is ready 
      if (!holder.getSurface().isValid()) { 
       continue; 
      } 
      long started = System.currentTimeMillis(); 

      // update 
      step(); 

      // draw 
      Canvas canvas = holder.lockCanvas(); 
      if (canvas != null) { 
       render(canvas); 
       holder.unlockCanvasAndPost(canvas); 
      } 

      //detect all possible collisions 
      detectCollisions(); 

      float deltaTime = (System.currentTimeMillis() - started); 
      int sleepTime = (int) (FRAME_PERIOD - deltaTime); 
      if (sleepTime > 0) { 
       try { 
        gameThread.sleep(sleepTime); 
       } catch (InterruptedException e) { 
       } 
      } 
      while (sleepTime < 0) { 
       step(); 
       sleepTime += FRAME_PERIOD; 
      } 
     } 
    } 

    //Called from MainActivity 
    public void dispatchKey(int tDirection) { 
     Toast.makeText(gContext, "Hi", Toast.LENGTH_LONG).show(); 
     gameStarted = true; 
     if (tDirection == FIRE) 
      Fire(); 
     else if (tDirection != tank.Direction) 
      turnTankDirection = tDirection; 
    } 
    private void detectCollisions() { 
     //Collision Detection between tank and enemy 
     Toast.makeText(gContext, "Collision", Toast.LENGTH_LONG).show(); 
    } 
} 

私の質問: dispatchKeyでトースト()が実行されますが、正しくトーストdetectCollisions(中)力の近くを作るのはなぜ1 - ? 2 detectCollisions()メソッドでTextViewを更新するには? 3 detectCollisions()メソッドで衝突が検出されたときにDialogAlertを表示するにはどうすればよいですか? 私の問題は主にgContext変数に関連しています。おかげさまで

+0

エラーログ/スタックトレースを含めてくださいクラッシュ。 – ishmaelMakitla

+0

しかし、いくつかのハードウェアの制限のために、私は実際のデバイスでのみ私のプロジェクトをテストすることができます。 – Ahmad

答えて

0

質問1について:おそらく、これは2番目のスレッドに影響します。 ActivityからdispatchKey()が呼び出されている間に、detectface()が呼び出されます。 detectCollision()をアクティビティから呼び出そうとしましたか?

質問3:あなたのアクティビティにはリスナーが実装され、衝突が検出された場合に呼び出されます。あなたは、質問1の溶液および2として使用することができます同じことが


あなたが試してみてください:これは何を引き起こしている可能性がありますについての手掛かりを持っている可能性があるため、

MainActivity.this.runOnUiThread(new Runnable() { 
    public void run() { 
     //Make toast or manipulate TextView 
    } 
}); 
+0

はい、アクティビティからdetectCollision()を呼び出すと、トーストが表示されます。ですから、これらの問題をアクティビティではなくGameSurfaceViewクラスで実行したいので、どのように問題を解決できますか? – Ahmad

+0

runOnUiThreadによる編集を参照してください – user2605841

+0

すみません、私はこのコードをどこに置くべきですか?私のdetectCollision()メソッドでは、このエラーが発生します: "game.tank.MainActivity"は囲むクラスではありません。 – Ahmad

関連する問題