0

我正在使用 JOGL 创建一个游戏,但遇到了一个我终生无法弄清楚的错误。

在游戏中,我使用了两个 GLCanvases(实际上是 GLJpanels),一个用于菜单,一个用于实际游戏。这个想法是,当从菜单启动游戏时,菜单 GLCanvas 会从游戏窗口中删除并换成游戏 GLCanvas。到目前为止,我已经让菜单工作得非常完美,但是每当我尝试切换到游戏画布时,我都会收到此错误:

Catched Exception on thread AWT-EventQueue-0
javax.media.opengl.GLException: AWT-EventQueue-0: Context not current on thread, obj 0x2ab44e2d, ctx 0x0, surf 0x0, inDestruction: false, <53f7c06e, 2e7aa0d3>[count 0, qsz 0, owner <NULL>]

我用来在画布之间切换的代码是:

public void start()
{
    canvas.addGLEventListener(this);
    animator.start();
    window.add(canvas);
    canvas.requestFocus();
}
public void stop()
{
    window.remove(canvas);
    animator.stop();
    canvas.removeGLEventListener(this);
}

和开关功能:

public void switchToCanvas(String canvasName)
{
    currentCanvas = canvasName;

    if(canvasName.equals("GameCanvas"))
    {
        menu.stop();
        game.start();
    }
    else
    {
        game.stop();
        menu.start();
    }
}

我做了一些谷歌搜索,我遇到了这个问题:如何创建自己的 openGL 上下文并将其绑定到 GLCanvas?

但是那里发布的解决方案都没有对我有用。

4

1 回答 1

1

起初,我宁愿使用单个 GLCanvas 而不是 2 个 GLJPanel 实例。GLJPanel 具有更高的内存占用,并且仅应在无法使用 GLWindow 或 AWT/SWT GLCanvas 时使用,当混合重量级和轻量级组件存在一些问题时。

其次,您的错误消息意味着该线程上没有当前的 OpenGL 上下文。您应该使用 GLAutoDrawable.invoke() 将 OpenGL 任务放入队列,或者您应该在需要时将上下文设为当前。我建议您查看 jogl-demos 以了解我们如何在示例中做到这一点。

编辑:可以在官方论坛 ( http://forum.jogamp.org/ ) 和 IRC上轻松联系包括我在内的 JogAmp 维护者。

于 2014-02-06T21:59:42.337 回答