随机绘制的线条

时间:2014-06-23 08:22:20

标签: java user-interface lwjgl

我有一个奇怪的错误。我目前正在使用LWJGL在java中进行视频游戏来实现图形。我几乎可以做所有事情,但我发现一些非常奇怪的事情:95%的时候,我的GUI看起来就像它必须做的那样,剩下5%的部分线条都没有画出来。 我检查了是否必须读取必须绘制该行的代码部分。所以我无法弄清楚会发生什么。你知道怎么解决这个问题吗?

谢谢!

编辑: 我只是弄清楚我没有解释任何事情......所以为了使一切变得更容易,我尝试实现像awt包那样的GUI元素但是在LWJGL中。直到现在,我刚刚实现了Label,ProgressBar,Window和MainPanel(用于绘制GUI的背景)。

如下所示,ProgressBar和Label被放置在Window中,它将管理所有内容,即内部元素的位置和大小。因此,当我绘制窗口时,我同时在其中绘制所有内容:在我的情况下,ProgressBar和Label。对于Label,它始终显示,但ProgressBar不显示。因为我几乎可以肯定这个bug必须来自我的ProgressBar的绘图方法,所以我在帖子的最后有了它。

这是将在屏幕上绘制所有内容的类的代码: 公共类ConnectionDrawer实现InterfaceDrawer {

private boolean needUpdate = true;

private BlockingQueue<String> in; 

private ProgressBar bar;
private MainPanel background;
private Window load_window;
private Label text;

public ConnectionDrawer() {
    in = new LinkedBlockingQueue<String>();

    bar = new ProgressBar();
    bar.setBorderColor(1.0f, 1.0f, 1.0f, 1.0f);
    bar.setBarColor(1.0f, 0f, 0f, 1.0f);
    bar.setMaxValue(3);
    bar.setPadding(1);
    bar.setCurrentValue(0);
    ElementProperties prop_bar = new ElementProperties(
            ElementProperties.ABSOLUTE, ElementProperties.ABSOLUTE);
    prop_bar.setAbsoluteSize(280, 30);
    prop_bar.setAbsolutePosition(10, 40);

    text = new Label("Trying to connect to server...");
    text.setBorder(false);
    text.setSize(Label.MEDIUM);
    text.setColor(Color.white);
    text.setVerticalAlign(Label.TOP);
    text.setHorizontalAlign(Label.LEFT);
    ElementProperties prop_bar1 = new ElementProperties(
            ElementProperties.ABSOLUTE, ElementProperties.ABSOLUTE);
    prop_bar1.setAbsoluteSize(280, 30);
    prop_bar1.setAbsolutePosition(10, 5);

    background = new MainPanel();
    background
            .setBackground(GraphicController.getTextureLoader().cloudy_background);

    load_window = new Window();
    load_window.setBackgroundColor(0f, 0f, 0f, 0.5f);
    load_window.enableBackground(true);
    load_window.enableBorder(true);
    load_window.setBorderColor(0, 0, 0);
    load_window.addComponent(bar, prop_bar);
    load_window.addComponent(text, prop_bar1);
}

@Override
public void draw() {
    // TODO Auto-generated method stub
    GraphicController.getWindow().initGL2D();
    GL11.glColor3f(1.0f, 1.0f, 1.0f);

    if (needUpdate) {
        load_window.setDimension(300, 80);
        load_window.setPosition(Data.getActifResolution().getWidth() - 310,
                Data.getActifResolution().getHeight() - 90);
        needUpdate = false;
    }

    background.draw();
    GraphicController.getTextureLoader().white_text.bind();
    load_window.draw();

}

public void updateNeeded() {
    this.needUpdate = true;
}

@Override
public void checkKeyBoard() {
    // TODO Auto-generated method stub
    if (Display.isCloseRequested())
        GraphicController.getWindow().changeDone();
}

@Override
public void postMessage(Object obj) {
    // TODO Auto-generated method stub
    in.add((String) obj);
}

}

这是ProgressBar类的代码,每次都不会绘制:

public void draw() {
    System.out.println("Progress draw");

    //System.out.println(b_r+";"+b_g+";"+b_b+";"+b_a);
    GL11.glColor4f(b_r, b_g, b_b, b_a);
    GL11.glBegin(GL11.GL_LINES);
    {
        GL11.glVertex2f(x, y);
        GL11.glVertex2f(x + width, y);
        GL11.glVertex2f(x + width, y);
        GL11.glVertex2f(x + width, y + height);
        GL11.glVertex2f(x + width, y + height);
        GL11.glVertex2f(x, y + height);
        GL11.glVertex2f(x, y + height);
        GL11.glVertex2f(x, y);
    }
    GL11.glEnd();

    float ratio;
    if (max == 0 || current == 0) {
        System.out.println("Progress draw end");
        return;
    } else if (max == 0) {
        ratio = 0;
    } else {
        ratio = ((float) current) / ((float) max);
    }

    GL11.glColor4f(i_r, i_g, i_b, i_a);
    GL11.glBegin(GL11.GL_QUADS);
    {
        GL11.glVertex2f(x + pad_inside, y + pad_inside + 1);
        GL11.glVertex2f(x - 1 + ratio * width - pad_inside, y + pad_inside
                + 1);
        GL11.glVertex2f(x - 1 + ratio * width - pad_inside, y + height
                - pad_inside - 1);
        GL11.glVertex2f(x + pad_inside, y + height - pad_inside - 1);
    }
    GL11.glEnd();
}

1 个答案:

答案 0 :(得分:0)

因此,经过多次检查,我可以确定错误的来源。实际上,它来自于在屏幕上显示文本的类。我认为我需要做的就是在显示文本后禁用GL_TEXTURE_2D选项。