实现的部分代码比较多 所以分成几个部分 首先从最主题的Game实现来看
public abstract class AndroidGame extends Activity implements Game { AndroidFastRenderView renderView; Graphics graphics; Audio audio; Input input; FileIO fileIO; Screen screen; WakeLock wakeLock; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); boolean isLandspace=getResources().getConfiguration().orientation==Configuration.ORIENTATION_LANDSCAPE; int frameBufferWidth=isLandspace?480:320; int frameBufferHeight=isLandspace?320:480; Bitmap frameBuffer=Bitmap.createBitmap(frameBufferWidth, frameBufferHeight, Config.RGB_565); float scaleX=(float)frameBufferWidth/getWindowManager().getDefaultDisplay().getWidth(); float scaleY=(float)frameBufferHeight/getWindowManager().getDefaultDisplay().getHeight(); renderView=new AndroidFastRenderView(this, frameBuffer); graphics=new AndroidGraphics(getAssets(),frameBuffer); fileIO=new AndroidFileIO(getAssets()); audio=new AndroidAudio(this); input=new AndroidInput(this, renderView, scaleX, scaleY); screen=getStartScreen(); setContentView(renderView); PowerManager powerManager=(PowerManager)getSystemService(Context.POWER_SERVICE); wakeLock=powerManager.newWakeLock(PowerManager.FULL_WAKE_LOCK, "GLGame"); } @Override protected void onResume() { super.onResume(); wakeLock.acquire(); screen.resume(); renderView.resume(); } @Override protected void onPause() { super.onPause(); wakeLock.release(); renderView.pause(); screen.pause(); if(isFinishing()){ screen.dispose(); } } @Override public Audio getAudio() { return audio; } @Override public Screen getCurrentScreen() { return screen; } @Override public FileIO getFileIO() { return fileIO; } @Override public Graphics getGraphics() { return graphics; } @Override public Input getInput() { return input; } @Override public void setScreen(Screen screen) { if(screen==null){ throw new IllegalArgumentException("Screen must not be null"); } this.screen.pause(); this.screen.dispose(); screen.resume(); screen.update(0); this.screen=screen; } }
所有的实现都采用了AndroidXXX这样的名字 而AndroidGame是Game的实现 从代码中 也可以看到AndroidInput,AndroidAudio等 在后面会一一给出具体实现
在AndroidGame中有两个之前没有见到的类 一个是AndroidFastRenderView 另一个是WakeLock,WakeLock是Android系统自带的类,用于控制屏幕唤醒的锁,并不属于游戏框架,而AndroidFastRenderView则是非常重要的一个类了,之前所说的游戏主循环,其实也是在这个类中得到的体现,下面是AndroidFastRenderView的实现
public class AndroidFastRenderView extends SurfaceView implements Runnable{ AndroidGame game; Bitmap framebuffer; Thread renderThread=null; SurfaceHolder holder; volatile boolean running=false; public AndroidFastRenderView(AndroidGame game, Bitmap framebuffer){ super(game); this.game=game; this.framebuffer=framebuffer; this.holder=getHolder(); } public void resume(){ running=true; renderThread=new Thread(this); renderThread.start(); } public void pause(){ running=false; while(true){ try{ renderThread.join(); break; } catch(InterruptedException e){ //retry } } } @Override public void run() { Rect dstRect=new Rect(); long startTime=System.nanoTime(); while(running){ if(!holder.getSurface().isValid()){ continue; } float deltaTime=(System.nanoTime()-startTime)/1000000000.0f; startTime=System.nanoTime(); game.getCurrentScreen().update(deltaTime); game.getCurrentScreen().present(deltaTime); Canvas canvas=holder.lockCanvas(); canvas.getClipBounds(dstRect); canvas.drawBitmap(framebuffer, null, dstRect, null); holder.unlockCanvasAndPost(canvas); } } }
Game中具体Input Audio等的实现会在后面给出