所以我正在开发一款适用于Android的新的基本2D游戏,并且正在设置我使用SurfaceView的游戏线程的常规实现。在打字的时候,我意识到,虽然这似乎有效,但我真的想知道是否有更好的方法来实现相同的结果。以下是我现在所做的基础知识(我为冗长而道歉,我尽量压缩):
GameActivity类
@Override
public void onCreate(final Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
this.setContentView(R.layout.game);
this.mGameView = (GameView)this.findViewById(R.id.gameview);
}
XML布局
<?xml version="1.0" encoding="utf-8" ?>
<merge xmlns:android="http://schemas.android.com/apk/res/android">
<com.package.name.GameView
android:id="@+id/gameview"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:focusable="true"
android:focusableInTouchMode="true" />
</merge>
GameView
@Override
public void surfaceCreated(final SurfaceHolder holder) { }
@Override
public void surfaceChanged(final SurfaceHolder holder, final int format,
final int width, final int height)
{
this.mGameThread = new GameThread(this.getContext(), holder,
width, height);
this.mGameThread.start(); // starts the game
}
@Override
public void surfaceDestroyed(final SurfaceHolder holder)
{
// flips volatile flag stopping execution
// then calls .join()
this.mGameThread.release();
}
GameThread类
@Override
public void run()
{
// load game state
while (this.mRunFlag) // volatile loop flag
{
// game loop
}
// save game state
}
正如您所看到的,基本上我依靠SurfaceHolder的回调来管理游戏。这种方法很有效,因为方向改变等等,但没有问,我可能永远不知道这是否可以以更好的方式实现,如果有的话,我会急于学习。所以这就是我要问的原因!有什么想法吗?
(我很好奇的原因是因为我几乎完全忽略了Activity的生命周期事件,觉得这可能是个问题......)
答案 0 :(得分:1)
听一下活动生命周期事件可能会更好,因为onSurfaceChanged可以在你不期望的时候被调用(方向改变,某种奇怪的大小改变,VRAM上的内存被回收,可能还有其他奇怪的那些)。
也就是说,如果表面发生变化,您可能希望重置游戏。因此我建议同时使用两者。创建一个方法来处理所有游戏停止事件和游戏开始事件。在onPause和onSurfaceDestroyed中调用该方法(保持一个标志以确保你不会双重卸载你的游戏)。在onResume和onSurfaceChanged中创建你的游戏,如果它不存在。这将提供一些更快的启动时间,因为它将允许您的线程初始化自己(但不启动实际游戏。基本上将其置于就绪状态),然后渲染器就绪。一旦渲染器准备就绪,游戏就可以在那一瞬间开始。