[英]How to handle AssetManager in multiple screens
public static AssetManager assets = new AssetManager();
應該避免,但是如何在多個屏幕中處理AssetManager? 這是一個好的解決方案嗎?
public class myGame {
assetMananger manager = new AssetManager();
...
public assetManager getAssetMananger(){
return manager;
}
}
public class GameScreen implements Screen{
private AssetManager manager;
public GameScreen(myGame game){
manager = game.getManager();
}
public void render(){
manager.load(...);
}
Gdx.app.getApplicationListener()
返回ApplicationListener
實例。 您可以類型轉換到實現的類,然后輕松訪問該類的任何方法或數據成員。
通過這種方式 :
((GdxTest)Gdx.app.getApplicationListener()).assets // <-- You can use from where you want in your project.
ApplicationListener
實現的類:
public class GdxTest extends ApplicationAdapter {
public Assets assets;
@Override
public void create() {
assets= new Assets();
}
....
@Override
public void dispose() {
assets.dispose();
}
}
Assets
類,處理游戲的所有資產/資源
public class Assets implements Disposable {
public AssetManager assetManager;
public Assets(){
assetManager=new AssetManager();
}
...
@Override
public void dispose() {
assetManager.dispose();
}
}
將所有數據加載到AssetManager
要么將所有資源加載到create()
方法中,然后顯示初始屏幕。 (小型項目的最佳方法)
否則,對於具有大量資源的大型項目,請卸載不必要的資源->加載新資源,同時向用戶加載顯示加載屏幕。
我的方法總是這樣:
創建我自己的經理類,以接收AssetsManager的實例,並在最初加載游戲時加載所有游戲資產
public class Assets implements Disposable{
public static final Assets instance = new Assets();
private AssetManager manager;
// Individual assets
public PlayerAssets playerAssets;
private Assets(){}
public void init(AssetManager manager){
this.manager = manager;
manager.load(..);
manager.finishLoading();
TextureAtlas atlas = manager.get(..);
playerAssets = new PlayerAssets(atlas);
}
public void dispose(){
manager.dispose();
}
/** Sample Inner class for catching loaded game assets */
public PlayerAssets{
public final AtlasRegion legs;
PlayerAssets(TextureAtlas atlas){
legs = atlas.find(..);
}
}
}
在游戲類中,您加載了所有游戲資產。
public class MyGame extends Game {
@Override
public void create(){
Assets.instance.init(new AssetManager()); // loading your resources
setScreen(new GameScreen());
}
}
從下面的評論更新
處置您的資產。 您可能要為所有屏幕創建一個抽象類,如下所示
public abstract class AbstractScreen implements Screen{
protected Game game;
public AbstractScreen(Game game){
this.game = game;
}
}
. . . . . .
public void dispose(){
Assets.instance.dispose();
}
然后,您所有的屏幕都將擴展此類。 例如
public class MenuScreen extends AbstractScreen {
public MenuScreen(Game game){
super(game);
}
}
調用screen實例的dispose方法將處理所有資源,您可以在可能需要其他行為的地方覆蓋它,例如
@everride
public void dispose(){
// super.dispose();
// Release other screen resources
}
屏幕調用的位置絕對取決於您。 另外,您可能希望在加載資產時顯示加載屏幕,以避免由於加載延遲而出現空白屏幕。如果您按上述方法覆蓋處置,則無法通過屏幕處置資產
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.