beginning android games 中文,《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等的实现会在后面给出

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值