微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

不能找到适合Android 2d opengl精灵类的例子,它不使用GL11Ext绘图

正如SpriteMethodTest所说,绘制精灵有很多种方法.首先我尝试画布,并出现一些性能问题.比我决定学习opengl.我使用GL11Ext扩展做了我的第一个成就.但是,当您绘制纹理时,您会知道它们被翻转,并且x和y轴在设备屏幕的左下角(以横向模式)为零,不像画布,您不能旋转精灵.

比我试图影响这个轴视图使用glu看.但没有效果.

比我想要旋转我的精灵,并没有影响GL11Ext的原因,因为他们说.

所以我现在有主要的stackoverflow条件,基本的问题是:

1.使用哪种方法实现ZOOMING,ROTATING和BOUNCING对sprites的影响,以及在旧窗口中查看X和Y轴[(0,0)是否在风景模式的最前面)?

2.而且在大都会中有一些很棒的类别例子只能使用一个好的方式来进行渲染? (SpriteMethodTest让我很困惑)

解决方法

EVRIKA !!!

我真的是杀了我自己!离开画布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/

第3章:http://obviam.net/index.php/texture-mapping-opengl-android-displaying-images-using-opengl-and-squares/

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)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