我有一个奇怪的错误。我目前正在使用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();
}
答案 0 :(得分:0)
因此,经过多次检查,我可以确定错误的来源。实际上,它来自于在屏幕上显示文本的类。我认为我需要做的就是在显示文本后禁用GL_TEXTURE_2D选项。