Форум программистов, компьютерный форум CyberForum.ru

Программирование Android

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 5.00
Tester64
395 / 356 / 43
Регистрация: 22.05.2013
Сообщений: 2,502
#1

Простая игра. OpenGL - Android

09.02.2014, 18:53. Просмотров 1410. Ответов 8
Метки нет (Все метки)

Хочу научиться работать с графикой и... решил начать с игрушки вроде этих:
https://play.google.com/store/apps/d...ileyz.aquarium
https://play.google.com/store/apps/d...penguinfishing
https://play.google.com/store/apps/d...tainclimbrace2

Что ОБЫЧНО используют для подобных игр? Canvas? OpenGL? Движки?

Матетематика движений должна быть на яве! (с++ пока не научился использовать в андроиде, а движковые языки вроде С# или javascript учить не хочу).

Если чесно, то пока склоняюсь в сторону OpenGL. Есть небольшой опыт с ним в других языках. Поэтому:
1) Кто нибудь вообще использует чистый OpenGL на яве андроида?
2) Можно ли использовать OpenGL картинки НЕ на весь экран (в примерах только на полный встречал), а рядом с обычными кнопками? (да/нет, пример)
3) Можно ли использовать НЕСКОЛЬКО разных OpenGL картинок на одной форме? Например по картинке в каждую закладку или в каждый Layout? В Делфи получалось, но там не андроид...

Добавлено через 1 час 9 минут
Уже выяснил (добился) что 2) и 3) - ВОЗМОЖНО...
Но 1) все еще интересует! Имеет ли смысл?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.02.2014, 18:53     Простая игра. OpenGL
Посмотрите здесь:

Android OpenGL 1.1 Android
OpenGL ES Android
Android простая анимация
Android OpenGL
Android Простая анимация
Android Инициализация OpenGL ES
Android Кривые в OpenGL SE 1.0
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
name?
 Аватар для name?
198 / 169 / 18
Регистрация: 01.06.2010
Сообщений: 371
Завершенные тесты: 1
09.02.2014, 23:03     Простая игра. OpenGL #2
Что ОБЫЧНО используют для подобных игр? Canvas? OpenGL? Движки?
1- двиг или OpenGL
2/3 можно и на канве сделать

1) Кто нибудь вообще использует чистый OpenGL на яве андроида?
хз, вроде как для андроида используется OpenGL ES 1.0/2.0

2/3

Кликните здесь для просмотра всего текста

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
package com.example.opengltest;
 
import android.app.Activity;
import android.opengl.GLSurfaceView;
import android.os.Bundle;
import android.view.Window;
import android.view.WindowManager;
 
public class MainActivity extends Activity {
 
    private GLSurfaceView glView;
    private GL_Renderer renderer;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                WindowManager.LayoutParams.FLAG_FULLSCREEN);
        
        renderer = new GL_Renderer(this);
        glView = new GLSurfaceView(this);
        glView.setRenderer(renderer);
        glView.requestFocus();
        
        setContentView(glView);
    }
 
}
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
package com.example.opengltest;
import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;
 
import android.content.Context;
import android.opengl.GLSurfaceView.Renderer;
 
public class GL_Renderer implements Renderer {
    
    private Context context;
    private int zoomX = 800;
    private int zoomY = 480;
    Polygon polygon;
    
    
    public GL_Renderer(Context context){
        this.context = context;
    }
    
    @Override
    public void onDrawFrame(GL10 gl) {
        gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
        
        GL_Prepare(gl);
        //Draw Game
 
        polygon.draw(gl, 120, 120, 150, 150);
     
        //End
        GL_Finish(gl);
    }
    
    @Override
    public void onSurfaceChanged(GL10 gl, int width, int height) {
        gl.glMatrixMode(GL10.GL_PROJECTION);
        gl.glLoadIdentity();
        
        gl.glOrthof(0, zoomX, zoomY, 0, 0, 1);
        gl.glViewport(0, 0, width, height);
        
        gl.glMatrixMode(GL10.GL_MODELVIEW);
        
    }
 
    @Override
    public void onSurfaceCreated(GL10 gl, EGLConfig config) {
        polygon = new Polygon(gl, context, R.drawable.ic_launcher);
       gl.glEnable(GL10.GL_TEXTURE_2D);
       gl.glShadeModel(GL10.GL_SMOOTH);
       gl.glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
       gl.glClearDepthf(1.0f);
       gl.glEnable(GL10.GL_DEPTH_TEST);
       gl.glDepthFunc(GL10.GL_LEQUAL);
    }
    
    private void GL_Prepare(GL10 gl){
        gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
        gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
        gl.glFrontFace(GL10.GL_CW);
        gl.glEnable(GL10.GL_DEPTH_TEST);
        gl.glEnable(GL10.GL_BLEND);
        gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA);
    }
    
    private void GL_Finish(GL10 gl){
        gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
        gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
    }
 
}
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
package com.example.opengltest;
 
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.FloatBuffer;
 
import javax.microedition.khronos.opengles.GL10;
 
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.opengl.GLUtils;
 
public class Polygon {
    private float[] uv1 = new float[2];
    private float[] uv0 = new float[2];
    private FloatBuffer vertexBuffer;
    
    private float vertices[]={
            0.0f, 1.0f, 0.0f, // bottom left
            0.0f, 0.0f, 0.0f, //top left
            1.0f, 0.0f, 0.0f, //top right
            1.0f, 1.0f, 0.0f //bottom right
    };
    private FloatBuffer uvCoordBuffer;
    private float[] uvCoord = {
            uv1[0], uv0[1],
            uv1[0], uv0[0],
            uv1[1], uv0[0],
            uv1[1], uv0[1]
    };
    
    private int[] textures = new int[1];
    private void init(){
        uvCoord[0] = 0.0f; uvCoord[1] = 1.0f;
        uvCoord[2] = 0.0f; uvCoord[3] = 0.0f;
        uvCoord[4] = 1.0f; uvCoord[5] = 0.0f;
        uvCoord[6] = 1.0f; uvCoord[7] = 1.0f;
        
        ByteBuffer byteBuffer = ByteBuffer.allocateDirect(vertices.length * 4);
        byteBuffer.order(ByteOrder.nativeOrder());
 
        vertexBuffer = byteBuffer.asFloatBuffer();
        vertexBuffer.put(vertices);
        vertexBuffer.position(0);
 
        byteBuffer = ByteBuffer.allocateDirect(uvCoord.length * 4);
        byteBuffer.order(ByteOrder.nativeOrder());
        uvCoordBuffer = byteBuffer.asFloatBuffer();
        uvCoordBuffer.put(uvCoord);
        uvCoordBuffer.position(0);
    }
    
    public Polygon(GL10 gl, Context c, int id) {
        init();
        LoadFromAsset(gl, c, id);
    }
 
    public void LoadFromAsset(GL10 gl, Context context, int id) {
        Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(), id);
        gl.glGenTextures(1, textures,0);
        gl.glBindTexture(GL10.GL_TEXTURE_2D, textures[0]);
        
        gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_NEAREST);
        gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_LINEAR);
    
        GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap, 0);
        bitmap.recycle();
    }
    
  
    
    private void draw(GL10 gl){
        
        gl.glBindTexture(GL10.GL_TEXTURE_2D, textures[0]);
        gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuffer);
        gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, uvCoordBuffer.position(0));
        gl.glDrawArrays(GL10.GL_TRIANGLE_FAN, 0, vertices.length / 3);
    }
    
    public void draw(GL10 gl, int posX, int posY, int width, int height){
        gl.glLoadIdentity();
        gl.glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
        gl.glTranslatef(posX, posY, 0);
        gl.glScalef(width, height, 0);
        gl.glRotatef(0, 0, 0, 1.0f);
        draw(gl);
    }
    
}
NiRamz
211 / 211 / 16
Регистрация: 26.12.2010
Сообщений: 691
10.02.2014, 13:30     Простая игра. OpenGL #3
libgdx - библиотека под андроид и пк. Использует OpenGL и код пишется на java.
Tester64
395 / 356 / 43
Регистрация: 22.05.2013
Сообщений: 2,502
10.02.2014, 16:18  [ТС]     Простая игра. OpenGL #4
Пока libgdx нравится (читаю о нем), но...

Привык рисовать обьекты сам (схематические) - круги, прямоугольники... И не хочется ПОЛНОСТЬЮ отказываться от этих возможностей. Не хочу использовать ТОЛЬКО готовые картинки. В OpenGL такое использовал, а в libgdx это возможно? Не хочу потратить десяток часов на изучение движка, а потом выяснится что не возможно... Как в нем с 3Д обьектами или только 2Д? Можно ли использовать сменное освещение (подвижный источник вокруг 3Д обьектов)?
NiRamz
211 / 211 / 16
Регистрация: 26.12.2010
Сообщений: 691
10.02.2014, 16:29     Простая игра. OpenGL #5
3д в нем можно забабахать, на счет примитивов и освещения не в курсе, не использовал
name?
 Аватар для name?
198 / 169 / 18
Регистрация: 01.06.2010
Сообщений: 371
Завершенные тесты: 1
10.02.2014, 17:13     Простая игра. OpenGL #6
примитивы можно,а для освещения используют шейдера
Tester64
395 / 356 / 43
Регистрация: 22.05.2013
Сообщений: 2,502
10.02.2014, 18:04  [ТС]     Простая игра. OpenGL #7
А насколько сильно продумана там физика? Простая гравитация, столкновение-отталкивание, вращение...
В планах было сделать плоскую гоночную машинку. Вроде игры на парковку.

Добавлено через 4 минуты
...когда-то подобную почти сделал на Делфи+OpenGL
NiRamz
211 / 211 / 16
Регистрация: 26.12.2010
Сообщений: 691
10.02.2014, 18:28     Простая игра. OpenGL #8
для физики я подключал Box2D
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.02.2014, 18:32     Простая игра. OpenGL
Еще ссылки по теме:

Android Текстура OpenGL es 2
На эмуляторе самая простая программа идет, а на телефон не устанавливается Android
Android Простая и бесплатная возможность рисования для приложения под android
OpenGl ES 2.0 Текстуры Android
Android Тормозит простая анимация в Android приложении

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
name?
 Аватар для name?
198 / 169 / 18
Регистрация: 01.06.2010
Сообщений: 371
Завершенные тесты: 1
10.02.2014, 18:32     Простая игра. OpenGL #9
для физики там встроили Box2d, вот есть статья
З.Ы. сам не юзал, т.к. использую свои велосипеды)
Yandex
Объявления
10.02.2014, 18:32     Простая игра. OpenGL
Ответ Создать тему
Опции темы

Текущее время: 03:32. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru