2015-04-06 75 views
0

所以我有一個LibGDX的問題,我正在創建一個有尖峯的遊戲。OpenGL上下文(libgdx)

我創建了一個單獨的類,其中包含一個每5秒運行一次的run方法。

我想從另一個類運行一個方法,並在屏幕上創建一個新的尖峯。

由於我有一個新帳戶,我無法發佈圖片。

但是,這是定時器初始化:

@Override 
public void create() 
{ 


    timer = new Timer(); 

    timer.schedule(new SpikeHandler(), 0, 5000); 


} 

這是爲建立一個秒殺方法:

public static void createNewSpike(int x, int y) 
{ 

    sb.draw(spike.spikeLeft, x, y); 

} 

這是每五秒鐘會發生什麼/定時器循環:

public class SpikeHandler extends TimerTask 
{ 

public Random rand = new Random(); 

@Override 
public void run() 
{ 

    if(GameStateManager.getState() == GameState.Playing && GameScreen.hasCountdowned == true) 
    { 
     GameScreen.sb.begin(); 

     GameScreen.createNewSpike(rand.nextInt(150), rand.nextInt(150)); 

     GameScreen.sb.end(); 
    } 


} 
} 

這是我收到錯誤消息:

Exception in thread "Timer-0" java.lang.RuntimeException: No OpenGL context found in the current thread. 
    at org.lwjgl.opengl.GLContext.getCapabilities(GLContext.java:124) 
    at org.lwjgl.opengl.GL11.glDepthMask(GL11.java:1157) 
    at com.badlogic.gdx.backends.lwjgl.LwjglGL20.glDepthMask(LwjglGL20.java:256) 
    at com.badlogic.gdx.graphics.g2d.SpriteBatch.begin(SpriteBatch.java:163) 
    at com.fam.dodge.SpikeHandler.run(SpikeHandler.java:17) 
    at java.util.TimerThread.mainLoop(Unknown Source) 
    at java.util.TimerThread.run(Unknown Source) 

回答

1

LibGDX使用OpenGL繪製東西。在OpenGL中,只有一個線程被允許使用圖形資源,即創建紋理,將東西繪製到屏幕上。所以錯誤被拋出,因爲你試圖從Timer-0線程繪製尖峯而不是渲染線程。你可以通過使用Application.postRunnable()方法來擺脫錯誤。如果您要將createNewSpike方法更改爲

public static void createNewSpike(int x, int y) 
{ 
    Application.postRunnable(new Runnable(){ 
     public void run(){ 
      sb.draw(spike.spikeLeft, x, y); 
     } 
    }); 

} 

您的錯誤將消失。然而,只有在一幀畫面上纔會顯示尖峯,即使是這樣。在計時器中你真正需要做的是在你的遊戲世界中添加尖峯。然後,世界下一次渲染它會渲染高峯。不幸的是,如果不知道遊戲世界的基本結構,我無法幫助你。

我希望這會有所幫助。

+1

如果使用postRunnable,可能會彈出另一個錯誤,因爲沒有活動的批處理。無論如何,更大的問題是,你只是試圖繪製它,而不是實際創造一個新的高峯。 – Bogoth 2016-01-09 22:17:24

1

我不是專家的線程,但也許你忘了創建SpriteBatch您正在使用哪些是需要使用OpenGL繪製?

應該是這個樣子:

SpriteBatch batch = new SpriteBatch(); 

編輯: 好吧,看看這個:The exact same problem

+0

我真的不明白這個帖子,即時通訊新的java/libgdx編程。但是你說我需要輸入這個:\t \t GLContext.createFromCurrent();在我的線程之前? – Dumbostyle 2015-04-06 11:14:31

2

我使用多線程聯網,一旦有同樣的問題。對於希望擁有OpenGL上下文(任何圖形操作涉及的OpenGL)的線程裏面做的一切使用:

Gdx.app.postRunnable(new Runnable() { 
     @Override 
     public void run() { 
      // do stuff here 
     } 
}); 
你的情況

這將包括:

GameScreen.sb.begin(); 
GameScreen.createNewSpike(rand.nextInt(150), rand.nextInt(150)); 
GameScreen.sb.end(); 

如果你想請進一步閱讀關於如何執行多線程從libGDX文檔中讀取此內容: Libgdx - Threading

+0

我在使用您建議的代碼時出現語法錯誤。這裏是我的代碼:Gdx.app.postRunnable(新的Runnable(){@Override 公共 無效的run(){ \t如果(GameStateManager.getState()== GameState.Playing && GameScreen.hasCountdowned ==真) \t \t { \t \t \t GameScreen.sb.begin(); \t \t \t \t \t GameScreen.createNewSpike(rand.nextInt(150),rand.nextInt(150)); \t \t \t GameScreen.sb.end();\t GameScreen.sb.end(); } } }); }我得到postRunnable的語法錯誤,「=」預期和錯位標記 – Dumbostyle 2015-04-06 11:46:26

+0

你在哪裏放置代碼?我認爲在你的情況下,你需要把它放到Spikehandler類的運行方法中。 – Bernd 2015-04-06 12:39:42

+0

這是代碼如何放置:\t Gdx.app.postRunnable(新的Runnable(){@Override 公共 無效的run(){ \t如果(GameStateManager.getState()== GameState.Playing && GameScreen.hasCountdowned == TRUE) \t \t { \t \t \t GameScreen.sb.begin(); \t \t \t \t \t GameScreen.createNewSpike(rand.nextInt(150),rand.nextInt(150)); \t \t \t \t \t GameScreen.sb.end(); \t \t \t} } }); }我得到的只是語法錯誤.. – Dumbostyle 2015-04-06 12:50:08