2016-07-27 3 views
0

У меня есть основная деятельность и в соответствующем XML-макете. У меня есть пользовательский вид, который рисует игровые объекты (мой танк и 10 врагов), несколько кнопок для управления моим танком и пулями огня и TextView, чтобы показать мой результат. Мое пользовательское представление - это класс JavaSurfaceView, который является игровой панелью с половинным экраном. Вот некоторые из моего кода:Как получить контекст в 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(); 
    } 
} 

Мои вопросы: 1- Почему Тост в dispatchKey() работает правильно, но Toast в detectCollisions() делает усилие близко? 2- Как обновить TextView в методе detectCollisions()? 3- Как показать DialogAlert, когда обнаружено столкновение в методе detectCollisions()? Моя проблема связана главным образом с переменной gContext. Спасибо.

+0

Пожалуйста, включите журнал ошибок/StackTrace, потому что это может иметь подсказки относительно того, что может быть причиной авария. – ishmaelMakitla

+0

Но из-за некоторых ограничений аппаратного обеспечения я могу проверить свой проект только на реальном устройстве. – Ahmad

ответ

0

Что касается вопроса 1: Возможно, это влияет на вторую нить. В то время как dispatchKey() вызывается из Activity, detectCollision() вызывается из файла sureface-thread. Вы пытались вызвать функцию detectCollision() из активности?

Что касается вопроса 3: пусть ваша деятельность реализует прослушиватель, который будет вызываться, если обнаружено столкновение. То же самое можно было использовать в качестве решения вопроса 1 и 2.


Вы должны попробовать:

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

Да, если я вызову функцию detectCollision() из активности, будет показан Toast. Итак, как я могу решить проблемы, потому что я хочу делать эти работы в классе GameSurfaceView, а не в действии. – Ahmad

+0

См. Редактирование с runOnUiThread – user2605841

+0

Извините, где я должен поместить этот код? В моем методе detectCollision() возникает такая ошибка: «game.tank.MainActivity» не является закрывающим классом. – Ahmad