2014-03-06 58 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?),而不是重新創建紋理映射輪。