0

私は JOGL でゲームを作成していますが、私の人生では理解できないエラーに遭遇しました。

ゲームでは、2 つの GLCanvases (実際には GLJpanels) を使用しています。1 つはメニュー用で、もう 1 つは実際のゲーム用です。ゲームがメニューから開始されると、メニュー 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

最初は、GLJPanel の 2 つのインスタンスではなく、単一の GLCanvas を使用したいと思います。GLJPanel はメモリ フットプリントが大きいため、GLWindow または AWT/SWT GLCanvas を使用できない場合、または重量コンポーネントと軽量コンポーネントの混合に問題がある場合にのみ使用してください。

次に、エラー メッセージは、このスレッドに最新の OpenGL コンテキストがないことを意味します。GLAutoDrawable.invoke() を使用して OpenGL タスクをキューに入れるか、必要なときにコンテキストを最新にする必要があります。jogl-demos を見て、例でどのようにそれを行っているかを確認することをお勧めします。

編集: 私を含む JogAmp のメンテナーは、公式フォーラム ( http://forum.jogamp.org/ ) および IRC で簡単に連絡できます。

于 2014-02-06T21:59:42.337 に答える