2012-04-27 59 views
1

我正在爲遊戲引擎的地圖編輯器開發一個基本的GUI。一切正常工作,除了程序只着色一些四邊形我想要的顏色(灰色),它着色其他一些黑色,我不明白爲什麼。 下面是問題的圖片。所有的四邊形按鈕都應該是灰色的,但它們不是。LWJGL&Slick Coloring Quads Error

Image of problem

這裏是我的代碼,吸引了他們。

import static org.lwjgl.opengl.GL11.*; 

import java.awt.Font; 
import java.nio.ByteBuffer; 
import java.nio.ByteOrder; 
import java.nio.FloatBuffer; 
import java.util.ArrayList; 
import java.util.EventListener; 
import java.util.EventObject; 
import java.util.List; 

import org.newdawn.slick.Color; 
import org.newdawn.slick.geom.Vector2f; 
import org.newdawn.slick.opengl.Texture; 

public class MapEditorUI 
{ 
private int cols; 
private float dHeight, dWidth, bHeight, bWidth; 
private Color backgroundColor; 
private Vector2f startPos; 
private Vector2f borderStartPos; 
private GUI editorGUI = new GUI(); 

public GUI.Element clickedElement; 

MapEditorUI() 
{ 
    //int width = 70, xStart = 800, yStart = 330, height = 20; 

    editorGUI.addElement(0, new Vector2f(910, 330), new Vector2f(1020, 350), "Fill Layer"); 
    editorGUI.addElement(0, new Vector2f(910, 360), new Vector2f(1020, 380), "Clear Layer"); 

    editorGUI.addElement(0, new Vector2f(800, 330), new Vector2f(870, 350), "Ground"); 
    editorGUI.addElement(0, new Vector2f(800, 360), new Vector2f(870, 380), "Mask"); 
    editorGUI.addElement(0, new Vector2f(800, 390), new Vector2f(870, 410), "Mask2"); 
    editorGUI.addElement(0, new Vector2f(800, 420), new Vector2f(870, 440), "Fringe"); 
    editorGUI.addElement(0, new Vector2f(800, 450), new Vector2f(880, 470), "Fringe2"); 


} 

public void initUI(int cols, Color color) 
{ 
    this.cols = cols; 
    this.backgroundColor = color; 
} 

public void setLoc(float startX, float startY, float width, float height) 
{ startPos = new Vector2f(startX, startY); dHeight = height; dWidth = width; } 
public void setBorderLocs(float borderStartX, float borderStartY, float width, float height) 
{ borderStartPos = new Vector2f(borderStartX, borderStartY); bWidth = width; bHeight = height; } 

public void draw() 
{ 
    glDisable(GL_TEXTURE_2D); 

    drawBackground(); 
    drawBorder(); 
    editorGUI.draw(); 
} 

public boolean checkMouseInUI(float x, float y) 
{ 
    if(x > startPos.x && y > startPos.y) 
     return true; 
    else if(x < borderStartPos.x && x > borderStartPos.x + bWidth) 
     return true; 

    return false; 
} 

public int doMouseActions(float x, float y) 
{ 
    clickedElement = editorGUI.checkClick(x, y); 
    if(clickedElement != null) // Something was actually clicked 
    { 
//   System.out.println("CLICKED: " + clickedElement.text); 
     return 0; // Element Clicked, have main class handle it from there 
    } 
    return -1; 
} 

private void drawBorder() 
{ 
    backgroundColor.bind(); 
    glBegin(GL_QUADS); 
     glVertex2f(borderStartPos.x, borderStartPos.y); 
     glVertex2f(borderStartPos.x + bWidth, borderStartPos.y); 
     glVertex2f(borderStartPos.x + bWidth, borderStartPos.y + bHeight); 
     glVertex2f(borderStartPos.x, borderStartPos.y + bHeight); 
    glEnd(); 
} 

private void drawBackground() 
{ 
    backgroundColor.bind(); 
    glBegin(GL_QUADS); 
     glVertex2f(startPos.x, startPos.y); 
     glVertex2f(startPos.x + dWidth, startPos.y); 
     glVertex2f(startPos.x + dWidth, startPos.y + dHeight); 
     glVertex2f(startPos.x, startPos.y + dHeight); 
    glEnd(); 
} 


class GUI 
{ 
    private Text guiText = new Text(); 
    private List<Element> Elements = new ArrayList<Element>(); 

