安卓第三课:关于第四章中的OPENGL【大方向上的介绍】
来源:互联网 发布:肩膀疼 知乎 编辑:程序博客网 时间:2024/06/05 00:36
个人觉得第四章偏难了点,因为理解上需要对数学矩阵以及三维映射方面有较为全面的理解。所以这里我们只是对第四章的大方向进行简介,具体的细节自己把握。
一、首先创建一个活动(Activity)SFGame,那么如何从主菜单界面过渡到该活动呢?
添加start按钮的click事件监听:
ImageButton start = (ImageButton)findViewById(R.id.btnStart); start.getBackground().setAlpha(SFEngine.MENU_BUTTON_ALPHA); start.setHapticFeedbackEnabled(SFEngine.HAPTIC_BUTTON_FEEDBACK); start.setOnClickListener(new OnClickListener(){ @Override public void onClick(View v) { /** Start Game!!!! */ Intent game = new Intent(getApplicationContext(),SFGame.class); SFMainMenu.this.startActivity(game); } });
这样就通过点击start按钮创建一个从SFMainMenu到SFGame的意图(Intent)。
二、接下来就是说明SFGame活动所调用的游戏视图
重载SFGame的OnCreate,利用:
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); gameView = new SFGameView(this); setContentView(gameView); }
表明该活动调用的视图界面是SFGameView的一个实例化对象gameView。
而SFGameView继承自GLSurfaceView,主要依靠渲染器(Renderer)来实现:
public SFGameView(Context context) { super(context); renderer = new SFGameRenderer(); this.setRenderer(renderer); }
三、后面的重点就是关于这个渲染器的东西了。
三个需要重载的函数:
onDrawFrame、onSurfaceChanged和onSurfaceCreated
1、首先我们来看onSurfaceCreated
gl.glEnable(GL10.GL_TEXTURE_2D);//必须的,表示可以将纹理投影 gl.glClearDepthf(1.0f); gl.glEnable(GL10.GL_DEPTH_TEST); gl.glDepthFunc(GL10.GL_LEQUAL);//以上三行主要就是设置深度缓存,深度就相当于3D的Z轴 gl.glEnable(GL10.GL_BLEND); gl.glBlendFunc(GL10.GL_ONE, GL10.GL_ONE); //设置色彩混合(one,one)表示两种颜色简单相加 background.loadTexture(gl,SFEngine.BACKGROUND_LAYER_ONE, SFEngine.context); background2.loadTexture(gl,SFEngine.BACKGROUND_LAYER_TWO, SFEngine.context);//加载两个背景纹理
2、然后我们来看onSurfaceChanged
gl.glViewport(0, 0, width,height);//开个窗看纹理 gl.glMatrixMode(GL10.GL_PROJECTION);//投影矩阵 gl.glLoadIdentity();//初始化(重置矩阵) gl.glOrthof(0f, 1f, 0f, 1f, -1f, 1f);//看到纹理的大小
3、最后我们来看onDrawFrame
try { Thread.sleep(SFEngine.GAME_THREAD_FPS_SLEEP); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); }//以上线程休眠 gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);//清空缓存 scrollBackground1(gl); scrollBackground2(gl);//滚动背景1和2 //All other game drawing will be called here gl.glEnable(GL10.GL_BLEND); gl.glBlendFunc(GL10.GL_ONE, GL10.GL_ONE); //色彩简单相加。
看到这里又出现了两个新函数scrollBackground1和scrollBackground2。这两个函数主要就是用来绘制背景,并设置背景滚动。
这两个函数和onSurfaceCreated中的background.loadTexture函数一样都利用了SFBackground类中的矩阵和纹理投影进行了一系列的操作。具体的过程大家慢慢查资料吧,涉及到一些数学矩阵、投影方面的内容,比较麻烦,不深入了。主要就是根据顶点矩阵和纹理矩阵进行缩放、移动等匹配,然后绘制出合适的背景图片过程。
0 0
- 安卓第三课:关于第四章中的OPENGL【大方向上的介绍】
- 安卓第四课:关于第五章中的飞机角色
- 架构在大方向上的考虑
- 架构在大方向上的考虑
- 关于观察者模式的介绍以及安卓中的使用
- 在公司编程的大方向上的感悟
- 安卓手册 第四章(MVP介绍和实战)
- 关于导入安卓Studio第三方lib的问题
- 第三方空间的十分艰苦是大方开朗
- 国产安卓第三方OS介绍
- 安卓第三方桌面介绍
- 安卓 第四章 适配器
- 安卓 第三章 常用的控件
- RobotFrameWork+APPIUM实现对安卓APK的自动化测试----第四篇【AppiumLibrary实用函数介绍】
- 【安卓】关于相对布局RelativeLayout的各种属性介绍
- 关于安卓中的Handler
- Opengl函数介绍---(安卓学习笔记)
- OpenGL学习:第四课
- Qt5的插件机制(6)--开发Qt插件时几个重要的宏
- 个人官网第二次升级顺利完成
- Computer Science Conference Rankings
- [Windows]_[初级]_[Release程序的崩溃报告minidump解决方案]
- 第一章、C#委托和事件(Delegate、Event、EventHandler、EventArgs)
- 安卓第三课:关于第四章中的OPENGL【大方向上的介绍】
- hdu5024 网络赛水题
- JavaScript 中的多线程通信
- 几个数据库会议
- org.apache.commons.beanutils.BeanUtils 自定义转换 java 8 localdatetime 类
- Something about HTTP Protocol
- IOS开发中获取自带的应用
- 几年前之所预言,其人不死言之依然
- angular输出html