【问题标题】:Libgdx on desktop, how to handle disposing when window is closed桌面上的Libgdx,窗口关闭时如何处理
【发布时间】:2014-04-08 17:57:06
【问题描述】:

我正在使用 libgdx(com.badlogic.gdx.Game 和 Screens 等)来制作游戏。我有以下问题:在桌面上,当我关闭窗口(从顶部的十字)时,应用程序当然会关闭。但我想返回菜单屏幕并在那里处理,因为我确实在那里处理资源(通过资产管理器)。我有退出游戏的按钮,如果以这种方式退出,那很好。麻烦的是红十字可以按。那么在这种情况下我该如何正确处理呢?

在 android 版本上,我按自己的方式抓住返回键并处理离开游戏的不同部分和整个游戏。在那里它工作正常。

我有另一个相关问题:

在桌面上,应用程序不能像 android 版本(android 生命周期)一样被停止然后处理(自行处理,无需用户明确退出),对吗?所以这是一个好主意,如果我在 pause() 上进行临时保存并从 resume() 上恢复游戏状态,我不会在桌面上恢复(因为恢复不是完全恢复,我不会'如果在桌面上只是最小化了窗口,则不希望进行恢复(正如我注意到的那样,在最小化/恢复窗口时会调用 pause()/resume())。

希望这不是太不清楚 :D。我试图用谷歌搜索答案,但似乎什么也没找到。非常感谢任何帮助。

【问题讨论】:

  • 对不起,我没有得到你的问题。你是如何实现 dispose 方法的?
  • 好吧,在游戏屏幕中 dispose() 我保存游戏并处理我在那里的阶段。但问题是,当从退出按钮(在桌面上)关闭应用程序时,它永远不会回到菜单屏幕,资产也不会被处置(我确实在菜单屏幕的 dispose() )。

标签: java android libgdx


【解决方案1】:

我建议使用libgdx life-cycle methods

要处理,您应该使用dispose() 方法。你不需要自己调用 dispose !当应用程序被销毁时,它将被自动调用,请参阅文档:

dispose() 当应用程序被销毁时调用。它前面是对 pause() 的调用。

所以只需在你的 Screens 中实现 dispose 方法:

@Override
public void dispose () { 
    //your code needs to get added here, like for example:
    stage.dispose();
    texture.dispose();
    //etc..
}

更新:注意 ApplicationListener 的 dispose() 会被自动调用,而不是 Screen 的 dispose(),参见 Springrbua 的注释

【讨论】:

  • 我认为只有在应用程序被销毁时才调用 Game 的 dispose ,默认情况下这只是在当前屏幕上调用 hide() 。所以屏幕不会自动处理。
  • 是的,dispose 方法在应用程序被销毁时被调用。但正如您所见,默认实现并没有做太多事情。这就是为什么必须在那里添加处理代码。
  • Screen 的文档说,dispoes()Screen 永远不会被自动调用。所以你需要在hide()方法中dispose()Screen,或者你在Gamedispose()中调用screen.dispose()/ApplicationListener
  • 真的。我将其包含在答案中以使其更清楚。 @Springrbua
【解决方案2】:

您可以通过像这样从游戏类dispose() 显式调用它来调用屏幕的dispose()

MyScreen 类:

public class MyScreen implements Screen {
    // Not going to write all other methods that need to be overridden

    @Override
    public void dispose() {
        // Clear you Screen Resources here
    }

}

MyGame 类:

public class MyGame extends Game {
    // Not going to write all other methods that need to be overridden

    @Override
    public void create() {
        setScreen(new MyScreen());

    }

    @Override
    public void dispose() {
        // Clear you Screen Explicitly
        getScreen().dispose();

    }
}

希望对你有帮助

【讨论】:

    【解决方案3】:

    如上所述,Screen 接口包含一个dispose 方法。此外,Gamedispose 方法可以被覆盖以自动处理当前屏幕。但是,这不是默认设置是有原因的。假设您有多个Screens - Screen1Screen2。 Screen1 处于活动状态,然后将屏幕更改为 2。然后退出游戏,调用 dispose 方法,该方法调用 当前屏幕的 dispose 方法 - 留下屏幕 1。

    我的首选方法是让游戏通过覆盖 setScreen 方法并添加 Screen[] 屏幕、boolean[] scrDiss 和索引来跟踪设置的屏幕。当在 Game 上调用 dispose 时,它​​会检查所有设置的屏幕,检查是否先前已释放,如果没有则释放。此外,Screen dispose 方法应调用在数组中找到它的 Game 上的方法,并将其标记为已释放。这样一来,可以在 Game 结束前对 Screen 进行处理,而在 Game 结束的时候,所有 Screens 也会被处理。

    【讨论】:

      【解决方案4】:

      当您的应用程序被释放时,在所有屏幕上调用 dispose。

      【讨论】:

      • 感谢您的回答。我应该保留对 Game 类中所有屏幕的引用吗?现在我只参考了菜单屏幕。但是我怎么知道屏幕是否已经被处理了呢?我应该在屏幕类中引入布尔 isDisposed 吗?
      • 现在我想我明白了:我不应该在 menuScreen 中的 exitGame() 方法中调用 dispose()。游戏的处置将负责处置。我想我必须添加对我拥有的所有屏幕的引用并检查它们是否不为空并处理它们。如果我更早地处理它们,我会将 Game 中的引用设为 null。这听起来是个好主意吗?
      • 你应该实现 dispose() 方法。看看文档:github.com/libgdx/libgdx/wiki/The-life-cycle@ploosu2
      • 是的,我现在已经实现了。 (默认版本只是在当前屏幕上调用 hide(),我之前也使用它来决定是否 dispose()。)顺便说一下,我从链接中读到 resume() 仅在 Android 上调用。尽管如此,我的桌面版本在最小化屏幕时调用 pause(),在恢复时调用 resume()。这只是某种调试的东西还是什么?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-06
      • 2023-04-02
      相关资源
      最近更新 更多