    GUI() 
    { 
     guiText.init("Courier", Font.PLAIN, 16); 
    } 

    public Element checkClick(float x, float y) 
    { 
     for(Element i : Elements) 
     { 
      if(i != null) 
      { 
       if(i.checkClick(x, y) == true) 
       { 
        i.clicked(); 
        return i; 
       } 
      } 
     } 

     return null; 
    } 

    public void draw() 
    { 
     for(Element i : Elements) 
     { 
      if(i != null) 
       i.draw();  
     } 
    } 

    public void addElement(int type, Vector2f startPos, Vector2f endPos, String text) 
    {Elements.add(new Element(type, startPos, endPos, text));} 
    public void addElement(int type, Vector2f startPos, Vector2f endPos, String text, Color buttonBackgroundColor) 
    {Elements.add(new Element(type, startPos, endPos, text, buttonBackgroundColor));} 

    class Element 
    { 
     public int type; 
     private Vector2f startPos, endPos; 
     public String text; 
     private byte state; 
     private long timeClick; 
     private Color buttonColor; 

     Element(int type, Vector2f startPos, Vector2f endPos, String text) 
     {this.type = type; this.startPos = startPos; this.endPos = endPos; this.text = text;} 
     Element(int type, Vector2f startPos, Vector2f endPos, String text, Color buttonColor) 
     {this.type = type; this.startPos = startPos; this.endPos = endPos; this.text = text; this.buttonColor = buttonColor;} 

     public void draw() 
     { 
      checkTime(); 

      switch(type) 
      { 
      case 0: // Button 

       switch(state) 
       { 
       case 0: // Unclicked 
//      if(buttonColor != null) 
//       buttonColor.bind(); 
//      else 
         Color.gray.bind(); 
        break; 

       case 1: // Clicked 
//      if(buttonColor != null) 
//       new Color(buttonColor.r-50, buttonColor.g-50, buttonColor.b-50).bind(); 
//      else 
         Color.red.bind(); 
        break; 
       } 

//     Color.green.bind(); 


//     System.out.println(glGetFloat(GL_CURRENT_COLOR)[2]); 
       float Minv[]=new float[16]; 
       ByteBuffer temp = ByteBuffer.allocateDirect(64); 
       temp.order(ByteOrder.nativeOrder()); 
       glGetFloat(GL_MODELVIEW_MATRIX, (FloatBuffer)temp.asFloatBuffer()); 
       temp.asFloatBuffer().get(Minv); 

       for(int i = 0; i < 16; ++i) 
        System.out.println(text + "| " + i + ": " + Minv[i]); 

       glBegin(GL_QUADS); 
        glVertex2f(startPos.x, startPos.y); 
        glVertex2f(endPos.x, startPos.y); 
        glVertex2f(endPos.x, endPos.y); 
        glVertex2f(startPos.x, endPos.y); 
       glEnd(); 

       guiText.drawString(startPos.x + 2, startPos.y - 2, text, Color.white); 
       glDisable(GL_BLEND); 
       break; 
      } 
     } 

     private void checkTime() 
     { 
      long curTime = System.currentTimeMillis(); 
      long timePassed = curTime - timeClick; 

      if(timePassed > 50) 
       state = 0; 
     } 

     public boolean checkClick(float x, float y) 
     { 
      if((x > startPos.x && y > startPos.y) && (x < endPos.x && y < endPos.y)) 
      { 
       return true; 
      } 

      return false; 
     } 

     public void clicked() 
     { 
      timeClick = System.currentTimeMillis(); 
      state = 1; // Clicked 
     } 

     public void setType(int type) 
     {this.type = type;} 

     public void setButtonColor(Color buttonColor) 
     {this.buttonColor = buttonColor;} 
    } 
} 
} 

這裏是我的代碼drawString之:

public void drawString(float x, float y, String text, Color color) 
{ 
    // Make sure alpha blending is enabled, it might not be 
    glEnable(GL_BLEND); 
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 

    font.drawString(x, y, text, color); 
} 

回答

1

您的font.drawString();之前必須glEnable(GL_TEXTURE_2D);,和之後glDisable(GL_TEXTURE_2D);