比我试图影响这个轴视图使用GLU看.但没有效果.
比我想要旋转我的精灵,并没有影响GL11Ext的原因,因为他们说.
所以我现在有主要的stackoverflow条件,基本的问题是:
1.使用哪种方法实现ZOOMING,ROTATING和BOUNCING对sprites的影响,以及在旧窗口中查看X和Y轴[(0,0)是否在风景模式的最前面)?
2.而且在大都会中有一些很棒的类别例子只能使用一个好的方式来进行渲染? (SpriteMethodTest让我很困惑)
解决方法
我真的是杀了我自己!离开画布3天后学习OpenGL方法实现游戏引擎.
网络上装满了垃圾桶的OpenGL教程,其中许多都是未完成的,其中许多都导致2D OpenGL游戏引擎实施元数据的错误方式.大错特点是使用G11Ext进行游戏.作为他们的旋转:D
Annd annd然后我发现这个教程从其他教程,我发现从YouTube游戏示例视频链接哈哈:
不要混淆这里的观众
第1章:http://obviam.net/index.php/opengl-es-with-android-switching-from-canvas-to-opengl/
第2章:http://obviam.net/index.php/opengl-es-android-displaying-graphical-elements-primitives/
Annd只有15分钟前,我发现了我可以旋转,移动和调整形状与其精灵的方式! ! ! HAHAH
所以很多读者在阅读这篇GREAT教程之后要问如何移动和调整大小并旋转精灵.所以我从这个混乱的例子和教程中制定了一些代码:
该类用于某些顶点操作
public class Vertex { public FloatBuffer buffer; // buffer holding the vertices public float vertex[]; public Vertex (float[] vertex) { this.vertex = vertex; this.prepare (); } private void prepare () { // a float has 4 bytes so we allocate for each coordinate 4 bytes ByteBuffer factory = ByteBuffer.allocateDirect (vertex.length * 4); factory.order (ByteOrder.nativeOrder ()); // allocates the memory from the byte buffer buffer = factory.asFloatBuffer (); // fill the vertexBuffer with the vertices buffer.put (vertex); // set the cursor position to the beginning of the buffer buffer.position (0); } }
这个类用于绘制具有能够移动旋转和定位的纹理的形状
public class Square { Vertex shape,texture; int corner=0; float x=0; public Square() { shape = new Vertex (new float[] { 1f,1f,0f,}); texture = new Vertex (new float[] { 1.0f,0.0f,1.0f,}); } /** The draw method for the square with the GL context */ public void draw (GL10 gl,int image,float x,float y,float width,float height,float corner) { if (corner>=0) { corner += 1; } if (corner>360) { corner = -1; } gl.glPushMatrix(); x += 1f; if (x>800) { x = 0; } position (gl,width,height,corner); // bind the prevIoUsly generated texture gl.glBindTexture(GL10.GL_TEXTURE_2D,image); // Point to our buffers gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY); // set the colour for the square gl.glColor4f (0.0f,0.5f); // Set the face rotation gl.glFrontFace(GL10.GL_CW); // Point to our vertex buffer gl.glVertexPointer (3,GL10.GL_FLOAT,shape.buffer); gl.glTexCoordPointer(2,texture.buffer); // Draw the vertices as triangle strip gl.glDrawArrays (GL10.GL_TRIANGLE_STRIP,shape.vertex.length / 3); // Disable the client state before leaving gl.glDisableClientState (GL10.GL_VERTEX_ARRAY); gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY); gl.glPopMatrix(); } public void position (GL10 gl,float corner) { gl.glTranslatef (x,y,0f); //MOVE !!! 1f is size of figure if called after scaling,1f is pixel if called before scaling if (corner>0) { gl.glTranslatef (width/2,height/2,0f); gl.glRotatef (corner,1f); // ROTATE !!! gl.glTranslatef (-width/2,-height/2,0f); } gl.glScalef (width,0f); // ADJUST SIZE !!! } }
和主要的事情如何设置相机,使1个opengl单位== 1像素annd如何加载纹理
public class Scene implements Renderer { public Context context; public Resources resources; public SparseIntArray images = new SparseIntArray (); public float width; public float height; public Scene (Context context) { this.context = context; this.resources = context.getResources (); } @Override public void onDrawFrame (GL10 gl) { // // clear Screen and Depth Buffer gl.glClear (GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT); gl.glMatrixMode(GL10.GL_MODELVIEW); // // Reset the Modelview Matrix gl.glLoadIdentity (); draw (gl); } @Override public void onSurfaceChanged (GL10 gl,int width,int height) { this.width = width; this.height = height; gl.glViewport (0,height); // Reset The Current Viewport gl.glMatrixMode (GL10.GL_PROJECTION); // Select The Projection Matrix gl.glLoadIdentity (); // Reset The Projection Matrix gl.glOrthof (0,-1f,1f); //gl.glTranslatef (0f,0.0f); // move the camera !! gl.glMatrixMode (GL10.GL_MODELVIEW); // Select The Modelview Matrix gl.glLoadIdentity (); // Reset The Modelview Matrix load (gl); } public void onSurfaceCreated(GL10 gl,EGLConfig config) { gl.glEnable(GL10.GL_TEXTURE_2D); //Enable Texture Mapping ( NEW ) gl.glShadeModel(GL10.GL_SMOOTH); //Enable Smooth Shading gl.glClearColor(0.0f,0.5f); //Black Background gl.glClearDepthf(1.0f); //Depth Buffer Setup gl.glEnable(GL10.GL_DEPTH_TEST); //Enables Depth Testing gl.glDepthFunc(GL10.GL_LEQUAL); //The Type Of Depth Testing To Do gl.glBlendFunc(GL10.GL_SRC_ALPHA,GL10.GL_ONE_MINUS_SRC_ALPHA); gl.glEnable(GL10.GL_BLEND); //Really Nice Perspective Calculations gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT,GL10.GL_NICEST); init (gl); } public void init (GL10 gl) { } public void load (GL10 gl) { } public void draw (GL10 gl) { } private static int next (GL10 gl) { int[] temp = new int[1]; gl.glGenTextures (1,temp,0); return temp[0]; } public int image (GL10 gl,int resource) { int id = next (gl); images.put (resource,id); gl.glBindTexture (GL10.GL_TEXTURE_2D,id); gl.glTexParameterf (GL10.GL_TEXTURE_2D,GL10.GL_TEXTURE_MIN_FILTER,GL10.GL_LINEAR); gl.glTexParameterf (GL10.GL_TEXTURE_2D,GL10.GL_TEXTURE_MAG_FILTER,GL10.GL_LINEAR); gl.glTexParameterf (GL10.GL_TEXTURE_2D,GL10.GL_TEXTURE_WRAP_S,GL10.GL_CLAMP_TO_EDGE); gl.glTexParameterf (GL10.GL_TEXTURE_2D,GL10.GL_TEXTURE_WRAP_T,GL10.GL_CLAMP_TO_EDGE); gl.glTexEnvf (GL10.GL_TEXTURE_ENV,GL10.GL_TEXTURE_ENV_MODE,GL10.GL_REPLACE); BitmapFactory.Options options = new BitmapFactory.Options (); options.inScaled = false; InputStream input = resources.openRawResource (resource); Bitmap bitmap; try { bitmap = BitmapFactory.decodeStream (input,null,options); } finally { try { input.close (); } catch (IOException e) { // Ignore. } } // Matrix flip = new Matrix (); // flip.postScale (1f,-1f); // bitmap = Bitmap.createBitmap (bitmap,bitmap.getWidth (),bitmap.getHeight (),flip,true); GLUtils.texImage2D (GL10.GL_TEXTURE_2D,bitmap,0); return id; } }
和一些用法
public class Scene2 extends Scene { Square square1,square2; public Scene2(Context context) { super (context); // TODO Auto-generated constructor stub } public void init (GL10 gl) { square1 = new Square (); square2 = new Square (); } public void load (GL10 gl) { image (gl,R.drawable.s1_clouds); image (gl,R.drawable.s1_ground); } public void draw (GL10 gl) { square1.draw (gl,images.get(R.drawable.s1_clouds),0); square1.draw (gl,images.get(R.drawable.s1_ground),0); } }
我想要实现和实现的主要是X和Y轴就像画布一样:
(0,0) --------------------------------- X axis | | | | | | | | Y axis
我会在这之后写一些完整的教程,我喜欢宣布,我实现了我想要实现的所有目标,即:上面的X轴,左侧的Y轴,opengl单位=像素,设置对象的像素大小,旋转对象,移动以像素为对象.现在我将处理动画精灵,使他们在更好的课程,这是新的2d opengl游戏框架基础…
发现这个功能有助于我http://www.morrowland.com/apron/tutorials/gl/gl_matrix.php教程
非常感谢这个博客指出我唯一真正的方式…
1个android最简单的2d opengl游戏引擎在1周…
快乐的心灵吹…
:P
编辑:一年后,我有一个很好的框架https://github.com/hazardland/game.android使用这里描述的概念和示例游戏与任何可能的框架使用示例这里https://github.com/hazardland/ferry.android(查看屏幕市场https://play.google.com/store/apps/details?id=hazardland.borani)