實現的部分代碼比較多 所以分成幾個部分 首先從最主題的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等的實現會在後面給出