【发布时间】:2017-08-07 00:21:18
【问题描述】:
我正在 LibGDX 中构建一个仅限桌面的应用程序。游戏有一个内置的地图编辑器,您可以切换到游戏地图并对其进行更改。我想添加一个功能,如果用户单击关闭窗口并且有未保存的编辑,它会提示您是否要在关闭之前保存更改。实现这种效果的最佳方法是什么?
编辑:我在这个 LibGDX 项目中使用 Lwjgl3。
【问题讨论】:
-
好问题,我也想要一个明确的答案。
我正在 LibGDX 中构建一个仅限桌面的应用程序。游戏有一个内置的地图编辑器,您可以切换到游戏地图并对其进行更改。我想添加一个功能,如果用户单击关闭窗口并且有未保存的编辑,它会提示您是否要在关闭之前保存更改。实现这种效果的最佳方法是什么?
编辑:我在这个 LibGDX 项目中使用 Lwjgl3。
【问题讨论】:
您只需重写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() 方法,而不是检查游戏类。
【讨论】:
我能想到三种方法:
复制LwjglApplication并根据需要修改mainLoop()。特别是 if (Display.isCloseRequested()) exit(); 的行 然后在 DesktopLauncher 中使用你自己的 LwjglApplication 实现。
始终将编辑器中的任何更改保存在临时文件中,并将其标记为未完成。因此,当用户重新启动游戏时,他可以继续在未完成的关卡上工作。
在实现render() 的类之一中检查Display.isCloseRequested(),然后实现保存。像这样:
void render() {
if(Gdx.app.getType() == Application.Desktop && Display.isCloseRequested()) {
// ask for saving
}
}
【讨论】:
Display 类。另外,我尝试创建自己的Lwjgl3Application,但有太多字段不可见,因为我与其他 Lwjgl 东西不在同一个包中。