我正在使用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()) {
// 要求保存
}
}
Display
类。此外,我尝试创建自己的Lwjgl3Application
,但由于不在与其他Lwjgl内容相同的包中,有太多不可见的字段。 - Scooter