《Beginning Android Games》給出基本框架的實現(1)

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章