![](/img/trans.png)
[英]What is the difference between “Game”, “Screen” and “ApplicationAdapter” in libgdx?
[英]LibGDX: The relationship between Screen interface and Game class
我想了解游戏类和屏幕界面之间的关系。 在我正在阅读的教科书中,它指出 Game 类将 ApplicationListener 中的函数委托给一个屏幕对象。 不知何故,这允许您切换屏幕。 我不明白,为什么会发生这种情况以及它是如何工作的?
我目前的理解:游戏从 ApplicationListener(Create(), Render(), etc...) 实现生命周期方法。 但是你不直接从 ApplicationListener 实现的原因是因为如果你从 Game 类扩展,Game 类将允许你制作多个屏幕。
LibGDX 的“核心”始终是您的ApplicationListener
类。
它包含不同平台提供的所有 Lifecycle-Hooks(包括create
、 dispose
等)。
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
是游戏的不同部分,包含不同的逻辑和视图(例如MenuScreen
和GameScreen
)。
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.