如何在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变量。 谢谢。
关于问题1:也许这会影响第二个线程。当从Activity调用dispatchKey()时,detectCollision()从sureface-thread调用。你有没有试图从activity中调用detectCollision()?
关于问题3:让你的活动实现一个监听器,如果检测到碰撞,它将被调用。你可以为问题1溶液和2使用的同样的事情
你应该尝试:
MainActivity.this.runOnUiThread(new Runnable() {
public void run() {
//Make toast or manipulate TextView
}
});
是的,如果我从活动中调用detectCollision(),则会显示Toast。那么我该如何解决这些问题呢,因为我想在GameSurfaceView类中做这些工作,而不是在活动中。 – Ahmad
请参阅使用runOnUiThread进行编辑 – user2605841
对不起,我应该在哪里放这些代码?在我的detectCollision()方法中出现这个错误:“game.tank.MainActivity”不是一个封闭的类。 – Ahmad
请包含错误日志/堆栈跟踪,因为这可能有线索,什么可能导致的崩溃。 – ishmaelMakitla
但由于硬件限制,我只能在真实设备上测试我的项目。 – Ahmad