读 Beginning Android Games 2nd Edition (二十二) 封装OpenGL之GLGame类

来源:互联网 发布:java软件工程简历模板 编辑:程序博客网 时间:2024/05/16 18:05

 GLGame类使用了大部分此书前面写过的AndroidGame类的代码,并增加了渲染和UI线程间的同步

package com.badlogic.androidgames.framework.impl;import javax.microedition.khronos.egl.EGLConfig;import javax.microedition.khronos.opengles.GL10;import android.app.Activity;import android.content.Context;import android.opengl.GLSurfaceView;import android.opengl.GLSurfaceView.Renderer;import android.os.Bundle;import android.os.PowerManager;import android.os.PowerManager.WakeLock;import android.view.Window;import android.view.WindowManager;import com.badlogic.androidgames.framework.Audio;import com.badlogic.androidgames.framework.FileIO;import com.badlogic.androidgames.framework.Game;import com.badlogic.androidgames.framework.Graphics;import com.badlogic.androidgames.framework.Input;import com.badlogic.androidgames.framework.Screen;public abstract class GLGame extends Activity implements Game, Renderer {//定义一个枚举,跟踪GLGame实例状态    enum GLGameState {        Initialized,        Running,        Paused,        Finished,        Idle    }        GLSurfaceView glView;        GLGraphics glGraphics;    Audio audio;    Input input;    FileIO fileIO;    Screen screen;    //初始化游戏状态    GLGameState state = GLGameState.Initialized;    Object stateChanged = new Object();    long startTime = System.nanoTime();    //WakeLock可避免手机进入暗屏状态    WakeLock wakeLock;    @Override     public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        //设置无标题界面        requestWindowFeature(Window.FEATURE_NO_TITLE);        //设置全屏        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,                             WindowManager.LayoutParams.FLAG_FULLSCREEN);        glView = new GLSurfaceView(this);        glView.setRenderer(this);        setContentView(glView);        //实例化文件,音频,输入对象        glGraphics = new GLGraphics(glView);        fileIO = new AndroidFileIO(this);        audio = new AndroidAudio(this);        input = new AndroidInput(this, glView, 1, 1);        //电源管理器        PowerManager powerManager = (PowerManager) getSystemService(Context.POWER_SERVICE);        wakeLock = powerManager.newWakeLock(PowerManager.FULL_WAKE_LOCK, "GLGame");            }        @Override    public void onResume() {        super.onResume();        //开始让GLSurfaceView渲染线程工作        glView.onResume();        wakeLock.acquire();    }        public void onSurfaceCreated(GL10 gl, EGLConfig config) {                glGraphics.setGL(gl);                synchronized(stateChanged) {        //如果游戏刚开始,设置游戏状态并跳到开始画面            if(state == GLGameState.Initialized)                screen = getStartScreen();            //设置游戏状态为运行阶段            state = GLGameState.Running;            screen.resume();            //记录游戏的开始时间            startTime = System.nanoTime();        }            }    public void onSurfaceChanged(GL10 gl, int width, int height) {            }    //这个方法中检查游戏状态和实现相应的反应    public void onDrawFrame(GL10 gl) {                        GLGameState state = null;                synchronized(stateChanged) {            state = this.state;        }                //如果游戏在进行中,那么告诉当前屏幕更新delta时间,并把它显示出来        if(state == GLGameState.Running) {            float deltaTime = (System.nanoTime()-startTime) / 1000000000.0f;            startTime = System.nanoTime();                        screen.update(deltaTime);            screen.present(deltaTime);        }                if(state == GLGameState.Paused) {            screen.pause();                        synchronized(stateChanged) {                this.state = GLGameState.Idle;                stateChanged.notifyAll();            }        }                if(state == GLGameState.Finished) {            screen.pause();            screen.dispose();            synchronized(stateChanged) {                this.state = GLGameState.Idle;                stateChanged.notifyAll();            }                    }    }    @Override     public void onPause() {                synchronized(stateChanged) {            if(isFinishing())                            state = GLGameState.Finished;            else                state = GLGameState.Paused;            while(true) {                try {                    stateChanged.wait();                    break;                } catch(InterruptedException e) {                 }            }        }        wakeLock.release();        glView.onPause();          super.onPause();    }      public GLGraphics getGLGraphics() {        return glGraphics;    }      public Input getInput() {        return input;    }    public FileIO getFileIO() {        return fileIO;    }    public Graphics getGraphics() {        throw new IllegalStateException("We are using OpenGL!");    }    public Audio getAudio() {        return audio;    }    //设置当前屏幕    public void setScreen(Screen newScreen) {        if (newScreen == null)            throw new IllegalArgumentException("Screen must not be null");        this.screen.pause();        this.screen.dispose();        newScreen.resume();        newScreen.update(0);        this.screen = newScreen;    }    public Screen getCurrentScreen() {        return screen;    }}


原创粉丝点击