AssetManager

AssetManager on LibGDX -i klass, mängu varahalduse optimeerimiseks.

AssetManager-i peamised omadused: - Kõik varad laaditakse ainult ühe korra AssetManager-i stacki load meetodiga ning neid saab sealt kätte, kutsudes ühe korra välja kas renderis välja update või konstruktoris finishLoading` meetodit. - Varade allalaadimise protsenti saab jälgida getProgress meetodiga. - Kõiki varasid saab ühekorraga eemaldada dispose meetodiga.

AssetManager-i toetatud andmestruktuurid:

  1. Textures

  2. TextureAtlases

  3. Music

  4. Sound

  5. Skins: koosneb JSON-failidest ja Texture-itest

  6. Particle Effects: plahvatused, suits, sädemed

  7. Pixmaps: Mälusõbralik piksli-vormingus andmete hoidmine. Kasulik olukordades, kus üks element koosneb eri juhtudel eri tekstuuridest (näiteks karakter mütsiga ja ilma mütsita).

  8. BitmapFonts: FNT- ja PNG-failid fontide jaoks, mis võivad suuruse muutmisel kvaliteedis langeda.

  9. FreeTypeFontGenerator: Dünaamilisemad fondid TTF-failidest. Vajab eraldi FileHandleResolver ``loader-it ning üpris keeruline implementeerida.

  10. FreeTypeFonts

  11. I18NBundles: tõlkefailid (näiteks kuupäevad ja numbrid erinevates keeltes)

AssetManager-i (ega ka ühtegi teist vara) pole soovituslik teha staatiliseks kuna vara korduvkasutusel võib tekkida olukord, et AssetManager on need varem mälust eemaldanud.

AssetManager-i tähtsamad meetodid:

  1. load: Lisab varad AssetManager-i stack-i. Meetodile saab kaasa anda ka lisaparameetreid, nagu näiteks fondi suurus FreeTypeFontGenerator-it laadides, kuid selle implementatsioon on üpris keeruline.

  2. update: boolean väärtusega meetod, mis tagastab true, kui vajatavad varad on üles laaditud. See on asünkroonne meetod ehk võtab stack -i laetud varadest ainult mis vaja.Seda tuleb kutsuda``render``. Leidub ka sünkroonne meetod finishLoading meetod, mida saab konstruktoris load väljakutsumiste alla kirjutada. See tagab, et mäng ei alga enne, kui kõik varad on üles laaditud. Kuigi see on mugav, teeb see küsitavaks AssetManager-i kasutamise mõtte, kuna AssetManager eesmärk on laadida varad alla alles siis, kui neid on vaja. Aga vajalik näiteks kui laadimisriba varad tahate AssetManager-ile anda.

  3. getProgress: nulli ja ühe vahemikus float väärtust tagastav meetod laadimise progressi näitamiseks. Seda tuleb kutsuda``render`` meetodis.

Laadimisriba loomine

Loome Assets klassi, et hallata kõiki varasid, välja arvatud laadimisriba kuvamise omad.

public class Assets {

private AssetManager manager;

public Assets() {
    manager = new AssetManager();
    loadAssets();
}
public AssetManager getManager() {
    return manager;
}
private void loadAssets() {
    manager.load("Music/mcr-the-black-parade.mp3", Music.class);
    manager.load("Pics/cancer.png", Texture.class);
    }
}

Loome AssetManager instantsi klassis, mis laiendab Game klassi, kuna siis saame kasutada setScreen meetodit. Niimoodi ei vaheta me Screen-i enne, kui kõik vajalikud varad on alla laaditud ehk AssetManager-i update meetod tagastab true. Näitamaks kasutajale laadimisprotsenti, kasutame getProgress meetodit.

public class Main extends Game {

private Assets assets;
private MenuScreen menuScreen;
private final float progressBarWidth = 300f;
private final float progressBarHeight = 20f;
private float progressBarX;
private float progressBarY;

@Override
public void create () {
    batch = new SpriteBatch();
    assets = new Assets();
    progressBarX = (Gdx.graphics.getWidth() - progressBarWidth) / 2;
    progressBarY = (Gdx.graphics.getHeight() - progressBarHeight) / 2;
}

@Override
public void render() {
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
    if (assets.getManager().update() && getScreen() == null) {
        menuScreen = new MenuScreen(this);
        setScreen(menuScreen);
        if (assets.getManager().update()) {
            Music music = assets.getManager().get("Music/mcr-the-black-parade.mp3", Music.class);
            music.setLooping(true);
            music.play();
       }
    }
    if (getScreen() != null) {
       super.render();
    } else {
       float progress = assets.getManager().getProgress();
       batch.begin();
       batch.setColor(1, 1, 1, 1);
       batch.draw(new Texture(Gdx.files.internal("badlogic.jpg")), progressBarX, progressBarY, progressBarWidth, progressBarHeight);
       batch.setColor(0.5f, 1, 0.5f, 1);
       batch.draw(new Texture(Gdx.files.internal("badlogic.jpg")), progressBarX, progressBarY, progressBarWidth * progress, progressBarHeight);
       batch.end();
    }
}

Et menüü ekraanil nüüd taustapilti lisada, kutsume konstruktoris mängu klassi laienda klassi abil välja Assets klassi.

public class MenuScreen implements Screen {
    private final Main game;
    private final Stage stage;
    final OrthographicCamera gameCam;
    final Viewport viewport;
    private SpriteBatch spriteBatch;
    private Texture backgroundTexture;
    private final Assets assets;

public MenuScreen(Main game) {
    backgroundTexture = assets.getManager().get("Pics/cancer.png", Texture.class);
    this.game = game;
    this.assets = game.assets;
    this.spriteBatch = game.getBatch();
    gameCam = new OrthographicCamera();
    gameCam.setToOrtho(false, Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
    viewport = new FitViewport(Gdx.graphics.getWidth(), Gdx.graphics.getHeight(), gameCam);
    viewport.apply();
    stage = new Stage(viewport);
}

Ning lisame selle joonistamise render meetodisse samasse klassi.

@Override
public void render(float delta) {
   Gdx.gl.glClearColor(.1f, .1f, .15f, 1);
   Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
   gameCam.update();
   spriteBatch.setProjectionMatrix(gameCam.combined);
   spriteBatch.begin();
   spriteBatch.draw(backgroundTexture, 0, 0, Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
   spriteBatch.end();
   stage.act(Math.min(delta, 1 / 30f));
   stage.draw();
}

Tulemuseks saime:

../_images/progressbar.gif