实现的部分代码比较多 所以分成几个部分 首先从最主题的Game实现来看

public abstract class AndroidGame extends Activity implements Game {AndroidFastRenderView renderView;Graphics graphics;Audio audio;Input input;FileIO fileIO;Screen screen;WakeLock wakeLock;@Overrideprotected 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");}@Overrideprotected void onResume() {super.onResume();wakeLock.acquire();screen.resume();renderView.resume();}@Overrideprotected void onPause() {super.onPause();wakeLock.release();renderView.pause();screen.pause();if(isFinishing()){screen.dispose();}}@Overridepublic Audio getAudio() {return audio;}@Overridepublic Screen getCurrentScreen() {return screen;}@Overridepublic FileIO getFileIO() {return fileIO;}@Overridepublic Graphics getGraphics() {return graphics;}@Overridepublic Input getInput() {return input;}@Overridepublic 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}}}@Overridepublic 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等的实现会在后面给出

更多相关文章

  1. 没有一行代码,「2020 新冠肺炎记忆」这个项目却登上了 GitHub 中
  2. GitHub 标星 2.5K+!教你通过玩游戏的方式学习 VIM!
  3. android中使用代码启动其他程序
  4. Android(安卓)读取excel (支持 xls和xlsx)
  5. android 数字进度条--NumberProgressBar
  6. Android(安卓)常用颜色 html 代码
  7. Android(安卓)Orm框架(GreenDao)
  8. Android(安卓)Test(未完工)
  9. Android(安卓)多种跑马灯的方法

随机推荐

  1. Android上使用Chrome DevTools 远程调试W
  2. Android SystemProperty
  3. Android adb shell 常用命令
  4. Android(安卓)Camera——拍照
  5. Android根据经纬度获取地址
  6. 向Android模拟器发短信打电话
  7. zxing-client-android 导入Android Studi
  8. android Content Provider的使用
  9. Android零碎知识点 1
  10. android基本布局