2013-01-15 1 views
9

Sto lavorando a un gioco di carte e attualmente ho una buona base, ma sto correndo un errore quando lo eseguo in eclissi. Sto anche usando sdrucciolevole 2d.Nessun contesto OpenGL trovato nel thread corrente, come posso risolvere questo errore?

Ecco l'errore dalla console.

Exception in thread "main" java.lang.RuntimeException: No OpenGL contesto trovato nel thread corrente. a org.lwjgl.opengl.GLContext.getCapabilities (GLContext.java:124) a org.lwjgl.opengl.GL11.glGetError (GL11.java:1277) a org.newdawn.slick.opengl.renderer.ImmediateModeOGLRenderer. glGetError (ImmediateModeOGLRenderer.java:387) a org.newdawn.slick.opengl.InternalTextureLoader.getTexture (InternalTextureLoader.java:337) a org.newdawn.slick.opengl.InternalTextureLoader.getTexture (InternalTextureLoader.java:275) a org.newdawn.slick.Image. (Image.java:270) a org.newdawn.slick.Image. (Image.java:244) a org.newdawn.slick.Image. (Image.java:232) a org.newdawn.slick.Image. (Image.java:198) a Cards.Card. (Card.java: 18)

codice in cui credo che l'origine dell'errore da accadendo (classe carta)

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

Qualcuno ha visto questo tipo di problema prima? Come posso risolverlo?

risposta

10

Questo tipo di errore è comune per gli avviatori LWJGL. Il contesto OpenGL viene associato a un thread al momento della creazione. Quindi puoi accedere a questo contesto solo dallo stesso thread.

Poiché non sembra che si lavori con thread diversi, potrebbe esserci un'altra causa. Sembra che Slick2D abbia bisogno di un contesto OpenGL valido per la sua classe Image.

Quindi la prima cosa da fare sarebbe inizializzare un contesto OpenGL prima di inizializzare le immagini della scheda.

4

Questo mi è successo una volta, e non sono riuscito a capire cosa fare fino a quando non mi sono reso conto che stavo chiamando il caricatore di immagini prima dell'inizializzazione di OpenGL. Assicurati di non definire alcuna variabile con un caricatore di immagini nel costruttore (o con qualsiasi altro metodo chiamato) prima di OpenGL (cosa ho fatto).

Si sta definendo una classe Card prima che OpenGL sia inizializzato?

Spero che questo aiuti.

+1

Risposta chiara e concisa. Grazie! +1 –

2

Beh, quello che ho trovato è che avete bisogno di init vostro display prima di impostare l'ambiente di OpenGL:) ...

3

In 3.xe lwjgl e superiori, si può provare: GLContext.createFromCurrent();

Se si utilizza libgdx, esiste anche Gdx.app.postRunnable(...) per pubblicare un Runnable nel thread di rendering.

+0

La seconda soluzione funziona solo con libgdx, non con lwjgl (di cui tratta la domanda). – javac

+0

@javac Ottimo punto, soluzione aggiornata per menzionarlo. – EntangledLoops

2

Un thread precedente, ma potrebbe aiutare qualcuno. A seconda di quale LWJGL si sta utilizzando, init schermo:

LWJGL 3(utilizza 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, per lo più, dimenticare Display.create() :)

Problemi correlati