《Beginning Android(安卓)Games》给出基本框架的实现(1)
16lz
2021-01-25
实现的部分代码比较多 所以分成几个部分 首先从最主题的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等的实现会在后面给出
更多相关文章
- 没有一行代码,「2020 新冠肺炎记忆」这个项目却登上了 GitHub 中
- GitHub 标星 2.5K+!教你通过玩游戏的方式学习 VIM!
- android中使用代码启动其他程序
- Android(安卓)读取excel (支持 xls和xlsx)
- android 数字进度条--NumberProgressBar
- Android(安卓)常用颜色 html 代码
- Android(安卓)Orm框架(GreenDao)
- Android(安卓)Test(未完工)
- Android(安卓)多种跑马灯的方法