简体   繁体   中英

LibGDX how to launch another LwjglApplication?

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM