LibGDX:Screen界面和Game类之间的关系

时间:2017-01-24 00:15:55

标签: java libgdx

我想了解Game类和Screen Interface之间的关系。在我正在阅读的教科书中,它指出Game类将ApplicationListener中的函数委托给一个屏幕对象。不知何故,这可以让你切换屏幕。我不明白,为什么会这样呢?它是如何运作的?

我目前的理解:Game从ApplicationListener实现生命周期方法(Create(),Render()等...)。但是你不能直接从ApplicationListener实现的原因是因为如果你从Game类扩展,Game类将允许你创建多个屏幕。

2 个答案:

答案 0 :(得分:1)

ApplicationListener只是一个接口,您可以直接在您的类中实现它。 Game类正在实现ApplicationListener接口。在Game类中,它包含一个Screen界面,可以让你更改屏幕。以下是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;
}

}

答案 1 :(得分:1)

LibGDX的“核心”始终是您的ApplicationListener类 它包含不同平台提供的所有Lifecycle-Hook(包括createdispose等)。
Game只是ApplicationListener的一个实现,包含最常见的行为。对于大多数游戏来说,这个课程做得很好,如果你需要一些特殊的行为,你需要覆盖它或者自己实现ApplicationListenerScreen界面并不重要,但它也非常有用 它允许您将游戏分成不同的部分 例如,您可以拥有MenuScreenGameScreen MenuScreen显示一个简单的菜单,其中包含“设置”,“高分”和“播放” - 按钮。 然后GameScreen包含实际的游戏逻辑和渲染 但是,默认情况下Screen不执行任何操作,甚至不会收到有关Lifecycle-Hooks的通知。
那就是Game - 类所在的那个:
Game - 类包含一个Screen - 实例,即活动Screen。然后,它会通知当前Screen生命周期事件,例如render。然后Screen可以了解此事件 如果您想切换Screen,只需拨打Game.setScreen(newScreen)即可。然后,Game - 类会针对当前hide调用Screen(您可能希望在此处置某些资源,或保存用户进度),然后show为新Screen {1}}(您可以在这里加载一些资源并初始化新的Screen)。

<强> TL; DR
ApplcationListener是游戏的切入点。每个游戏只有一个ApplicationListener,它通过LibGDX框架获得生命周期事件的通知。

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

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

的logik