【问题标题】:LibGDX: The relationship between Screen interface and Game classLibGDX:Screen界面与Game类的关系
【发布时间】:2017-01-24 00:15:54
【问题描述】:

我想了解 Game 类和 Screen Interface 之间的关系。在我正在阅读的教科书中,它指出 Game 类将 ApplicationListener 的功能委托给屏幕对象。不知何故,这使您可以切换屏幕。我不明白,为什么会发生这种情况以及它是如何工作的?

我目前的理解:Game 实现了 ApplicationListener(Create(), Render(), etc...) 中的 Life Cycle 方法。但是您不直接从 ApplicationListener 实现的原因是,如果您从 Game 类扩展,Game 类将允许您制作多个屏幕。

【问题讨论】:

    标签: java libgdx


    【解决方案1】:

    LibGDX 的“核心”始终是您的 ApplicationListener 类。
    它包含不同平台提供的所有 Lifecycle-Hooks(包括createdispose 等)。
    Game 类只是 ApplicationListener 的一种实现,包含最常见的行为。对于大多数游戏来说,这个类做得很好,如果你需要一些特殊的行为,你需要重写它或者自己实现ApplicationListener
    Screen 接口没有那么重要,但也非常有用。
    它允许您将游戏分成不同的部分。
    例如,您可以有一个MenuScreen 和一个GameScreen
    MenuScreen 显示了一个简单的菜单,其中包含“设置”、“高分”和“播放”按钮。
    GameScreen 然后包含实际的游戏逻辑和渲染。
    但是,默认情况下 Screens 不做任何事情,他们甚至不会收到有关 Lifecycle-Hooks 的通知。
    这就是Game-class 的用武之地:
    Game-class 包含一个Screen-instance,即活动的Screen。然后它通知当前Screen 关于生命周期事件,如render。然后Screen 可以专车了解本次活动。
    如果你想切换Screen,你可以直接拨打Game.setScreen(newScreen)Game-class 然后为当前的Screen 调用hide(您可能想在此处处理一些资产,或保存用户进度),然后为新的Screen 调用show(在这里您可以加载一些资产并初始化新的Screen)。

    TL;DR
    ApplcationListener 是游戏的入口点。每个游戏都有一个ApplicationListener,它会通过 LibGDX 框架获得有关生命周期事件的通知。

    Screens 是游戏的不同部分,包含不同的逻辑和视图(例如 MenuScreenGameScreen)。
    Screen 类封装了单个 Screen 的逻辑。

    Game 类在某种程度上是ApplicationListener 接口的默认实现,并将大部分工作委托给当前的Screen。它还包含切换Screen的逻辑。

    【讨论】:

      【解决方案2】:

      ApplicationListener 只是一个接口,你可以直接用你的类来实现它。游戏类正在实现该 ApplicationListener 接口。在 Game 类内部,它包含一个允许您更改屏幕的屏幕界面。这是 Libgdx 的 Game 类中的内容。

      public abstract class Game implements ApplicationListener {
      protected Screen screen;
      
      @Override
      public void dispose () {
          if (screen != null) screen.hide();
      }
      
      @Override
      public void pause () {
          if (screen != null) screen.pause();
      }
      
      @Override
      public void resume () {
          if (screen != null) screen.resume();
      }
      
      @Override
      public void render () {
          if (screen != null) screen.render(Gdx.graphics.getDeltaTime());
      }
      
      @Override
      public void resize (int width, int height) {
          if (screen != null) screen.resize(width, height);
      }
      
      /** Sets the current screen. {@link Screen#hide()} is called on any old screen, and {@link Screen#show()} is called on the new
       * screen, if any.
       * @param screen may be {@code null} */
      public void setScreen (Screen screen) {
          if (this.screen != null) this.screen.hide();
          this.screen = screen;
          if (this.screen != null) {
              this.screen.show();
              this.screen.resize(Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
          }
      }
      
      /** @return the currently active {@link Screen}. */
      public Screen getScreen () {
          return screen;
      }
      

      }

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-09-20
        • 1970-01-01
        • 1970-01-01
        • 2013-06-01
        相关资源
        最近更新 更多