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:
Textures
TextureAtlases
Music
Sound
Skins
: 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.FreeTypeFonts
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:
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
:boolean
vää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 meetodfinishLoading
meetod, mida saab konstruktorisload
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üsitavaksAssetManager
-i kasutamise mõtte, kunaAssetManager
eesmä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 vahemikusfloat
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:
