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

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

[复制链接]

该用户从未签到

发表于 2011-10-26 16:40:35 | 显示全部楼层 |阅读模式
       第三部分会展示如何停止三角形的旋转以及真正做到三角形的旋转。

    我们打算能更丰富地控制旋转。为了实现它,在每一次调用onDrawFrame()时我们重设矩阵。这会重置我们的三角形的角度以使得它总是保持以初始化时设置的角度进行旋转。

java代码:
@Override

public void onDrawFrame(GL10 gl) {

// define the color we want to be displayed as the "clipping wall"

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



// 重置矩阵,使旋转速度合适

gl.glLoadIdentity();



// clear the color buffer and the depth buffer to show the ClearColor

// we called above...

gl.glClear(GL10.GL_COLOR_BUFFER_BIT);



// code snipped

}
复制代码
  在VortexView类里移去除以10的部分以使得它旋转角度大一些.
  _renderer.setAngle(event.getX());如果你尝试了,你会看到三角形根据我们触碰动作的方向进行旋转,如果你不移动手指,它就不会旋转.
  另一个事情:我们是旋转了三角形还是旋转了整个视图?
  为了检验,最简单的方式是创建第二个不会旋转的三角形.
  最快也是最直接的方式就是复制并且粘贴initTriangle()方法代码到initStaticTriangle()方法,复制并且粘贴两个缓冲区,最后复制粘贴onDrawFrame()函数中的最后4行代码.
  不要忘记改变第二个三角形的颜色而且减小它的坐标以便我们能同时看到两个.我把0.5f坐标改为0.4f.下面是全部类:

java代码:
import java.nio.ByteBuffer;

import java.nio.ByteOrder;

import java.nio.FloatBuffer;

import java.nio.ShortBuffer;



import javax.microedition.khronos.egl.EGLConfig;

import javax.microedition.khronos.opengles.GL10;



import android.opengl.GLSurfaceView;



public class VortexRenderer implements GLSurfaceView.Renderer {

private static final String LOG_TAG = VortexRenderer.class.getSimpleName();



private float _red = 0f;

private float _green = 0f;

private float _blue = 0f;



// a raw buffer to hold indices allowing a reuse of points.

private ShortBuffer _indexBuffer;

private ShortBuffer _indexBufferStatic;



// a raw buffer to hold the vertices

private FloatBuffer _vertexBuffer;

private FloatBuffer _vertexBufferStatic;



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

private int _nrOfVertices = 3;



private float _angle;



@Override

public void onSurfaceCreated(GL10 gl, EGLConfig config) {

// preparation

gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);

initTriangle();

initStaticTriangle();

}



@Override

public void onSurfaceChanged(GL10 gl, int w, int h) {

gl.glViewport(0, 0, w, h);

}



public void setAngle(float angle) {

_angle = angle;

}



@Override

public void onDrawFrame(GL10 gl) {

// define the color we want to be displayed as the "clipping wall"

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



// reset the matrix - good to fix the rotation to a static angle

gl.glLoadIdentity();



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

gl.glClear(GL10.GL_COLOR_BUFFER_BIT);



// 绘制静态三角形

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

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

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



// 设置非静态三角形的旋转

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



}



private void initTriangle() {

// float has 4 bytes

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

vbb.order(ByteOrder.nativeOrder());

_vertexBuffer = vbb.asFloatBuffer();



// short has 4 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);

}



private void initStaticTriangle() {

// float has 4 bytes

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

vbb.order(ByteOrder.nativeOrder());

_vertexBufferStatic = vbb.asFloatBuffer();



// short has 4 bytes

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

ibb.order(ByteOrder.nativeOrder());

_indexBufferStatic = ibb.asShortBuffer();



float[] coords = {

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

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

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

};



_vertexBufferStatic.put(coords);



_indexBufferStatic.put(_indicesArray);



_vertexBufferStatic.position(0);

_indexBufferStatic.position(0);

}



public void setColor(float r, float g, float b) {

_red = r;

_green = g;

_blue = b;

}

}
复制代码
系列之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-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:51 , Processed in 0.293329 second(s), 36 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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