android 游戏开发视频教程SUNDYWord下载.docx

上传人:b****4 文档编号:17227818 上传时间:2022-11-29 格式:DOCX 页数:41 大小:280.01KB
下载 相关 举报
android 游戏开发视频教程SUNDYWord下载.docx_第1页
第1页 / 共41页
android 游戏开发视频教程SUNDYWord下载.docx_第2页
第2页 / 共41页
android 游戏开发视频教程SUNDYWord下载.docx_第3页
第3页 / 共41页
android 游戏开发视频教程SUNDYWord下载.docx_第4页
第4页 / 共41页
android 游戏开发视频教程SUNDYWord下载.docx_第5页
第5页 / 共41页
点击查看更多>>
下载资源
资源描述

android 游戏开发视频教程SUNDYWord下载.docx

《android 游戏开发视频教程SUNDYWord下载.docx》由会员分享,可在线阅读,更多相关《android 游戏开发视频教程SUNDYWord下载.docx(41页珍藏版)》请在冰豆网上搜索。

android 游戏开发视频教程SUNDYWord下载.docx

因此在OpenGL中,我们使用3个顶点来创建一个三角形。

多边形Polygon

多边形是至少有3个连接着的点组成的一个对象。

三角形也是一个多边形。

图元Primitives

一个Primitive是一个三维的对象,使用三角形或者多边形创建。

形象的说,一个有50000个顶点的非常精细的模型是一个Primitive,同样一个只有500个顶点的低模也叫做一个Primitive。

现在我们可以开始变成了。

创建一个工程交Vortex,activity也是这个名字。

我们的工程应该大概是这个样子的:

packagecom.droidnova.android.games.vortex;

importandroid.app.Activity;

importandroid.os.Bundle;

publicclassVortexextendsActivity{

privatestaticfinalStringLOG_TAG=Vortex.class.getSimpleName();

privateVortexView_vortexView;

@Override

protectedvoidonCreate(BundlesavedInstanceState){

super.onCreate(savedInstanceState);

_vortexView=newVortexView(this);

setContentView(_vortexView);

}

}

复制代码

如上图所示,我们已经添加了View。

让我们看一下VortexView类。

importandroid.content.Context;

importandroid.opengl.GLSurfaceView;

