2013-01-15 9 views
9

Ich arbeite an einem Kartenspiel, und habe derzeit eine gute Grundlage, aber ich bekomme einen Fehler, wenn ich es in Eclipse ausführen. Ich benutze auch Slick 2d.Kein OpenGL-Kontext im aktuellen Thread gefunden, wie behebe ich diesen Fehler?

Hier ist der Fehler von der Konsole.

Exception in thread "main" java.lang.RuntimeException: No OpenGL Kontext in dem aktuellen Thread gefunden. bei org.lwjgl.opengl.GLContext.getCapabilities (GLContext.java:124) bei org.lwjgl.opengl.GL11.glGetError (GL11.java:1277) bei org.newdawn.slick.opengl.renderer.ImmediateModeOGLRenderer. glGetError (ImmediateModeOGLRenderer.java:387) bei org.newdawn.slick.opengl.InternalTextureLoader.getTexture (InternalTextureLoader.java:337) bei org.newdawn.slick.opengl.InternalTextureLoader.getTexture (InternalTextureLoader.java:275) bei org.newdawn.slick.Image. (Image.java:270) um org.newdawn.slick.Image. (Image.java:244) um org.newdawn.slick.Image. (Image.java:232) um org.newdawn.slick.Image. (Image.java:198) um ​​ Cards.Card. (Card.java: 18)

-Code, wo ich die Quelle des Fehlers glauben werden auftritt (Karten-Klasse)

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]; 
    } 
} 

jemand hat vor dieser Art von Problem gesehen? Wie kann ich es lösen?

Antwort

10

Diese Art von Fehler ist für LWJGL-Starter üblich. Der OpenGL-Kontext wird an einen Thread gebunden, wenn er erstellt wurde. Sie können also nur aus demselben Thread auf diesen Kontext zugreifen.

Da es nicht so aussieht, dass Sie mit verschiedenen Threads arbeiten, könnte es eine andere Ursache geben. Slick2D scheint einen gültigen OpenGL-Kontext für seine Klasse Image zu benötigen.

Also mein erster Versuch wäre, einen OpenGL-Kontext zu initialisieren, bevor Sie Ihre Kartenbilder initialisieren.

4

Das ist mir einmal passiert, und ich konnte nicht herausfinden, was zu tun ist, bis ich merkte, dass ich den Image Loader aufruft, bevor OpenGL initialisiert wurde. Stellen Sie sicher, dass Sie keine Variablen mit einem Image-Loader im Konstruktor (oder einer anderen aufgerufenen Methode) vor OpenGL-Eingaben definieren (was ich getan habe).

Definieren Sie eine Klasse Card, bevor OpenGL initialisiert wird?

Hoffe, das hilft.

+1

Klare, knappe Antwort. Vielen Dank! +1 –

2

Nun, gefunden, was ich habe, ist, dass Sie Ihre Anzeige init müssen, bevor Sie Ihre OpenGL-Umgebung gesetzt:) ...

3

In lwjgl 3.x und höher, können Sie versuchen: GLContext.createFromCurrent();

Wenn Sie libgdx verwenden, gibt es auch Gdx.app.postRunnable(...), um einen Runnable auf dem Render-Thread zu veröffentlichen.

+0

Die zweite Lösung funktioniert nur mit libgdx, nicht mit lwjgl (worum die Frage geht). – javac

+0

@javac Guter Punkt, aktualisierte Lösung, um das zu erwähnen. – EntangledLoops

2

Ein alter Thread, aber es könnte jemandem helfen. Je nachdem, welche LWJGL Sie verwenden, init Ihre Anzeige:

LWJGL 3(verwendet 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); 
} 

I, meistens, vergiss Display.create() :)