Подтвердить что ты не робот

Не могу найти подходящий пример для класса спрайтов android 2d opengl, который не использует GL11Ext для рисования

Как говорит SpriteMethodTest, существует много способов рисования спрайтов. Во-первых, я попробовал canvas, и у меня были некоторые проблемы с производительностью. Далее я решил изучить opengl. Я сделал свои первые достижения, используя расширение GL11Ext. Однако по умолчанию вы знаете, что когда вы рисуете текстуры, они переворачиваются, а оси x и y имеют ноль в левом нижнем углу экрана устройства (в альбомном режиме), что не похоже на холст, но вы не можете вращать спрайты.

Затем я попытался повлиять на это представление оси, используя взгляд GLU, но это не имело никакого эффекта. Затем я хотел повернуть свои спрайты, но я не имел эффекта из-за GL11Ext, как они говорят.

Итак, у меня сейчас серьезное состояние, и основной вопрос:

1. Какой метод использовать для достижения эффектов ZOOMING, ROTATING и BOUNCING на спрайтах и для просмотра оси X и Y по старому пути [(0,0) на верхнем левом углу в режиме пейзажа]?

2. И есть ли НЕКОТОРЫЙ ПРИМЕР СПРАЙТ-КЛАССА В ВСЕЛЕННОЙ, КОТОРЫЙ ИСПОЛЬЗУЕТ ТОЛЬКО 1 ХОРОШИЙ СПОСОБ ВЫДАЧИ СПРАЙТА? (SpriteMethodTest меня сильно смущает)

4b9b3361

Ответ 1

EVRIKA!!!

Я был самым убивающим себя! после 3 дней ухода Canvas и изучения методов 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

Так как многие читатели спрашивают, прочитав этот БОЛЬШОЙ учебник, как перемещать и изменять размеры и вращать спрайты. Поэтому я разработал код из этого беспорядка примеров и учебников:

Этот класс используется для некоторых манипуляций с вершинами

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,
                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 pixel 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, 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 похожи на холст:

(0,0)
 --------------------------------- X axis
|
|
|
|
|
|
|
|
Y axis

После этого я напишу полный полный учебник, и мне нравится объявлять, что я достиг всех целей, которые я хотел достичь, то есть: ось X сверху, ось Y слева, opengl unit = пиксель, заданный размер объекта в пикселях, поворот объект, перемещать объект все в пикселях. теперь я обрабатываю анимационные спрайты и делаю их в более тонких классах, и это новая основа фреймворка 2d opengl...

обнаружение этих функций помогло мне учебник http://www.morrowland.com/apron/tutorials/gl/gl_matrix.php

Так много спасибо этому блогу за то, что указали мне единственный истинный способ...

+1 android simpleiest 2d opengl game engine за 1 неделю...

счастливый ум дует...

: р

Изменить: после года у меня есть хорошая структура https://github.com/hazardland/game.android, используя описанные здесь концепции и примерную игру с любыми возможные примеры использования каркаса здесь https://github.com/hazardland/ferry.android (просмотр экранов на рынке <а6 > )