在当前线程中找不到OpenGL上下文,如何修复此错误?

时间:2013-01-15 21:32:52

标签: java opengl lwjgl slick2d

我正在制作纸牌游戏,目前有一个很好的基础,但是当我在eclipse中运行它时遇到了错误。我也使用光滑的2d。

以下是控制台的错误。

  

线程“main”中的异常java.lang.RuntimeException:没有OpenGL   在当前线程中找到的上下文。在   或者.gwon。   org.lwjgl.opengl.GL11.glGetError(GL11.java:1277)at at   org.newdawn.slick.opengl.renderer.ImmediateModeOGLRenderer.glGetError(ImmediateModeOGLRenderer.java:387)     在   org.newdawn.slick.opengl.InternalTextureLoader.getTexture(InternalTextureLoader.java:337)     在   org.newdawn.slick.opengl.InternalTextureLoader.getTexture(InternalTextureLoader.java:275)     在org.newdawn.slick.Image。(Image.java:270)at   org.newdawn.slick.Image。(Image.java:244)at   org.newdawn.slick.Image。(Image.java:232)at   org.newdawn.slick.Image。(Image.java:198)at   Cards.Card。(Card.java:18)

代码,我相信发生错误的来源(卡类)

package Cards;
import org.newdawn.slick.Image;
import org.newdawn.slick.SlickException;
public class Card
{
    final int numCards = 52;
    Image[] card = new Image [numCards];
    Card (int c)
    {
        String fileLocation = new String ();
        for (int i = 1 ; i <= 52 ; i++)
        {
            fileLocation = "res/cards/" + i + ".png";
            try 
            {

                card [i] = new Image (fileLocation); //line
            }
            catch (SlickException e)
            {
                e.printStackTrace ();
            }
        }
    }
    public Image getImage (int cardlocation)
    {
        return card [cardlocation];
    }
}

以前有人见过这种问题吗?我该如何解决?

5 个答案:

答案 0 :(得分:10)

这种错误在LWJGL初学者中很常见。 OpenGL上下文在创建时绑定到一个线程。因此,您只能从同一个线程访问此上下文。

因为看起来你不是在使用不同的线程,所以可能还有其他原因。 Slick2D似乎需要为其Image类提供有效的OpenGL上下文。

所以我的第一次尝试是在初始化卡片图像之前初始化OpenGL上下文。

答案 1 :(得分:4)

这件事发生在我身上,直到我意识到在OpenGL初始化之前我正在调用图像加载器之前,我无法弄清楚要做什么。在OpenGL inits(我做了什么)之前,确保你没有在构造函数(或任何其他调用的方法)中使用图像加载器定义任何变量。

您是否在初始化OpenGL之前定义了Card类?

希望这有帮助。

答案 2 :(得分:4)

在lwjgl 3.x及更高版本中,您可以尝试:     GLContext.createFromCurrent();

如果你正在使用libgdx,还有Gdx.app.postRunnable(...)在渲染线程上发布Runnable

答案 3 :(得分:2)

嗯,我发现你需要在设置OpenGL环境之前初始化你的显示器:)...

答案 4 :(得分:2)

一个旧线程,但它可能对某人有帮助。 根据您使用的LWJGL,启动显示:

LWJGL 3 (使用GLFW)

if (!glfwInit()) {
   throw new IllegalStateException("Can't init GLFW");
}

LWJGL 2

try {
   Display.setDisplayMode(new DisplayMode(800, 600));
   Display.create();
} catch (LWJGLException ex) {
   Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
}

我,大多数情况下,忘了 Display.create():)