Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 662|回复: 0

Android 游戏教程(四) - Android学习

[复制链接]

该用户从未签到

发表于 2011-10-26 19:21:54 | 显示全部楼层 |阅读模式
       第四部分会介绍如何向三角形添加多种颜色。

       在上一个部分我们创建了另一个静态的三角形来证明只有三角形旋转而不是整个视图。我们现在移除这个静态三角形包括与它相关的代码。

java代码:
@Override

public void onDrawFrame(GL10 gl) {

// 定义我们打算在背景上显示的图形颜色

gl.glClearColor(_red, _green, _blue, 1.0f);



// 重设矩阵,使得旋转的角度是一定的

gl.glLoadIdentity();



// 清除绘图缓冲区

gl.glClear(GL10.GL_COLOR_BUFFER_BIT);



// 设置旋转的角度不定

gl.glRotatef(_angle, 0f, 1f, 0f);



gl.glColor4f(0.5f, 0f, 0f, 0.5f);

gl.glVertexPointer(3, GL10.GL_FLOAT, 0, _vertexBuffer);

gl.glDrawElements(GL10.GL_TRIANGLES, _nrOfVertices, GL10.GL_UNSIGNED_SHORT, _indexBuffer);

}
复制代码
       现在我们创建了一个新的缓冲区来保存颜色信息。_colorBuffer缓冲区是一个对象变量,但是我们需要定义颜色以及当我们初始化其他缓冲区时填充该缓冲区,这些在我们的initTriangle()函数中完成。

java代码:
// code snipped



// 来存储颜色的缓冲区

private FloatBuffer _colorBuffer;



// code snipped

private void initTriangle() {

// float has 4 bytes

ByteBuffer vbb = ByteBuffer.allocateDirect(_nrOfVertices * 3 * 4);

vbb.order(ByteOrder.nativeOrder());

_vertexBuffer = vbb.asFloatBuffer();



// short has 2 bytes

ByteBuffer ibb = ByteBuffer.allocateDirect(_nrOfVertices * 2);

ibb.order(ByteOrder.nativeOrder());

_indexBuffer = ibb.aSSHortBuffer();



// float has 4 bytes, 4 colors (RGBA) * number of vertices * 4 bytes

ByteBuffer cbb = ByteBuffer.allocateDirect(4 * _nrOfVertices * 4);

cbb.order(ByteOrder.nativeOrder());

_colorBuffer = cbb.asFloatBuffer();



float[] coords = {

-0.5f, -0.5f, 0f, // (x1, y1, z1)

0.5f, -0.5f, 0f, // (x2, y2, z2)

0.5f, 0.5f, 0f // (x3, y3, z3)

};



float[] colors = {

1f, 0f, 0f, 1f, // point 1

0f, 1f, 0f, 1f, // point 2

0f, 0f, 1f, 1f, // point 3

};



_vertexBuffer.put(coords);

_indexBuffer.put(_indicesArray);

_colorBuffer.put(colors);



_vertexBuffer.position(0);

_indexBuffer.position(0);

_colorBuffer.position(0);

}
复制代码
       成员变量_colorBuffer是FloatBuffer型(第四行)的。在initTriangle()函数中我们分配足够的存储空间为新的颜色缓冲区(19到21行)。之后我们创建一个float型的数组有四个值分别对应顶点。结构是RGBA(红色,绿色,蓝色,透明度)因此第一个点是红色,第二个是绿色,第三个是蓝色。最后两步我们将颜色数组放入缓冲区然后设置缓冲区的位置为0.

       以上准备结束后,我们可以开始告诉OpenGL ES来使用颜色数组了。这通过函数glEnableClientState()实现,跟_vertexBuffer类似,调用glColorPointer()函数。

java代码:
@Override

public void onSurfaceCreated(GL10 gl, EGLConfig config) {

// preparation

gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);

gl.glEnableClientState(GL10.GL_COLOR_ARRAY);

initTriangle();

}



// code snipped



@Override

public void onDrawFrame(GL10 gl) {

// code snipped



// gl.glColor4f(0.5f, 0f, 0f, 0.5f);

gl.glVertexPointer(3, GL10.GL_FLOAT, 0, _vertexBuffer);

gl.glColorPointer(4, GL10.GL_FLOAT, 0, _colorBuffer);

gl.glDrawElements(GL10.GL_TRIANGLES, _nrOfVertices, GL10.GL_UNSIGNED_SHORT, _indexBuffer);

}
复制代码
系列之Android 游戏教程(一)的帖子链接http://www.eoeandroid.com/thread-102096-1-1.html
系列之Android 游戏教程(二)的帖子链接http://www.eoeandroid.com/thread-102097-1-1.html
系列之Android 游戏教程(三)的帖子链接http://www.eoeandroid.com/thread-102100-1-1.html
系列之Android 游戏教程(五)的帖子链接http://www.eoeandroid.com/thread-103118-1-1.html
系列之Android 游戏教程(六)的帖子链接http://www.eoeandroid.com/thread-103121-1-1.html
系列之Android 游戏教程(七)的帖子链接http://www.eoeandroid.com/thread-103125-1-1.html
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

GMT+8, 2025-1-11 21:02 , Processed in 0.308410 second(s), 36 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表