读 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; }}
- 读 Beginning Android Games 2nd Edition (二十二) 封装OpenGL之GLGame类
- 读 Beginning Android Games 2nd Edition (二十一) 封装OpenGL之GLGraphics类
- 读 Beginning Android Games 2nd Edition (十二) 把框架基础功能放入Game类中
- 读 Beginning Android Games 2nd Edition (二) 创建声音工具类
- 读 Beginning Android Games 2nd Edition (二十) 游戏GameScreen类
- 读 Beginning Android Games 2nd Edition (十六) 游戏帮助
- 读 Beginning Android Games 2nd Edition (十八) 贪食蛇类
- 读 Beginning Android Games 2nd Edition (一) 创建读取文件IO的工具类
- 读 Beginning Android Games 2nd Edition (三) 创建速度感应器事件监听类
- 读 Beginning Android Games 2nd Edition (四) 创建罗盘事件监听类
- 读 Beginning Android Games 2nd Edition (五) 创建对象池类
- 读 Beginning Android Games 2nd Edition (六) 创建键盘事件处理类
- 读 Beginning Android Games 2nd Edition (七) 创建Touch事件处理类
- 读 Beginning Android Games 2nd Edition (八) 创建输入事件处理类
- 读 Beginning Android Games 2nd Edition (九) 创建像素图类
- 读 Beginning Android Games 2nd Edition (十) 创建绘图类
- 读 Beginning Android Games 2nd Edition (十四) 玩家设置存储类
- 读 Beginning Android Games 2nd Edition (十七) 分数榜类
- NSTimer 动画
- day 9 (frequency 5)
- PowerDesigner Name和Comment 互相转化问题
- 数据库版本自动检测升级
- 《Windows程序设计-第二版》第四章最后一个04Clock大例子中的GDI句柄泄漏问题
- 读 Beginning Android Games 2nd Edition (二十二) 封装OpenGL之GLGame类
- glBlendFunc
- vc 版本 宏 (zz.IS2120@BG57IV3)
- 如何低成本推广App?
- Android 日志系统logcat内核代码分析
- public.sh
- Extjs4.o的store结构类图详解
- Cocos2d坐标系统
- MySQL存储过程详解 mysql 存储过程