/* * Copyright (c) 2012. HappyDroids LLC, All rights reserved. */ package com.happydroids.droidtowers.scenes.components; import com.badlogic.gdx.Gdx; import com.google.common.collect.Lists; import com.happydroids.HappyDroidConsts; import com.happydroids.droidtowers.input.InputSystem; import com.happydroids.droidtowers.scenes.Scene; import java.util.LinkedList; public class SceneManager { private static final String TAG = SceneManager.class.getSimpleName(); private static Scene activeScene; private static LinkedList<Scene> pausedScenes = Lists.newLinkedList(); public static void changeScene(Class<? extends Scene> sceneClass, Object... args) { if (HappyDroidConsts.DEBUG) { System.out.println("Switching scene to: " + sceneClass.getSimpleName()); } popScene(); pushScene(sceneClass, args); } public static void pushScene(Class<? extends Scene> sceneClass, Object... args) { try { if (activeScene != null) { activeScene.pause(); InputSystem.instance().removeInputProcessor(activeScene.getStage()); pausedScenes.addFirst(activeScene); } activeScene = sceneClass.newInstance(); activeScene.setStartArgs(args); activeScene.create(args); InputSystem.instance().addInputProcessor(activeScene.getStage(), 10); } catch (InstantiationException e) { throw new RuntimeException(e); } catch (IllegalAccessException e) { throw new RuntimeException(e); } } public static void popScene() { if (activeScene != null) { InputSystem.instance().removeInputProcessor(activeScene.getStage()); activeScene.pause(); activeScene.dispose(); activeScene = null; } if (!pausedScenes.isEmpty()) { activeScene = pausedScenes.poll(); activeScene.resume(); InputSystem.instance().addInputProcessor(activeScene.getStage(), 10); Gdx.app.error(TAG, "popScene resumed instance of: " + activeScene.getClass().getSimpleName()); } else { Gdx.app.error(TAG, "popScene says there are no more scenes."); } } public static Scene activeScene() { return activeScene; } public static Scene previousScene() { if (!pausedScenes.isEmpty()) { return pausedScenes.getFirst(); } return null; } public static void restartActiveScene() { if (activeScene != null) { changeScene(activeScene.getClass(), activeScene.getStartArgs()); } } public static void dispose() { activeScene = null; pausedScenes = null; } }