2017-01-24 50 views
-5

我想了解遊戲類和屏幕界面之間的關係。在我讀的教科書中,它指出Game類將ApplicationListener中的函數委託給屏幕對象。不知何故,這可以讓你切換屏幕。我不明白,爲什麼會發生這種情況,它是如何工作的?LibGDX:屏幕界面和遊戲類之間的關係

我當前的理解:遊戲通過ApplicationListener(Create(),Render()等)實現生命週期方法。但是你不直接從ApplicationListener實現的原因是因爲如果你從Game類延伸,Game類將允許你創建多個屏幕。

回答

1

的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是您的遊戲的不同部分,其中包含不同的邏輯和視圖(例如MenuScreenGameScreen)。
Screen - 類封裝了單個Screen的邏輯。

Game -class在某種程度上是ApplicationListener接口的默認實現,並將大部分工作委託給當前的Screen。它還包含用於切換Screen的邏輯。

1

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; 
} 

}