publicclassVortexViewextendsGLSurfaceView{

privatestaticfinalStringLOG_TAG=VortexView.class.getSimpleName();

privateVortexRenderer_renderer;

publicVortexView(Contextcontext){

super(context);

_renderer=newVortexRenderer();

setRenderer(_renderer);

如上所示,我们继承了GLSurfaceView是因为它会帮助我们画3D图像。

接下来看VortexRenderer类。

一个Renderer包含画一帧所必需的所有东西。

引用自这儿references。

Renderer负责OpenGLcall来render一个帧。

来看一下这个类:

importjavax.microedition.khronos.egl.EGLConfig;

importjavax.microedition.khronos.opengles.GL10;

publicclassVortexRendererimplementsGLSurfaceView.Renderer{

privatestaticfinalStringLOG_TAG=VortexRenderer.class.getSimpleName();

privatefloat_red=0.9f;

privatefloat_green=0.2f;

privatefloat_blue=0.2f;

@Override

publicvoidonSurfaceCreated(GL10gl,EGLConfigconfig){

//Donothingspecial.

publicvoidonSurfaceChanged(GL10gl,intw,inth){

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

publicvoidonDrawFrame(GL10gl){

//definethecolorwewanttobedisplayedasthe"

clippingwall"

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

//clearthecolorbuffertoshowtheClearColorwecalledabove...

gl.glClear(GL10.GL_COLOR_BUFFER_BIT);

好,我们做了什么?

首先我们实现了GLSurfaceView.Renderer这个接口,主要是实现3个方法:

onSurfaceCreated(),onSurfaceChanged()和onDrawFrame()。

这些方法很容易理解,第一个在surface创建以后调用,第二个是在surface发生改变以后调用,例如从竖屏切换到横屏的时候,最后一个方法是当任何时候调用一个画图方法的时候。

从11行到13行,我们用浮点数来定义RGB颜色系统中的每一个颜色。

在28行,我们通过glClearColor()方法为底色定义了颜色。

底色是在我们能看到的所有东西的后面,所以所有在底色后面的东西都是不可见的。

可以想象这种东西为浓雾,挡住了所有的东西。

然后我们将要为之设置距离来show一下它怎么用的。

那时候你就一定会明白它是怎么存在的了。

为了让颜色变化可见,我们必须调用glClear()以及颜色缓冲的Mask来清空buffer,然后为我们的底色使用新的底色。

为了能看到它在起作用,我们这里为MotionEvent创建一个response,使用它来改变颜色。

首先在VortexRenderer中来创建一个设置颜色的函数。

publicvoidsetColor(floatr,floatg,floatb){

_red=r;

_green=g;

_blue=b;

下面是VortexView类中创建的方法来处理MotionEvent。

publicbooleanonTouchEvent(finalMotionEventevent){

queueEvent(newRunnable(){

publicvoidrun(){

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

});

returntrue;

我们创建了一个匿名的Runnable对象,这里的run()方法调用renderer中的setColor方法。

这有会根据MotionEvent坐标做一些小的计算。

现在我们已经有了一个小小的程序来使用OpenGl来改变我们的背景色了。

在德语中我们叫这种小case为“MitKanonenaufSpatzenschieß

en”,翻译过来应该是“你在车轮上打死了一只苍蝇”。

这说的恰到好处,这只是一个最最最小的例子,要学习OpenGL,你现在要准备更多更多的东西。

这部分最后提一下OpenGL的文档documentationforOpenGL。

这个东西虽然可用想不高,但是它最少是一个文档。

Eclipse工程源代码在这里下载(原地址):

VortexPartI

这里是几个截图:

------------------------------------------------------------------

这个系列的第二部分是关于如何添加一个三角形并可以旋转它。

第一件事情是初始化需要显示的三角形。

我们来在VortexRenderer类中添加一个方法initTriangle()。

//newobjectvariablesweneed

//arawbuffertoholdindices

privateShortBuffer_indexBuffer;

//arawbuffertoholdthevertices

privateFloatBuffer_vertexBuffer;

privateshort[]_indicesArray={0,1,2};

privateint_nrOfVertices=3;

//codesnipped

privatevoidinitTriangle(){

//floathas4bytes

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

vbb.order(ByteOrder.nativeOrder());

_vertexBuffer=vbb.asFloatBuffer();

//shorthas2bytes

ByteBufferibb=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变量定义需要多少个顶点.对于一个三角形来说,一共需要三个顶点.

这个方法首先为这里两个buffer分配必须的内存(14-22行).接下来我们定义一些坐标(24-28行)后面的注释对用途给予了说明.

在30行,我们将coords数组填充给_vertexBuffer.同样在31行将indices数组填充给_indexBuffer。

最后将两个buffer都设置position为0.

为了防止每次都对三角形进行初始化,我们仅仅在onDrawFrame()之前的行数调用它一次。

一个比较好的选择就是在onSurfaceCreated()函数中.

//preparation

gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);

initTriangle();

glEnableClientState()设置OpenGL使用vertex数组来画。

这是很重要的,因为如果不这么设置OpenGL不知道如何处理我们的数据。

接下来我们就要初始化我们的三角形。

为什么我们不需使用不同的buffer?

在新的onDrawFrame()方法中我们必须添加一些新的OpenGL调用。

//setthecolorofourelement

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

//definetheverticeswewanttodraw

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

//finallydrawthevertices

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

好,一步一步地看。

glClearColor()和glClear()在教程I部分已经提到过。

在第10行使用glColor4f(red,green,blue,alpha)设置三角形为暗红色.

在第13行,我们使用glVertexPointer()初始化VertexPointer.第一个参数是大小,也是顶点的维数。

我们使用的是x,y,z三维坐标。

第二个参数,GL_FLOAT定义buffer中使用的数据类型。

第三个变量是0,是因为我们的坐标是在数组中紧凑的排列的,没有使用offset。

最后哦胡第四个参数顶点缓冲。

最后,glDrawElements()将所有这些元素画出来。

第一个参数定义了什么样的图元将被画出来。

第二个参数定义有多少个元素,第三个是indices使用的数据类型。

最后一个是绘制顶点使用的索引缓冲。

当最后测试这个应用的使用,你会看到一个在屏幕中间静止的三角形。

当你点击屏幕的时候,屏幕的背景颜色还是会改变。

现在往里面添加对三角形的旋转。

下面的代码是写在VortexRenderer类中的.

privatefloat_angle;

publicvoidsetAngle(floatangle){

_angle=angle;

glRotatef()方法在glColor4f()之前被onDrawFrame()调用.

//setrotation

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

这时候我们可以绕y轴旋转。

如果需要改变只需要改变glRotate()方法中的0f。

这个参数中的值表示一个向量,标志三角形绕着旋转的坐标轴。

要让它可用,我们必须在VortexView中的onTouchEvent()中添加一个调用。

queueEvent(newRunnable(){

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

});

returntrue;

上面代码中除以10是为了减小角度变换的速度。

现在编译运行这个程序。

如果你在屏幕的最左边点击,你会看到三角形轻微旋转。

如果你将手指移到右边,旋转的速度就会变得很快。

Eclipse工程的源代码在这里下载(原链接):

VortexPartII

--------------------------------------------------------------------------

在这个系列的第三部分给你show一下如何停止三角形的转动,并告诉你原来的旋转其实只是在三角形上进行的旋转,而不是在摄像机“camera”上进行的旋转。

我们希望能对旋转进行更多的控制。

为此,在每次调用onDrawFrame()方法的时候都会重置这个矩阵。

这会重设三角形的角度以便其总是可以旋转到给定的角度。

//definethecolorwewanttobedisplayedasthe"

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

//resetthematrix-goodtofixtherotationtoastaticangle

gl.glLoadIdentity();

//clearthecolorbufferandthedepthbuffertoshowtheClearColor

//wecalledabove...

gl.glClear(GL10.GL_COLOR_BUFFER_BIT);

//codesnipped

在VortexView类中,你应该删除“除以10”以便其可以旋转范围更大一些。

_renderer.setAngle(event.getX());

如果尝试了这些,你将会看到旋转只会根据触摸的到的位置来旋转。

如果没有触摸屏幕,旋转不会发生改变。

下一件事情:

我们旋转的是三角形本身,还是旋转的view/camera?

为了验证它,最简单的办法是创建第二个不旋转的三角形进行对照。

最快也是最笨的办法是copy&

pasteinitTriangle()方法为一个新的方法initStaticTriangle(),copy&

paste其中的两个buffer,copy&

paste并修改onDrawFrame()方法中的最后四行。

不要忘记了改变第二个三角形的颜色以及改变第二个三角形的坐标,这样方便我们能看到两个三角形。

我将每个地方的0.5f都改成了0.4f.

这里是整个的类:

importjava.nio.ByteBuffer;

importjava.nio.ByteOrder;

importjava.nio.FloatBuffer;

importjava.nio.ShortBuffer;

privatestaticfinalStringLOG_TAG=VortexRenderer.class.getSimpleName();

privatefloat_red=0f;

privatefloat_green=0f;

privatefloat_blue=0f;

//arawbuffertoholdindicesallowingareuseofpoints.

privateShortBuffer_indexBuffer;

privateShortBuffer_indexBufferStatic;

//arawbuffertoholdthevertices

privateFloatBuffer_vertexBuffer;

privateFloatBuffer_vertexBufferStatic;

privateshort[]_indicesArray={0,1,2};

privateint_nrOfVertices=3;

privatefloat_angle;

publicvoidonSurfaceCreated(GL10gl,EGLConfigconfig){

//preparation

gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);

initTriangle();

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 自然科学 > 物理

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1