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入门到精通教程
查看: 676|回复: 0

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

[复制链接]

该用户从未签到

发表于 2011-10-26 16:39:34 | 显示全部楼层 |阅读模式
       这个系列的第二部分将展示如何添加一个三角形以及如何旋转它。
       第一件事情就是我们要初始化一个我们打算显示的三角形。我们必须在VortexRenderer类中创建一个函数名为initTriangle()。

java代码:
// new object variables we need

// 保存索引的缓冲区

private ShortBuffer _indexBuffer;



// 保存顶点的缓冲区

private FloatBuffer _vertexBuffer;



private short[] _indicesArray = {0, 1, 2};

private int _nrOfVertices = 3;



// 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[] coords = {

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

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

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

};



_vertexBuffer.put(coords);

_indexBuffer.put(_indicesArray);



_vertexBuffer.position(0);

_indexBuffer.position(0);

}
复制代码
       首先添加一下新的成员变量._vertexBuffer用来保存我们三角形的顶点._indexBuffer存储索引._nrOfVertices定义我们需要多少顶点.对于三角形来说我们需要三个顶点.

  在14到22行中分配两个buffer所需要的空间.之后在24到28行我们定义一些顶点,其后的注释会帮助你理解这些坐标.
  在30行我们向_vertexBuffer中填入坐标阵列.31行向_indexBuffer中填入索引数组.最后我们把两个缓冲区设置到原点处.
  为了避免每一帧三角形都要初始化,我们只需要在调用onDrawFrame()前的函数中初始化一次.一个可能方案就是在onSurfaceCreated()中执行.
  glEnableClientState()设置OpenGL利用顶点阵列来绘图.这个函数是重要的否则OpenGL不知道如何处理数据.
  为什么我们必须使用不同的缓冲区呢?下面是更改过的onDrawFrame()函数,里面我们会加入新的OpenGL调用.

java代码:
@Override

public void onDrawFrame(GL10 gl) {

// 定义我们要在"clipping wall"显示的颜色

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



// clear the color buffer to show the ClearColor we called above...

gl.glClear(GL10.GL_COLOR_BUFFER_BIT);



// 设置我们元件的颜色

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);

}
复制代码
       glClearColor() and glClear() 应该在第一部分中已经了解了。在第10行我们使用函数glColor4f(red, green, blue, alpha)来设置三角形的颜色为深红。

  在13行我们使用glVertexPointer()初始化顶点指针。第一个参数是大小,也就是我们顶点的维度。我们使用三个维度。第二个参数GL_FLOAT,代表我们在缓冲区中使用的数据类型。第三个参数是0,因为我们的坐标整齐地封装在数组中,不用偏置。最后第四个参数是我们利用的缓冲区。
  最后一个调用,glDrawElements(),将会绘制元件。第一个参数代表要绘制的基本元件。第二个参数是元件的数量,第三个是代表作为索引的数值类型,最后是用来绘制顶点的索引矩阵缓冲区。
  当你最后测试这个程序时,你会在屏幕中央看到一个静止的三角形,当你触碰屏幕,背景颜色仍然会变化。
  下面我们加入一些旋转。下面代码要加入我们的VortexRenderer类。

java代码:
private float _angle;



public void setAngle(float angle) {

_angle = angle;

}
复制代码
       glRotatef() 方法会在我们的onDrawFrame()函数中的glColor4f()上方被调用。

java代码:
@Override

public void onDrawFrame(GL10 gl) {

// 设置旋转

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



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

// code snipped

}
复制代码
       我们会环绕y轴进行旋转。如果你打算更改的话,只需简单的改变glRotatef()中的0f参量。这一系列的参数值代表了我们打算使三角形旋转要围绕的坐标轴。

        我们还需要调用onTouchEvent()来使程序工作。

java代码:
public boolean onTouchEvent(final MotionEvent event) {

queueEvent(new Runnable() {

public void run() {

_renderer.setColor(event.getX() / getWidth(), event.getY() / getHeight(), 1.0f);

_renderer.setAngle(event.getX() / 10);

}

});

return true;

}
复制代码
       除以10为了减小旋转的速度。
       现在编译并且运行这个程序,如果你触碰屏幕的左边,你会看到三角形缓慢地旋转。如果你向右边移动手指,旋转的速度会动态增加。


系列之Android 游戏教程(一)的帖子链接http://www.eoeandroid.com/thread-102096-1-1.html
系列之Android 游戏教程(三)的帖子链接http://www.eoeandroid.com/thread-102100-1-1.html
系列之Android 游戏教程(四)的帖子链接http://www.eoeandroid.com/thread-103115-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 18:46 , Processed in 0.374707 second(s), 46 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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