无法找到合适的例子为Android OpenGL的2D精灵类至极不使用GL11Ext绘制 [英] Cant find suitable example for android 2d opengl sprite class wich does not use GL11Ext for drawing

查看:356
本文介绍了无法找到合适的例子为Android OpenGL的2D精灵类至极不使用GL11Ext绘制的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

由于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周的Andr​​oid 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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