OpenGL 上下文 (libgdx)
OpenGL context (libgdx)
所以我遇到了 LibGDX 的问题,我正在创建一个有尖峰的游戏。
我创建了一个单独的 class,其中包含一个 运行 方法,该方法每五秒 运行 一次。
我想 运行 另一个方法 class 并在屏幕上创建一个新的尖峰。
因为我有一个新帐户,所以我不能post 图片。
但这是为了定时器的初始化:
@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);
}
这就是每五个 seconds/the 计时器循环发生的情况:
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)
好的,看看这个:The exact same problem
我曾经在使用多线程联网时遇到过同样的问题。对于您想在具有 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
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 的问题,我正在创建一个有尖峰的游戏。
我创建了一个单独的 class,其中包含一个 运行 方法,该方法每五秒 运行 一次。
我想 运行 另一个方法 class 并在屏幕上创建一个新的尖峰。
因为我有一个新帐户,所以我不能post 图片。
但这是为了定时器的初始化:
@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);
}
这就是每五个 seconds/the 计时器循环发生的情况:
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)
好的,看看这个:The exact same problem
我曾经在使用多线程联网时遇到过同样的问题。对于您想在具有 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
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);
}
});
}
你的错误就会消失。然而,尖峰只会在屏幕上显示一帧,即使是那样。您真正需要在计时器中做的是将尖峰添加到您的游戏世界中。然后在下一次渲染世界时,它将渲染尖峰。不幸的是,如果我不了解你的游戏世界的底层结构,我无法帮助你。
希望对您有所帮助。