package com.ftloverdrive.core; import com.badlogic.gdx.assets.AssetManager; import com.badlogic.gdx.assets.loaders.FileHandleResolver; import com.badlogic.gdx.utils.Pool.Poolable; import com.ftloverdrive.core.OverdriveGame; import com.ftloverdrive.event.OVDEventManager; import com.ftloverdrive.net.OVDNetManager; import com.ftloverdrive.script.OVDScriptManager; import com.ftloverdrive.ui.screen.OVDScreen; import com.ftloverdrive.ui.screen.OVDScreenManager; import com.ftloverdrive.ui.screen.OVDStageManager; import com.ftloverdrive.util.OVDReferenceManager; /** * A means to pass the numerous managers around, especially to callbacks. * * This should be preferred over globals. * * It might make sense for an object of limited scope to take context as an * arg in its constructor and remember it. But if possible, individual * methods should never cache an old context passed to them. * * Context objects can be created by a Pool for reuse, but it will not be * safe to free() them until they're definitely forgotten. * * OverdriveContext context = Pools.get( OverdriveContext.class ).obtain(); * context.init(...); * * @see com.badlogic.gdx.utils.Pools * @see com.badlogic.gdx.utils.Pool * @see com.badlogic.gdx.utils.Pool.Poolable */ public class OverdriveContext implements Poolable { protected OverdriveGame game = null; protected OVDScreen screen = null; protected int gameModelRefId = -1; /** * This constructor must take no args, and only set up variables. * Call init() afterward, as if that were the normal constructor. * * @see com.badlogic.gdx.utils.ReflectionPool */ public OverdriveContext() { } /** * Pseudo constructor for new and reused objects. * This is capable of accepting args to set initial values. * * Always call this after obtaining a reused object from a Pool. * Subclasses overriding this must call super.init(); */ public void init() { } /** * Pseudo constructor. */ public void init( OverdriveGame game, OVDScreen screen, int gameModelRefId ) { this.game = game; this.screen = screen; this.gameModelRefId = gameModelRefId; } /** * Copies values from an existing context. * If anything later decides to modify this context, the original won't * be affected. */ public void init( OverdriveContext context ) { this.game = context.getGame(); this.screen = context.getScreen(); this.gameModelRefId = context.getGameModelRefId(); } public void setGame( OverdriveGame game ) { this.game = game; } public OverdriveGame getGame() { return game; } public FileHandleResolver getFileHandleResolver() { if ( game != null ) return game.getFileHandleResolver(); else return null; } public AssetManager getAssetManager() { if ( game != null ) return game.getAssetManager(); else return null; } public OVDScreenManager getScreenManager() { if ( game != null ) return game.getScreenManager(); else return null; } public OVDReferenceManager getReferenceManager() { if ( game != null ) return game.getReferenceManager(); else return null; } public OVDNetManager getNetManager() { if ( game != null ) return game.getNetManager(); else return null; } public void setScreen( OVDScreen screen ) { this.screen = screen; } public OVDScreen getScreen() { return screen; } public OVDEventManager getScreenEventManager() { if ( screen != null ) return screen.getEventManager(); else return null; } public OVDScriptManager getScreenScriptManager() { if ( screen != null ) return screen.getScriptManager(); else return null; } public OVDStageManager getScreenStageManager() { if ( screen != null ) return screen.getStageManager(); else return null; } public void setGameModelRefId( int refId ) { this.gameModelRefId = refId; } public int getGameModelRefId() { return gameModelRefId; } /** * Resets this object for Pool reuse, setting all variables to defaults. * This is automatically called by the Pool's free() method. * * @see com.badlogic.gdx.utils.Pool * @see com.badlogic.gdx.utils.Pool.Poolable */ @Override public void reset() { this.game = null; this.screen = null; this.gameModelRefId = -1; } }