OpenGL上下文(libgdx)

时间:2015-04-06 08:23:19

标签: java opengl libgdx

所以我对LibGDX有一个问题,我正在创造一个有尖峰的游戏。

我创建了一个单独的类,其中包含一个每五秒运行一次的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)

3 个答案:

答案 0 :(得分:3)

我在使用多个线程进行一次网络时遇到了同样的问题。对于你想在具有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

答案 1 :(得分:1)

我不是线程专家,但是您可能忘记创建使用OpenGL所需的SpriteBatch

应该是这样的:

SpriteBatch batch = new SpriteBatch();

编辑: 好的,请看一下:The exact same problem

答案 2 :(得分: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);
        }
    });

}

你的错误会消失。然而,即使如此,尖峰也只会在屏幕上显示一帧。你真正需要在计时器中做的是将尖峰添加到你的游戏世界。然后在下一次渲染世界时,它将渲染尖峰。不幸的是,在不了解游戏世界的基础结构的情况下,我无法帮助你。

我希望这会有所帮助。