2011-11-27 21 views
3

是否有人會分享一個關於如何實現GradienRectangle的例子,該GradienRectangle對每個頂點都有不同的顏色?如何在AndEngine Rectangle類中實現glColorPointer

我試圖從GL10調用glColorPointer傳遞float緩衝區和GL11使用類似於頂點selectOnHardware方法,但是這兩種方法失敗對我來說...

在AndEngine論壇上,我發現this code,但它不工作,然而maby它會幫助某人找到更好的解決方案。

+0

你得到了什麼具體的錯誤/例外?是沒有顯示的元素,還是你得到編譯/運行時錯誤? – Codeman

+0

一切都是黑色的,沒有顏色... – michael

+0

@michael我不知道如何發送下午在這個網站上,但你可以在這個http://stackoverflow.com/questions/9698997/add-visual-below-手指輕掃三角帶狀水果忍者andengine –

回答

3

該示例不適用於您,因爲作者未顯示負責設置頂點的代碼片段。

這是我的例子(它很長,但那是opengl ...) 注意 - 請記住要正確設置視口。

public static void drawGradientRectangle(GL10 gl, float centerX, float centerY, 
      float width, float height) { 
     gl.glPushMatrix(); 
     gl.glDisable(GL10.GL_TEXTURE_2D); 
     gl.glEnableClientState(GL10.GL_COLOR_ARRAY); 
     gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); //just in case if you have not done that before 
     gl.glFrontFace(GL10.GL_CCW); //Set the face 

     gl.glTranslatef(centerX, centerY, 0); 
     if (width != 1 || height != 1) { 
      gl.glScalef(width, height, 1); 
     } 
     gl.glVertexPointer(2, GL10.GL_FLOAT, 0, GLDrawConstants.vertexBuffer0_5); 
     gl.glColorPointer(4, GL10.GL_FLOAT, 0, GLDrawConstants.gradOrangeWhiteBuffer); 

     // Draw the vertices as triangle strip 
     gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4); 

     gl.glDisableClientState(GL10.GL_COLOR_ARRAY); 
     gl.glEnable(GL10.GL_TEXTURE_2D); 
     gl.glPopMatrix(); 
    } 

GLDrawConstants類:

public class GLDrawConstants { 

    public static final FloatBuffer gradOrangeWhiteBuffer; 
    public static final FloatBuffer vertexBuffer0_5; 

private static final float vertices0_5[] = { 
     -0.5f, -0.5f,// Bottom Left 
     0.5f, -0.5f,// Bottom right 
     -0.5f, 0.5f,// Top Left 
     0.5f, 0.5f// Top Right 
    }; 

private static final float gradOrangeWhiteColor[] = { 
     255/255f, 239/255f, 196/255f, 0f, // Bottom Left 
     255/255f, 239/255f, 196/255f, 0f, // Bottom right 
     250/255f, 200/255f, 62/255f, 0.3f, // Top Left 
     250/255f, 200/255f, 62/255f, 0.3f // Top Right 
    }; 

static { 
     gradOrangeWhiteBuffer = WDUtils.floatBuffer(gradOrangeWhiteColor); 
     vertexBuffer0_5 = WDUtils.floatBuffer(vertices0_5); 
} 

} 

WDUtils類:

public class WDUtils { 
    /** 
    * Make a direct NIO FloatBuffer from an array of floats 
    * 
    * @param arr 
    *   The array 
    * @return The newly created FloatBuffer 
    */ 
    public static final FloatBuffer floatBuffer(float[] arr) { 
     ByteBuffer bb = ByteBuffer.allocateDirect(arr.length * 4); 
     bb.order(ByteOrder.nativeOrder()); 
     FloatBuffer fb = bb.asFloatBuffer(); 
     fb.put(arr); 
     fb.position(0); 
     return fb; 
    } 
} 

example on my phone

+0

嗨,感謝您的答案,但你確定這將在AndEngine內工作,因爲這是我對這個引擎的問題,我發現了很多例子來做它在opengl中,但他們都不能移動到AndEngine的細節。這是我的問題:如何在AndEngine中實現它,而不是如何在一般情況下實現它。 – michael

+0

AndEngine使用OpenGL,所以它應該在那裏工作很小的調整..你試過嗎? – Yuriy

+0

我做了,它的工作,謝謝,我認爲,以前我一直在調用glColorPointer與第一個參數3而不是4,它通常使一切都不起作用。謝謝 – michael

0

或者你使用(或反向移植)從GLES2-AnchorCenter分支Gradient類,它給你一個超級簡單易用且功能豐富的API wi不用擔心OpenGL。 =)