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:
TexturesTextureAtlasesMusicSoundSkins: koosneb JSON-failidest jaTexture-itestParticle Effects: plahvatused, suits, sädemedPixmaps: 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).BitmapFonts: FNT- ja PNG-failid fontide jaoks, mis võivad suuruse muutmisel kvaliteedis langeda.FreeTypeFontGenerator: Dünaamilisemad fondid TTF-failidest. Vajab eraldiFileHandleResolver ``loader-it ning üpris keeruline implementeerida.FreeTypeFontsI18NBundles: 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:
load: Lisab varadAssetManager-istack-i. Meetodile saab kaasa anda ka lisaparameetreid, nagu näiteks fondi suurusFreeTypeFontGenerator-it laadides, kuid selle implementatsioon on üpris keeruline.update:booleanväärtusega meetod, mis tagastabtrue, kui vajatavad varad on üles laaditud. See on asünkroonne meetod ehk võtabstack-i laetud varadest ainult mis vaja.Seda tuleb kutsuda``render``. Leidub ka sünkroonne meetodfinishLoadingmeetod, mida saab konstruktorisloadvä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üsitavaksAssetManager-i kasutamise mõtte, kunaAssetManagereesmärk on laadida varad alla alles siis, kui neid on vaja. Aga vajalik näiteks kui laadimisriba varad tahateAssetManager-ile anda.getProgress: nulli ja ühe vahemikusfloatvää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: