我想用OpenGL ES 2.0创建一些简单的tetris克隆用于教育目的。到目前为止,我设法在屏幕上绘制一个由两个三角形组成的简单矩形。
我想用那些原始的矩形作为我的俄罗斯方块块 现在,我的问题是如何移动这些矩形,因为它们应该像俄罗斯方块一样掉下来。
这是我定义矩形的方式:
...
public Rectangle()
{
_vertices = new float[]
{
// x, y, z
// R, G, B, A
-1.0f, 1.0f, 0.0f,
1.0f, 0.0f, 0.0f, 1.0f,
-1.0f, -1.0f, 0.0f,
0.0f, 1.0f, 0.0f, 1.0f,
1.0f, 1.0f, 0.0f,
0.0f, 0.0f, 1.0f, 1.0f,
-1.0f, -1.0f, 0.0f,
1.0f, 0.0f, 0.0f, 1.0f,
1.0f, -1.0f, 0.0f,
0.0f, 1.0f, 0.0f, 1.0f,
1.0f, 1.0f, 0.0f,
0.0f, 0.0f, 1.0f, 1.0f
};
InitBuffer();
}
...
这是绘制矩形的代码:
private void drawRectangle(final FloatBuffer aRectangleBuffer)
{
aRectangleBuffer.position(mPositionOffset);
GLES20.glVertexAttribPointer(mPositionHandle, mPositionDataSize, GLES20.GL_FLOAT, false,
mStrideBytes, aRectangleBuffer);
GLES20.glEnableVertexAttribArray(mPositionHandle);
aRectangleBuffer.position(mColorOffset);
GLES20.glVertexAttribPointer(mColorHandle, mColorDataSize, GLES20.GL_FLOAT, false,
mStrideBytes, aRectangleBuffer);
GLES20.glEnableVertexAttribArray(mColorHandle);
Matrix.multiplyMM(mMVPMatrix, 0, mViewMatrix, 0, mModelMatrix, 0);
Matrix.multiplyMM(mMVPMatrix, 0, mProjectionMatrix, 0, mMVPMatrix, 0);
GLES20.glUniformMatrix4fv(mMVPMatrixHandle, 1, false, mMVPMatrix, 0);
GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, 6);
}
代码基本上是从本教程复制的:Learn OpenGL ES - Android Lesson One: Getting Started
移动我想到的矩形的唯一方法是更改_vertices
- 数组中的顶点。但这意味着要在每次抽奖中创建一个新阵列,一个新的VertexBuffer等,我不认为这是可行的方法。
也许这是一个转储问题,但是虽然我已经开始了解OpenGL ES是如何工作的,但这个我还没想到。
非常感谢任何帮助。
答案 0 :(得分:1)
有很多方法可以解决这个问题。哪种方式最好取决于您的目标。由于您正在编写的游戏在GPU方面相对要求不高,因此从简单的事情开始是有意义的。
在您引用的示例中,每个顶点都乘以u_MVPMatrix
。如果在每次绘制调用之前使用位置更新矩阵,则可以使用同一组顶点在屏幕上的任何位置绘制形状(并更改其比例,并旋转它,以及所有其他花哨的东西矩阵可以让您这样做) 。这是Android Breakout和部分Grafika使用的方法(例如参见“硬件规模练习器”)。
如果你达到了这种方法效率不高的程度,可能是时候研究游戏引擎(也许cocos2d-x?)而不是重新发明纹理映射轮。