繁体   English   中英

LibGDX:Screen接口与Game类的关系

[英]LibGDX: The relationship between Screen interface and Game class

我想了解游戏类和屏幕界面之间的关系。 在我正在阅读的教科书中,它指出 Game 类将 ApplicationListener 中的函数委托给一个屏幕对象。 不知何故,这允许您切换屏幕。 我不明白,为什么会发生这种情况以及它是如何工作的?

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

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

TL; 博士
ApplcationListener是游戏的入口点。 每个游戏都有一个ApplicationListener ,它会通过 LibGDX 框架获得有关 Lifecycle-Events 的通知。

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

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

ApplicationListener 只是一个接口,你可以直接用你的类来实现它。 游戏类正在实现该 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;
}

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM