LibGDX 如何防止应用程序在桌面上关闭

3

我正在使用LibGDX构建一款仅限桌面的应用程序。该游戏具有内置的地图编辑器,您可以切换并对游戏地图进行更改。我想添加一个功能,即如果用户单击关闭窗口并且有未保存的编辑,则会提示您在关闭之前是否要保存更改。实现此效果的最佳方法是什么?

编辑:在这个LibGDX项目中,我正在使用Lwjgl3。


好问题,我也想要一个清晰的答案。 - salih kallai
2个回答

4
你只需要重写LwjglApplication类的exit方法,拦截任何对Gdx.app.exit的调用,包括通过Lwjgl Display关闭窗口时应用程序执行的调用。
//desktop
public class DesktopLauncher
{
    public static void main(String[] arg)
    {
        LwjglApplicationConfiguration config = new LwjglApplicationConfiguration();

        config.title = "YourGame";
        config.width = 800;
        config.height = 400;

        new LwjglApplication(new YourGame(), config) {
            @Override
            public void exit()
            {
                if(((YourGame)getApplicationListener()).canClose())
                    super.exit(); 
            }
        };
    }
}

//core
public class YourGame implements ApplicationListener
{
    //...

    public boolean canClose()
    {
        //close logic here
        return true; //return true if you want the close to happen
    }
}

当然,在您的情况下,您的地图编辑器应该是一个屏幕,因此您的游戏应该调用当前屏幕的canClose()方法,而不是在游戏类中进行检查。

0

我能想到三种方法:

  1. 复制 LwjglApplication 并根据您的需求修改 mainLoop()。特别是带有 if (Display.isCloseRequested()) exit(); 的那一行。然后在 DesktopLauncher 中使用您自己的 LwjglApplication 实现。

  2. 始终将编辑器中的任何更改保存在临时文件中,并将其标记为未完成。因此,当用户重新启动游戏时,他可以继续在未完成的级别上工作。

  3. 在实现了 render() 的类之一中检查 Display.isCloseRequested(),然后实现保存。像这样:

void render() { if(Gdx.app.getType() == Application.Desktop && Display.isCloseRequested()) { // 要求保存 } }


在Lwjgl3中似乎没有静态的Display类。此外,我尝试创建自己的Lwjgl3Application,但由于不在与其他Lwjgl内容相同的包中,有太多不可见的字段。 - Scooter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接