rotate tiles on touch
This commit is contained in:
parent
1fc70c5266
commit
03c1d29ea0
@ -25,6 +25,14 @@ import java.lang.Math;
|
|||||||
|
|
||||||
public class MyRenderer implements GLSurfaceView.Renderer
|
public class MyRenderer implements GLSurfaceView.Renderer
|
||||||
{
|
{
|
||||||
|
class Tile
|
||||||
|
{
|
||||||
|
public boolean flipping;
|
||||||
|
public boolean side;
|
||||||
|
public float rotation;
|
||||||
|
public int axis;
|
||||||
|
};
|
||||||
|
|
||||||
private int m_program;
|
private int m_program;
|
||||||
private final String DBGTAG = "JoshsOpenGL";
|
private final String DBGTAG = "JoshsOpenGL";
|
||||||
private FloatBuffer m_quad_attrib_buffer;
|
private FloatBuffer m_quad_attrib_buffer;
|
||||||
@ -36,15 +44,29 @@ public class MyRenderer implements GLSurfaceView.Renderer
|
|||||||
private int m_height;
|
private int m_height;
|
||||||
private final int GRID_WIDTH = 16;
|
private final int GRID_WIDTH = 16;
|
||||||
private final int GRID_HEIGHT = 9;
|
private final int GRID_HEIGHT = 9;
|
||||||
private float[][] m_tiles = new float[GRID_WIDTH][GRID_HEIGHT];
|
private Tile[][] m_tiles = new Tile[GRID_WIDTH][GRID_HEIGHT];
|
||||||
private float m_aspect = 1.0f;
|
private float m_aspect = 1.0f;
|
||||||
private final float DISTANCE =
|
private final float DISTANCE =
|
||||||
(float) (GRID_HEIGHT / 2.0 / Math.tan(Math.toRadians(30)));
|
(float) (GRID_HEIGHT / 2.0 / Math.tan(Math.toRadians(30)));
|
||||||
|
private long m_last_time = SystemClock.uptimeMillis();
|
||||||
|
private final float[][] AXES = {
|
||||||
|
{1, 0, 0},
|
||||||
|
{0, 1, 0},
|
||||||
|
{-1, 0, 0},
|
||||||
|
{0, -1, 0}
|
||||||
|
};
|
||||||
|
|
||||||
public MyRenderer(AssetManager am, Resources resources)
|
public MyRenderer(AssetManager am, Resources resources)
|
||||||
{
|
{
|
||||||
m_asset_manager = am;
|
m_asset_manager = am;
|
||||||
m_resources = resources;
|
m_resources = resources;
|
||||||
|
for (int x = 0; x < GRID_WIDTH; x++)
|
||||||
|
{
|
||||||
|
for (int y = 0; y < GRID_HEIGHT; y++)
|
||||||
|
{
|
||||||
|
m_tiles[x][y] = new Tile();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void checkGLError(String glOperation)
|
public void checkGLError(String glOperation)
|
||||||
@ -149,10 +171,33 @@ public class MyRenderer implements GLSurfaceView.Renderer
|
|||||||
GLES20.glClearColor(1.0f, 0.6f, 0.1f, 1.0f);
|
GLES20.glClearColor(1.0f, 0.6f, 0.1f, 1.0f);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void update_tiles(long elapsed)
|
||||||
|
{
|
||||||
|
for (int x = 0; x < GRID_WIDTH; x++)
|
||||||
|
{
|
||||||
|
for (int y = 0; y < GRID_HEIGHT; y++)
|
||||||
|
{
|
||||||
|
Tile t = m_tiles[x][y];
|
||||||
|
if (t.flipping)
|
||||||
|
{
|
||||||
|
t.rotation += elapsed * (180.0f / 2000.0f);
|
||||||
|
if (t.rotation >= 180.0f)
|
||||||
|
{
|
||||||
|
t.flipping = false;
|
||||||
|
t.side = !t.side;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public void onDrawFrame(GL10 unused)
|
public void onDrawFrame(GL10 unused)
|
||||||
{
|
{
|
||||||
GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);
|
GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);
|
||||||
|
|
||||||
|
long time = SystemClock.uptimeMillis();
|
||||||
|
update_tiles(time - m_last_time);
|
||||||
|
|
||||||
int attr_pos = GLES20.glGetAttribLocation(m_program, "pos");
|
int attr_pos = GLES20.glGetAttribLocation(m_program, "pos");
|
||||||
int attr_color = GLES20.glGetAttribLocation(m_program, "color");
|
int attr_color = GLES20.glGetAttribLocation(m_program, "color");
|
||||||
checkGLError("glGetAttribLocation");
|
checkGLError("glGetAttribLocation");
|
||||||
@ -173,10 +218,17 @@ public class MyRenderer implements GLSurfaceView.Renderer
|
|||||||
{
|
{
|
||||||
for (int x = 0; x < GRID_WIDTH; x++)
|
for (int x = 0; x < GRID_WIDTH; x++)
|
||||||
{
|
{
|
||||||
|
Tile t = m_tiles[x][y];
|
||||||
Matrix.setIdentityM(m_modelview, 0);
|
Matrix.setIdentityM(m_modelview, 0);
|
||||||
Matrix.translateM(m_modelview, 0,
|
Matrix.translateM(m_modelview, 0,
|
||||||
x - GRID_WIDTH / 2.0f, y - GRID_HEIGHT / 2.0f,
|
x - GRID_WIDTH / 2.0f, y - GRID_HEIGHT / 2.0f,
|
||||||
-DISTANCE);
|
-DISTANCE);
|
||||||
|
if (t.flipping)
|
||||||
|
{
|
||||||
|
Matrix.rotateM(m_modelview, 0,
|
||||||
|
t.rotation,
|
||||||
|
AXES[t.axis][0], AXES[t.axis][1], AXES[t.axis][2]);
|
||||||
|
}
|
||||||
GLES20.glUniformMatrix4fv(
|
GLES20.glUniformMatrix4fv(
|
||||||
GLES20.glGetUniformLocation(m_program, "modelview"),
|
GLES20.glGetUniformLocation(m_program, "modelview"),
|
||||||
1, false, m_modelview, 0);
|
1, false, m_modelview, 0);
|
||||||
@ -189,6 +241,8 @@ public class MyRenderer implements GLSurfaceView.Renderer
|
|||||||
GLES20.glDisableVertexAttribArray(attr_pos);
|
GLES20.glDisableVertexAttribArray(attr_pos);
|
||||||
GLES20.glDisableVertexAttribArray(attr_color);
|
GLES20.glDisableVertexAttribArray(attr_color);
|
||||||
checkGLError("glDisableVertexAttribArray");
|
checkGLError("glDisableVertexAttribArray");
|
||||||
|
|
||||||
|
m_last_time = time;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void onSurfaceChanged(GL10 unused, int width, int height)
|
public void onSurfaceChanged(GL10 unused, int width, int height)
|
||||||
@ -213,6 +267,20 @@ public class MyRenderer implements GLSurfaceView.Renderer
|
|||||||
if (e.getAction() == MotionEvent.ACTION_DOWN ||
|
if (e.getAction() == MotionEvent.ACTION_DOWN ||
|
||||||
e.getAction() == MotionEvent.ACTION_MOVE)
|
e.getAction() == MotionEvent.ACTION_MOVE)
|
||||||
{
|
{
|
||||||
|
int x = (int) (GRID_WIDTH * e.getX() / (float) m_width);
|
||||||
|
int y = (int) (GRID_HEIGHT * (m_height - e.getY()) / (float) m_height);
|
||||||
|
|
||||||
|
if (x >= 0 && x < GRID_WIDTH && y >= 0 && y < GRID_HEIGHT)
|
||||||
|
{
|
||||||
|
Tile t = m_tiles[x][y];
|
||||||
|
if (!t.flipping)
|
||||||
|
{
|
||||||
|
t.flipping = true;
|
||||||
|
t.rotation = 0.0f;
|
||||||
|
t.axis = (int) (Math.random() * 4);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user