package stu.tnt.gdx.core; import stu.tnt.gdx.core.Timer.Task; import stu.tnt.gdx.core.loader.Album; import stu.tnt.gdx.core.loader.Context; import stu.tnt.gdx.core.utils.Bridge; import stu.tnt.gdx.utils.D; import stu.tnt.gdx.utils.E; import stu.tnt.gdx.widget.Layout; import stu.tnt.gdx.widget.StyleAtlas; import stu.tnt.platform.IActivityHandler; import com.badlogic.gdx.ApplicationListener; import com.badlogic.gdx.Game; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.InputProcessor; import com.badlogic.gdx.assets.AssetLoaderParameters; import com.badlogic.gdx.graphics.GL20; import com.badlogic.gdx.graphics.g2d.SpriteBatch; import com.badlogic.gdx.graphics.g2d.SpriteCache; import com.badlogic.gdx.graphics.g2d.TextureAtlas; import com.badlogic.gdx.graphics.g2d.TextureRegion; import com.badlogic.gdx.math.Matrix4; import com.badlogic.gdx.math.Vector2; import com.badlogic.gdx.utils.PauseableThread; /** @FileName: Screen.java * @CreateOn: Sep 15, 2012 - 11:11:22 AM * @Author: TrungNT */ public abstract class Screen implements ApplicationContext { protected static GameCore mGameCore; public static SpriteBatch batch = null; private SpriteCache cache = null; static Layout layout = null; public final Matrix4 projection = new Matrix4(); public final Matrix4 transform = new Matrix4(); public final Matrix4 tmpMat = new Matrix4(); static void setCoreProcessor (GameCore core) { mGameCore = core; } /** Called when this screen becomes the current screen for a {@link Game}. */ public abstract void show (); /** @see ApplicationListener#resize(int, int) */ public void resize (int width, int height) { eAdmin.apply(batch); if (layout != null) eAdmin.apply(layout); if (cache != null) eAdmin.apply(cache); } /** Refresh all screen component * * @param delta The time in seconds since the last render. */ public void update (float delta) { if (layout != null) layout.act(delta); } /** Called when the screen should render itself. * * @param delta The time in seconds since the last render. */ public abstract void onRender (float delta); /** @see ApplicationListener#pause() */ public void pause () { if (layout != null) layout.Pause(); } /** @see ApplicationListener#resume() */ public void resume () { if (layout != null) layout.Resume(); } /** Call when user change current scree * * @param destroyMode if RELEASE the layout will be clear and batch is flush,else if HIDE the pause() will be call */ public void destroy (int destroyMode) { if (destroyMode == E.screen.HIDE) { pause(); return; } eAdmin.einput.unregisterBackKeyListener(); if (layout != null) layout.clear(); if (cache != null) cache.clear(); batch.flush(); } /************************************************************************** Layout manager **************************************************************************/ public Layout getScreenLayout () { if (layout == null) layout = new Layout(false); eAdmin.einput.addProcessor(layout.ID, layout); return layout; } public void drawLayout () { D.out("Layout " + layout.getViewport().getCamera()); layout.draw(); } public boolean isLayoutCreated () { return layout != null; } /************************************************************ Screen transistion method ************************************************************/ /** Set screen which lead to the new screen and the destroy mode of old screen * * @param screen new screen * @param destroyMode destroy mode(RELEASE for totally destroy , HIDE -just make it invisible) */ protected void setScreen (Screen screen, int destroyMode) { mGameCore.setScreen(screen, destroyMode); } /** set screen in SafeMode which will ensure that all context associate with that screen will be loaded */ protected void setScreen (Screen screen, ResourceContext... contexts) { mGameCore.setScreen(screen, contexts); } /** set screen in SafeMode which will ensure that all context associate with that screen will be loaded */ protected void setScreen (Screen screen, ResourcePack pack) { mGameCore.setScreen(screen, pack); } /*************************************************************************** eInput Method **************************************************************************/ public final InputProcessor findInputById (int id) { return eAdmin.einput.findInputById(id); } /*************************************************************************** eContext Method **************************************************************************/ public final StyleAtlas styleQuery (String name) { return eAdmin.econtext.styleQuery(name); } public final <T> T getStyle (String styleName, Class<T> type) { return eAdmin.econtext.getStyle(styleName, type); } public final <T> T optional (String resourceName, Class<T> type) { return eAdmin.econtext.optional(resourceName, type); } public final StyleAtlas getStyleAtlas (String name) { return eAdmin.econtext.getStyleAtlas(name); } public final void stopStyleQuery () { eAdmin.econtext.stopQuery(); } /* --------------------------------------------- */ public final Context findContextByName (String name) { if (name == null) throw new NullPointerException("Context name cant be null"); return eAdmin.econtext.findContextByName(name); } public final <T> T findDataByName (String linkName, Class<T> clazz) { if (linkName == null) throw new NullPointerException("LinkName cant be null"); return eAdmin.econtext.findDataByName(linkName, clazz); } /* -------------------------------------------- */ public final TextureAtlas atlasQuery (String name) { return eAdmin.econtext.atlasQuery(name); } public final TextureRegion findGRegionByName (String name) { return eAdmin.econtext.findGRegionByName(name); } public final TextureRegion findGRegionByName (String name, int index) { return eAdmin.econtext.findGRegionByName(name, index); } public final TextureRegion[] findGRegionsByName (String name) { return eAdmin.econtext.findGRegionsByName(name); } /* -------------------------------------------------------- */ public final <T> void load (String linkName, Class<T> clazz) { eAdmin.econtext.load(linkName, clazz); } public final <T> void load (String linkName, Class<T> clazz, AssetLoaderParameters<T> param) { eAdmin.econtext.load(linkName, clazz, param); } public final <T> T get (String fileName, Class<T> clazz) { return eAdmin.econtext.get(fileName, clazz); } public boolean isLoaded (String linkName, Class<?> clazz) { return eAdmin.econtext.isLoaded(linkName, clazz); } public final <T> void unload (String linkName) { eAdmin.econtext.unload(linkName); } public final int totalGData () { return eAdmin.econtext.totalData(); } /*************************************************************************** eAudio Method **************************************************************************/ public final Album findAlbumByName (String name) { if (name != null) return eAdmin.eaudio.findAlbumByName(name); return null; } public final int totalAData () { return eAdmin.eaudio.totalAData(); } /*************************************************************************** Quick GL Method **************************************************************************/ public final void glClear (int glmask) { Gdx.gl.glClear(glmask); } public final void glClearColor (float r, float g, float b, float a) { Gdx.gl.glClearColor(r, g, b, a); } public final void disableBlend () { Gdx.gl.glDisable(GL20.GL_BLEND); } public final void enableBlend () { Gdx.gl.glEnable(GL20.GL_BLEND); Gdx.gl.glBlendFunc(GL20.GL_SRC_ALPHA, GL20.GL_ONE_MINUS_SRC_ALPHA); } /*************************************************************************** Quick Memory Method **************************************************************************/ public final void release (Vector2 v) { v = null; } /*************************************************************************** GameCore method **************************************************************************/ public Bridge newBridge (Class<?> firstClass, Class<?> secondClass) { return mGameCore.newBridge(firstClass, secondClass); } public Bridge newBridge (String name) { return mGameCore.newBridge(name); } @Override public IActivityHandler getActivity () { return mGameCore.mActivity; } @Override public void post (Task task) { mGameCore.mSchedulerTimer.postTask(task); } @Override public void schedule (Task task) { mGameCore.mSchedulerTimer.scheduleTask(task); } @Override public void schedule (Task task, float delaySeconds) { mGameCore.mSchedulerTimer.scheduleTask(task, delaySeconds); } public void schedule (int fps, Task task) { mGameCore.mSchedulerTimer.scheduleTask(fps, task); } @Override public void schedule (Task task, float delaySeconds, float intervalSeconds) { mGameCore.mSchedulerTimer.scheduleTask(task, delaySeconds, intervalSeconds); } @Override public void schedule (Task task, float delaySeconds, float intervalSeconds, int repeatCount) { mGameCore.mSchedulerTimer.scheduleTask(task, delaySeconds, intervalSeconds, repeatCount); } @Override public int newThreadId (Runnable runnable) { return mGameCore.mThreadManager.obtainForID(runnable); } @Override public PauseableThread newThread (Runnable runnable) { return mGameCore.mThreadManager.obtainForThread(runnable); } @Override public boolean startThread (int id) { return mGameCore.mThreadManager.startThread(id); } @Override public boolean stopThread (int id) { return mGameCore.mThreadManager.stopThread(id); } @Override public boolean pauseThread (int id) { return mGameCore.mThreadManager.pauseThread(id); } @Override public boolean resumeThread (int id) { return mGameCore.mThreadManager.resumeThread(id); } @Override public boolean containThread (int id) { return mGameCore.mThreadManager.containThread(id); } @Override public boolean containThread (PauseableThread thread) { return mGameCore.mThreadManager.containThread(thread); } /************************************************ * ************************************************/ public SpriteCache getSpriteCache (int size) { if (cache == null) { cache = new SpriteCache(size, true); eAdmin.apply(cache); } return cache; } public SpriteCache getSpriteCache () { if (cache == null) { cache = new SpriteCache(100, true); eAdmin.apply(cache); } return cache; } public Matrix4 getTransformationMatrix () { return transform; } public Matrix4 getProjectionMatrix () { return projection; } }