Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java OpenGL上下文(libgdx)_Java_Opengl_Libgdx - Fatal编程技术网

Java OpenGL上下文(libgdx)

Java OpenGL上下文(libgdx),java,opengl,libgdx,Java,Opengl,Libgdx,所以我对LibGDX有一个问题,我正在创建一个有尖峰的游戏 我创建了一个单独的类,其中包含一个每五秒钟运行一次的run方法 我想从另一个类运行一个方法,并在屏幕上创建一个新的spike 因为我有一个新帐户,所以我不能发布图片 但这是用于初始化计时器的: @Override public void create () { timer = new Timer(); timer.schedule(new SpikeHandler(), 0, 5000); } 这是用于创建尖

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

我创建了一个单独的类,其中包含一个每五秒钟运行一次的run方法

我想从另一个类运行一个方法,并在屏幕上创建一个新的spike

因为我有一个新帐户,所以我不能发布图片

但这是用于初始化计时器的:

@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)

我不是一个线程专家,但也许你忘了创建你正在使用的
SpriteBatch
,这是用OpenGL绘图所需要的

应该是这样的:

SpriteBatch batch = new SpriteBatch();
编辑:
好的,看看这个:

我不是线程专家,但是你可能忘了创建你正在使用的
SpriteBatch
,这是用OpenGL绘制所需要的

应该是这样的:

SpriteBatch batch = new SpriteBatch();
编辑:
好的,看看这个:

我曾经在使用多个线程进行网络连接时遇到过同样的问题。对于要在具有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文档:

我曾经在使用多个线程进行网络连接时遇到过同样的问题。对于要在具有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使用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);
        }
    });

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


我希望这有点帮助

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

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


我希望这有点帮助

我真的不懂那篇文章,我是java/libgdx编程新手。但你是说我需要键入:GLContext.createFromCurrent();在我的线程之前?我真的不理解那篇文章,我是java/libgdx编程新手。但你是说我需要键入:GLContext.createFromCurrent();在我的线程之前?我在使用你建议的代码时出现语法错误。这是我的代码:Gdx.app.postRunnable(new Runnable(){@Override public void run(){if(GameStateManager.getState()==GameState.Playing&&GameScreen.hasCountdowned==true){GameScreen.sb.begin();gamescreatenewspike(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();}}}}}}}我得到的只是语法错误..我在使用您建议的代码时出现语法错误。这是我的代码:Gdx.app.postRunnable(new Runnable(){@Override public void run(){if(GameStateManager.getState()==GameState.Playing&&GameScreen.hasCountdowned==true){GameScreen.sb.begin();gamescreatenewspike(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();}}}}}}}我得到的只是synt