【问题标题】:LibGDX Prevent app from closing (Desktop)LibGDX 防止应用程序关闭(桌面)
【发布时间】:2017-08-07 00:21:18
【问题描述】:

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

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

【问题讨论】:

  • 好问题,我也想要一个明确的答案。

标签: java libgdx


【解决方案1】:

您只需重写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() 方法,而不是检查游戏类。

【讨论】:

    【解决方案2】:

    我能想到三种方法:

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

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

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

    void render() { if(Gdx.app.getType() == Application.Desktop && Display.isCloseRequested()) { // ask for saving } }

    【讨论】:

    • 在 Lwjgl3 中似乎没有静态的 Display 类。另外,我尝试创建自己的Lwjgl3Application,但有太多字段不可见,因为我与其他 Lwjgl 东西不在同一个包中。
    猜你喜欢
    • 1970-01-01
    • 2011-02-15
    • 2012-05-04
    • 1970-01-01
    • 1970-01-01
    • 2015-07-28
    • 2011-02-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多