我正在使用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();
    }
}


我做了一些谷歌搜索,然后遇到了这个问题:How can I create my own openGL context and bind it to a GLCanvas?

但是那里发布的所有解决方案都不适合我。

最佳答案

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

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

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

10-01 20:38