I'm using LibGDX 1.7.0 with Android Studio.
I wrote simple game, it can run both on Android and Windows. I also wrote a level editor for it, which is supposed to run on desktop. Both applications work perfectly, except for launching a game from editor's level. I'd like to be able to immediately test changes I've made in editor by a single click on "Test" button. Unfortunately, I get this:
LwjglApplication: Couldn't initialize audio, disabling audio
java.lang.IllegalStateException: Only one OpenAL context may be instantiated at any one time.
at org.lwjgl.openal.AL.create(AL.java:113)
at org.lwjgl.openal.AL.create(AL.java:102)
at org.lwjgl.openal.AL.create(AL.java:206)
at com.badlogic.gdx.backends.lwjgl.audio.OpenALAudio.<init>(OpenALAudio.java:72)
at com.badlogic.gdx.backends.lwjgl.LwjglApplication.<init>(LwjglApplication.java:83)
at com.badlogic.gdx.backends.lwjgl.LwjglApplication.<init>(LwjglApplication.java:64)
at com.paijan.graviter.desktop.DesktopLauncher.launch(DesktopLauncher.java:15)
at com.paijan.graviter.desktop.editor.Toolbar$1.touchDown(Toolbar.java:65)
at com.badlogic.gdx.scenes.scene2d.InputListener.handle(InputListener.java:56)
at com.badlogic.gdx.scenes.scene2d.Actor.notify(Actor.java:181)
at com.badlogic.gdx.scenes.scene2d.Actor.fire(Actor.java:152)
at com.badlogic.gdx.scenes.scene2d.Stage.touchDown(Stage.java:277)
at com.badlogic.gdx.backends.lwjgl.LwjglInput.processEvents(LwjglInput.java:303)
at com.badlogic.gdx.backends.lwjgl.LwjglApplication.mainLoop(LwjglApplication.java:207)
at com.badlogic.gdx.backends.lwjgl.LwjglApplication$1.run(LwjglApplication.java:120)
Exception in thread "LWJGL Application" 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.glGetError(GL11.java:1299)
at org.lwjgl.opengl.Util.checkGLError(Util.java:57)
at org.lwjgl.opengl.WindowsContextImplementation.setSwapInterval(WindowsContextImplementation.java:113)
at org.lwjgl.opengl.ContextGL.setSwapInterval(ContextGL.java:232)
at org.lwjgl.opengl.DrawableGL.setSwapInterval(DrawableGL.java:86)
at org.lwjgl.opengl.Display.setSwapInterval(Display.java:1129)
at org.lwjgl.opengl.Display.setVSyncEnabled(Display.java:1142)
at com.badlogic.gdx.backends.lwjgl.LwjglGraphics.setVSync(LwjglGraphics.java:503)
at com.badlogic.gdx.backends.lwjgl.LwjglApplication$1.run(LwjglApplication.java:118)
Then I learned that you can force things to be called in render thread by posting a Runnable. I did it and it didn't change a thing.
newButton.addListener(new ClickListener() {
@Override
public boolean touchDown(InputEvent event, float x, float y, int pointer, int button) {
Gdx.app.postRunnable(new Runnable() {
@Override
public void run() {
DesktopLauncher.launch(1);
}
});
return true;
}
});
As a side note, when I press the button, everything on screen gets squeezed horizontally. Probably because editor screen is a bit wider than the game screen. It looks like I try to create everything on top of the previous application rather than launch a new one.
public static int launch(Class c) {
String javaBin = System.getProperty("java.home") + File.separator + "bin" + File.separator + "java";
String classpath = System.getProperty("java.class.path");
String className = c.getCanonicalName();
ProcessBuilder builder = new ProcessBuilder(javaBin, "-cp", classpath, className);
try{
Process process = builder.start();
process.waitFor();
return process.exitValue();
} catch(Exception e){
e.printStackTrace();
return 1;
}
}
Now it works. You have to pass class with main() method as parameter here; eg
launch(DesktopLauncher.class);
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.