如何在GameSurfaceView中获取上下文?

问题描述:

我有一个主要活动,并在相应的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(); 
    } 
} 

我的问题: 1-为什么土司dispatchKey()运行正常,但土司detectCollisions()使强制关闭? 2-如何更新detectCollisions()方法中的TextView? 3-如何在detectCollisions()方法中检测到碰撞时显示DialogAlert? 我的问题主要涉及到gContext变量。 谢谢。

+0

请包含错误日志/堆栈跟踪,因为这可能有线索,什么可能导致的崩溃。 – ishmaelMakitla

+0

但由于硬件限制,我只能在真实设备上测试我的项目。 – Ahmad

关于问题1:也许这会影响第二个线程。当从Activity调用dispatchKey()时,detectCollision()从sureface-thread调用。你有没有试图从activity中调用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