SurfaceView
使用Surfaceview的好处是可以自己控制屏幕刷新,还不像一般的View是通过界面消息来进行屏幕更新的。这在游戏中特别有用,因为游戏需要实时的更新画面,以反映游戏进程。
使用Surfaceview时,一般会开启一个线程,在线程中进行游戏逻辑和屏幕更新;
一般需要实现SurfaceHolder.Callback接口,在surface创建时创建和启动线程,在surface销毁时退出线程,退出线程可以采用对线程控制变量设置为false,并调用join函数来实现线程安全关闭。
另外一种方案是在构造函数中创建和启动线程,通过线程控制变量来实现线程核心循环的暂停或者运行,从而不用在surface创建和销毁时重复地创建和销毁线程。不知道哪种方案好一些呢?
public class GbcView extends SurfaceView implements SurfaceHolder.Callback,Runnable
{
private Thread mThread;
private boolean running;
@Override
public void run()
{
while(running)
{
gameStep();
gameDraw();
}
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height)
{
// TODO Auto-generated method stub
}
@Override
public void surfaceCreated(SurfaceHolder holder)
{
// TODO Auto-generated method stub
running = true;
mThread = new Thread(this);
mThread.start();
}
@Override
public void surfaceDestroyed(SurfaceHolder holder)
{
// TODO Auto-generated method stub
running = false;
try
{
mThread.join();
}
catch (InterruptedException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}