2014-03-06 59 views
0

我想用OpenGL ES 2.0为教育目的创建一些简单的俄罗斯方块克隆。到目前为止,我设法在屏幕上绘制了一个由两个三角形组成的简单矩形。用OpenGL ES 2.0移动基元(三角形/矩形)

我想使用那些原始矩形作为我的俄罗斯方块块。
现在,我的问题是如何移动这些矩形,因为他们应该像俄罗斯方块块一样掉下来。

这是我如何定义我的矩形:

... 
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

简单但完整的示例:https://code.google.com/p/android-breakout/。这里有一些相关的评论来源:https://code.google.com/p/android-breakout/source/browse/src/com/faddensoft/breakout/BasicAlignedRect.java#31 – fadden

+0

这似乎正是我正在寻找:)。如果你能以某种方式塑造这个答案,我会接受它:)。 – user1567896

+0

完成。答案需要更长时间:-) – fadden

回答

1

有很多方法可以解决这个问题。哪种方式最好取决于你的目标。由于你正在写的游戏相对要求不高,所以从简单的事情开始就很有意义。

在你引用的例子中,每个顶点都乘以u_MVPMatrix。如果在每次绘制调用之前用位置更新矩阵,则可以使用相同的一组顶点在屏幕上的任何位置绘制形状(并更改其比例并旋转它,以及所有其他花哨的东西矩阵让您执行此操作) 。这是Android BreakoutGrafika的部分(参见例如“硬件缩放器锻炼器”)所使用的方法。

如果你到了这个方法效率不够高的地步,那么可能是时候看看游戏引擎(可能是cocos2d-x?),而不是重新创建纹理映射轮。