package fi.hbp.angr; import aurelienribon.bodyeditor.BodyEditorLoader; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.InputMultiplexer; import com.badlogic.gdx.physics.box2d.World; import com.badlogic.gdx.scenes.scene2d.Actor; import fi.hbp.angr.models.actors.Box; import fi.hbp.angr.models.actors.Grenade; import fi.hbp.angr.models.actors.Hans; import fi.hbp.angr.stage.GameStage; /** * Body factory used to spawn objects during the game. */ public class BodyFactory { private final GameStage stage; private final InputMultiplexer inputMultiplexer; private final BodyEditorLoader bel; protected AssetContainer asGrenade = new AssetContainer(); protected AssetContainer asBox = new AssetContainer(); protected Hans.HansAssetContainer hac = new Hans.HansAssetContainer(); private static boolean preloaded = false; /** * Add assets of this class to a preload list. */ public static void preload() { if (!preloaded) { Grenade.preload(); Box.preload(); Hans.preload(); preloaded = true; } } /* TODO Should the map/level tell what assets it will need? */ /* TODO Add a function to unload unneeded assets? */ /** * Constructor for body factory. * @param stage the game stage. * @param inputMultiplexer input multiplexer for adding new input processor. */ public BodyFactory(GameStage stage, InputMultiplexer inputMultiplexer) { this.stage = stage; this.inputMultiplexer = inputMultiplexer; bel = new BodyEditorLoader(Gdx.files.internal("models.json")); /* Initialize assets */ Grenade.initAssets(asGrenade, bel); Box.initAssets(asBox, bel); Hans.initAssets(hac, bel); } /** * Get world used by body factory and game stage * @return Box2D world. */ public World getWorld() { return stage.getWorld(); } /** * Spawns a new grenade to the game stage * @param x position on x axis. * @param y position on y axis. * @param angle body angle. * @return actor of the new game object. */ public Actor spawnGrenade(float x, float y, float angle) { Grenade actor = new Grenade(stage, bel, asGrenade, x, y, angle); inputMultiplexer.addProcessor(actor); stage.addActor(actor); ((GameStage)stage).setCameraFollow(((Grenade)actor).getBody()); return actor; } /** * Spawns a new box t othe game stage * @param x Position on x axis. * @param y Position on y axis. * @param angle Body angle. * @return Actor of the new game object. */ public Actor spawnBox(float x, float y, float angle) { Box actor = new Box(stage, bel, asBox, x, y, angle); stage.addActor(actor); return actor; } /** * Spawns a new Hans player model to the game stage * @param x Position on x axis. * @param y Position on y axis. * @param angle Body angle. * @return Actor of the new game object. */ public Actor spawnHans(float x, float y, float angle) { Hans actor = new Hans(stage, bel, hac, x, y, angle); inputMultiplexer.addProcessor(actor); stage.addActor(actor); return actor; } }