package fi.hbp.angr.screens; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; import com.badlogic.gdx.Game; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.Screen; import fi.hbp.angr.G; import fi.hbp.angr.Preloadable; /** * Preload a given Screen. * * Creates an instance of a screen of given type and loads its assets. This * is useful and works only if constructor of the new screen class loads all * assets needed. */ public class ScreenLoader { /** * Game. */ private final Game game; /** * Screen that will be preloaded and then switched to. */ private final Screen screen; /** * Reentrant lock. */ private final Lock l = new ReentrantLock(); /** * Loading status. * true if preloading has been started. * This doesn't actually tell whether preloading is ready or not. */ private boolean loaded = false; /** * Constructor for ScreenLoader. * @param game main game object. * @param screen screen to be loaded. */ public ScreenLoader(Game game, Screen screen) { this.game = game; this.screen = screen; } /** * Fills preload queue. */ public void start() { l.lock(); try { if (Preloadable.class.isInstance(screen)) { ((Preloadable)screen).preload(); } loaded = true; } finally { l.unlock(); } } /** * Updates the AssetManager, keeping it loading any assets in the preload queue. * @return true if all loading is finished. */ public boolean update() { return G.getAssetManager().update(); } /** * Swap to the preloaded screen. */ public void swap() { l.lock(); try { if (loaded == false) { Gdx.app.error("ScreenLoader", "swap() was called before preload was started."); Gdx.app.exit(); } G.getAssetManager().finishLoading(); if (Preloadable.class.isInstance(screen)) { ((Preloadable)screen).create(); } game.setScreen(screen); } finally { l.unlock(); } } }