无法找到合适的例子为Android OpenGL的2D精灵类至极不使用GL11Ext绘制 [英] Cant find suitable example for android 2d opengl sprite class wich does not use GL11Ext for drawing
问题描述
由于SpriteMethodTest说,有很多方法绘制精灵。首先我想画布,有一些性能问题。比我决定学习的OpenGL。我用GL11Ext扩展了我的第一个成果。但你知道,在默认情况下,当你绘制纹理它们翻转和X和Y轴对设备屏幕(在横向模式)的左下角零不喜欢的画布,你不能旋转精灵。
As SpriteMethodTest says there are many ways for drawing sprites. First i tried canvas and had some performance problems. Than i decided to learn opengl. I made my first achievements using GL11Ext extension. but you know by default when you draw textures they are flipped and the x and y axis have zero on the bottom left corner of device screen (in landscape mode) not like the canvas and you cant rotate sprites.
比我试图影响使用GLU看看这个轴视图。但是并没有影响。
Than i tried to affect this axis view using GLU look at. But had not effect.
比我想我的旋转精灵,并没有影响GL11Ext的原因,因为他们说。
Than i wanted to rotate my sprites and had not effect cause of GL11Ext as they say.
所以我有重要的计算器状况现在基本的问题是:
So i have the major stackoverflow condition now and the basic question is:
1。哪种方法来实现缩放,旋转和跳跃的精灵上的影响,并用于观看X和Y轴中的古老甜蜜的样子[(0,0)在上面留在风景模式]
2。和有一些精灵类实例在宇宙WICH使用画面渲染只有1好办法? (SpriteMethodTest混淆了我很多)
推荐答案
EVRIKA!
我的allmost杀喽!在离开帆布和学习OpenGL的方法来实现游戏引擎3天。
I was allmost killing myself ! after 3 days of leaving Canvas and learning OpenGL methods to implement game engine.
该网站是充满了OpenGL教程充满垃圾,其中许多是未完成的,其中许多人产生错误的方式为OpenGL的2D游戏引擎实现methotds。大错点使用G11Ext制作游戏。 AS他们不ROTATE:D
The web is full of OpenGL tutorials full of trash and many of them are unfinished and many of them lead to wrong way for 2D OpenGL game engine implementation methotds. The big wrong point is using G11Ext for making games. AS THEY DONT ROTATE : D
Annd annd然后我发现这个教程其他教程中,我发现从YouTube游戏示例视频链接大声笑:
Annd annd then i found this tutorial from other tutorial which i found from youtube game sample video link lol:
不是这里的观众搞不清是
not to confuse viewers here is
第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/
第3章:<一href="http://obviam.net/index.php/texture-mapping-opengl-android-displaying-images-using-opengl-and-squares/" rel="nofollow">http://obviam.net/index.php/texture-mapping-opengl-android-displaying-images-using-opengl-and-squares/
Annd仅有15分钟前,我发现我可以旋转,移动和调整形状,其精灵的样子! ! ! HAHAH
Annd just 15 minutes ago I discovered the way I can ROTATE, MOVE AND RESIZE shapes with its sprites ! ! ! hahah
所以,很多读者都在问阅读这个伟大的教程如何移动和调整大小和旋转精灵之后。所以,我摸索出了一些code在这种混乱的例子和教程:
So as many of readers are asking after reading this GREAT tutorial how to move and resize and rotate sprites. So i worked out some code from this mess of examples and tutorials:
本类用于某些顶点操作
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);
}
}
和这个类是用于与质感能够移动旋转和位置绘制形状
and this class is used for drawing shape with texture able to move rotate and position
public class Square
{
Vertex shape,texture;
int corner=0;
float x=0;
public Square()
{
shape = new Vertex (new float[]
{
1f,1f,0f,
0f,1f,0f,
1f,0f,0f,
0f,0f,0f,
});
texture = new Vertex (new float[]
{
1.0f, 0.0f,
0.0f, 0.0f,
1.0f, 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, 0, 0, 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, 1.0f, 0.0f, 0.5f);
// Set the face rotation
gl.glFrontFace(GL10.GL_CW);
// Point to our vertex buffer
gl.glVertexPointer (3, GL10.GL_FLOAT, 0, shape.buffer);
gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, texture.buffer);
// Draw the vertices as triangle strip
gl.glDrawArrays (GL10.GL_TRIANGLE_STRIP, 0, 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 x, float y, float width, float height, 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, 0f, 0f, 1f); // ROTATE !!!
gl.glTranslatef (-width/2, -height/2, 0f);
}
gl.glScalef (width, height, 0f); // ADJUST SIZE !!!
}
}
和主要的还是如何设置相机,使1 OpenGL的单元== 1像素annd如何加载纹理
and the main thing how to set camera so that 1 opengl unit == 1 pixel annd how to load textures
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, 0, width, height); // Reset The Current Viewport
gl.glMatrixMode (GL10.GL_PROJECTION); // Select The Projection Matrix
gl.glLoadIdentity (); // Reset The Projection Matrix
gl.glOrthof (0, width, 0, height, -1f, 1f);
//gl.glTranslatef (0f, -height/2, 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.0f, 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, 0, 0, bitmap.getWidth (), bitmap.getHeight (), flip, true);
GLUtils.texImage2D (GL10.GL_TEXTURE_2D, 0, 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, 0, width, height, 0);
square1.draw (gl, images.get(R.drawable.s1_ground), 0, 0, width, height, 0);
}
}
这里的主要的事情,我想执行和落实是在X轴和Y轴都像在画布上:
the main thing here i wanted to implement and implemented is that the X and Y axis are like in canvas:
(0,0)
--------------------------------- X axis
|
|
|
|
|
|
|
|
Y axis
我会写经过这一番完全教程,我要宣布,我实现了所有目标,我要实现的目标,即:X轴之上,左Y轴,OpenGL的单位=像素,对象以像素为单位设置大小,旋转对象,移动对象都以像素为单位。现在我会处理动画精灵使他们在更细的类别和多数民众赞成新的OpenGL的2D游戏框架的基础...
I ll write some full tutorial after this and I like to announce that i achieved all goals i wanted to achieve i.e: X axis on top, Y axis on left, opengl unit = pixel, set size of object in pixels, rotate object, move object everything in pixels. now i ll handle animating sprites and make them in finer classes and thats the new 2d opengl game framework basis...
发现这个功能帮了我的教程 http://www.morrowland.com/围裙/教程/ GL / gl_matrix.php
discovering this functions helped me tutorial http://www.morrowland.com/apron/tutorials/gl/gl_matrix.php
所以非常感谢这个博客指着我的唯一正确的方法......
So many thanks to this blog for pointing me out the only true way...
+1 1周的Android simpliest OpenGL的2D游戏引擎......
+1 android simpliest 2d opengl game engine in 1 week...
开心思绪飞扬......
happy mind blowing...
:P
编辑:一年后,我有一个很好的框架 https://github.com/hazardland/ game.android 使用这里介绍的概念和样品的游戏与任何可能的框架使用的例子在这里的的 https://github.com/hazardland/ferry.android (查看屏幕市场的 https://play.google.com/store/apps/details?id=hazardland.borani )
After year I have a nice framework https://github.com/hazardland/game.android using concepts described here and sample game with any possible framework usage examples here https://github.com/hazardland/ferry.android (view screens on market https://play.google.com/store/apps/details?id=hazardland.borani)
这篇关于无法找到合适的例子为Android OpenGL的2D精灵类至极不使用GL11Ext绘制的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!