【问题标题】:OpenGL context (libgdx)OpenGL 上下文 (libgdx)
【发布时间】:2015-04-06 08:23:19
【问题描述】:

所以我对 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)

【问题讨论】:

    标签: java opengl libgdx


    【解决方案1】:

    我曾经使用多个线程进行联网时遇到了同样的问题。对于您想要在具有 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

    【讨论】:

    • 我在使用您建议的代码时遇到语法错误。这是我的代码: Gdx.app.postRunnable(new Runnable() { @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(); } } });我收到 postRunnable 语法错误,“=”预期和错放的标记
    • 你把代码放在哪里了?我认为在您的情况下,您需要将其放入 Spikehandler 类的 run 方法中。
    • 代码是这样放置的: Gdx.app.postRunnable(new Runnable() { @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(); } } });我得到的只是语法错误..
    【解决方案2】:

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

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

    我希望这会有所帮助。

    【讨论】:

    • 如果您使用 postRunnable,可能会弹出另一个错误,因为没有活动批处理。无论如何,更大的问题是您只是在尝试绘制它而不是实际创建一个新的尖峰。
    【解决方案3】:

    好的,看看这个:The exact same problem

    【讨论】:

    • 我不太明白那篇文章,我是 java/libgdx 编程的新手。但是你是说我需要输入这个: GLContext.createFromCurrent();在我的线程之前?
    猜你喜欢
    • 1970-01-01
    • 2015-06-24
    • 1970-01-01
    • 2015-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-23
    相关资源
    最近更新 更多