我想了解遊戲類和屏幕界面之間的關係。在我讀的教科書中,它指出Game類將ApplicationListener中的函數委託給屏幕對象。不知何故,這可以讓你切換屏幕。我不明白,爲什麼會發生這種情況,它是如何工作的?LibGDX:屏幕界面和遊戲類之間的關係
我當前的理解:遊戲通過ApplicationListener(Create(),Render()等)實現生命週期方法。但是你不直接從ApplicationListener實現的原因是因爲如果你從Game類延伸,Game類將允許你創建多個屏幕。
我想了解遊戲類和屏幕界面之間的關係。在我讀的教科書中,它指出Game類將ApplicationListener中的函數委託給屏幕對象。不知何故,這可以讓你切換屏幕。我不明白,爲什麼會發生這種情況,它是如何工作的?LibGDX:屏幕界面和遊戲類之間的關係
我當前的理解:遊戲通過ApplicationListener(Create(),Render()等)實現生命週期方法。但是你不直接從ApplicationListener實現的原因是因爲如果你從Game類延伸,Game類將允許你創建多個屏幕。
的LibGDX的 「核心」 一直是你ApplicationListener
類。
它包含不同平臺提供的所有Lifecycle-Hooks(包括create
,dispose
等)。
類Game
只是ApplicationListener
的一個實現,其中包含最常見的行爲。對於大多數遊戲來說,如果你需要一些特殊的行爲,你可以自己重寫或實現ApplicationListener
。
Screen
界面並不重要,但它也非常有用。
它允許你將你的遊戲分成不同的部分。
例如,您可以有一個MenuScreen
和一個GameScreen
。
MenuScreen
顯示一個簡單的菜單,其中包含「設置」,「高分」和「播放」按鈕。
然後GameScreen
包含真實的遊戲邏輯和渲染。
但是,默認情況下Screen
不做任何事情,他們甚至不會收到關於生命週期鉤子的通知。
而那個Game
-class進來:
該Game
-class包含單個Screen
- 實例,活動Screen
。然後通知目前的Screen
有關生命週期事件,如render
。然後Screen
可以採取關於這個事件的汽車。
如果你想切換Screen
,你可以簡單地撥打Game.setScreen(newScreen)
。 Game
-class然後調用hide
獲取當前的Screen
(您可能希望在此放置一些資源,或保存用戶進度),然後show
爲新的Screen
(這裏您可以加載一些資產並初始化新的Screen
)。
TL; DR
的ApplcationListener
是你遊戲的入口點。每個遊戲都有一個ApplicationListener
,它通過LibGDX框架獲得有關生命週期事件的通知。
Screen
s是您的遊戲的不同部分,其中包含不同的邏輯和視圖(例如MenuScreen
和GameScreen
)。
Screen
- 類封裝了單個Screen
的邏輯。
Game
-class在某種程度上是ApplicationListener
接口的默認實現,並將大部分工作委託給當前的Screen
。它還包含用於切換Screen
的邏輯。
ApplicationListener只是一個接口,你可以直接用你的類來實現它。遊戲類正在實現ApplicationListener接口。內部遊戲類包含一個屏幕界面,可以讓你改變屏幕。這是Libgdx遊戲類中的內容。
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;
}
}