package scene2d; import scene3d.Actor3d; import scene3d.Group3d; import scene3d.Stage3d; import com.badlogic.gdx.ApplicationListener; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.InputMultiplexer; import com.badlogic.gdx.graphics.Color; import com.badlogic.gdx.graphics.GL20; import com.badlogic.gdx.graphics.PerspectiveCamera; import com.badlogic.gdx.graphics.g2d.Batch; import com.badlogic.gdx.graphics.glutils.ShapeRenderer; import com.badlogic.gdx.graphics.glutils.ShapeRenderer.ShapeType; import com.badlogic.gdx.math.Intersector; import com.badlogic.gdx.math.MathUtils; import com.badlogic.gdx.math.Rectangle; import com.badlogic.gdx.math.Vector2; import com.badlogic.gdx.scenes.scene2d.Actor; import com.badlogic.gdx.scenes.scene2d.Group; import com.badlogic.gdx.scenes.scene2d.InputEvent; import com.badlogic.gdx.scenes.scene2d.Touchable; import com.badlogic.gdx.scenes.scene2d.actions.Actions; import com.badlogic.gdx.scenes.scene2d.ui.Dialog; import com.badlogic.gdx.scenes.scene2d.ui.Image; import com.badlogic.gdx.scenes.scene2d.ui.Label; import com.badlogic.gdx.scenes.scene2d.ui.Table; import com.badlogic.gdx.scenes.scene2d.utils.ClickListener; import com.badlogic.gdx.scenes.scene2d.utils.TextureRegionDrawable; import com.badlogic.gdx.utils.ArrayMap; import com.badlogic.gdx.utils.Json; import com.badlogic.gdx.utils.JsonReader; import com.badlogic.gdx.utils.JsonValue; import com.badlogic.gdx.utils.Scaling; import com.badlogic.gdx.utils.StringBuilder; import com.badlogic.gdx.utils.Timer; import com.badlogic.gdx.utils.Timer.Task; abstract public class Scene extends Group { /* The array map containing all the scenes data of the game*/ public static final ArrayMap<String, String> scenesMap = new ArrayMap<String, String>(); private String sceneName = ""; public String sceneBackground = "None"; public String sceneMusic = "None"; public String sceneTransition = "None"; public float sceneDuration = 0; public InterpolationType sceneInterpolationType = InterpolationType.Linear; public static Color bgColor = new Color(1f,1f,1f,1f); public static JsonValue configJson = null; public static final JsonReader jsonReader = new JsonReader(); public static final Json json = new Json(); public static float splashDuration = 0f; public static boolean pauseState = false; /*Important: * The Target Width and Target Height refer to the nominal width and height of the game for the * graphics which are created for this width and height, this allows for the Stage to scale this * graphics for all screen width and height. Therefore your game will work on all screen sizes * but maybe blurred or look awkward on some devices. * ex: * My Game targetWidth = 800 targetHeight = 480 * Then my game works perfectly for SCREEN_WIDTH = 800 SCREEN_HEIGHT = 480 * and on others screen sizes it is just zoomed/scaled but works fine thats all */ public static float targetWidth = 800; public static float targetHeight = 480; public static boolean debug = false; public final static Vector2 mouse = new Vector2(); private static Scene currentScene = null; private static int sceneIndex = 0; public static ClassLoader cl = null; public static com.badlogic.gdx.scenes.scene2d.Stage stage2d; public static Stage3d stage3d; private static Label fpsLabel; private static InputMultiplexer inputMux; public static int mousePointer = 0; public static int mouseButton = 0; public static boolean cullingEnabled = false; public static boolean isDirty = false; public static String basePackage = "source."; public Scene(){ setTouchable(Touchable.childrenOnly); Camera.reset(); stage2d.clear(); stage3d.clear(); stage2d.addListener(touchInput); setSize(targetWidth, targetHeight); setBounds(0,0, targetWidth, targetHeight); setColor(1f, 1f, 1f, 1f); setVisible(true); stage2d.getRoot().setPosition(0, 0); stage2d.getRoot().setVisible(true); stage3d.getRoot().setPosition(0, 0, 0); stage3d.getRoot().setVisible(true); sceneName = this.getClass().getName(); setName(sceneName); Scene.log("Current Scene: "+sceneName); currentScene = this; load(sceneName); cullingEnabled = true; } @Override public void act(float delta){ super.act(delta); if (fpsLabel != null) fpsLabel.setText("Fps: " + Gdx.graphics.getFramesPerSecond()); } public abstract void onClick(Actor actor); public abstract void onTouchDown(Actor actor); public abstract void onTouchUp(); public abstract void onDragged(); public abstract void onGesture(GestureType gestureType); public abstract void onKeyTyped(char key); public abstract void onKeyUp(int keycode); public abstract void onKeyDown(int keycode); /* * This will pause any music and stop any sound being played * and will fire the Pause event */ public abstract void onPause(); /* * This will resume any music currently being played * and will fire the Resume event */ public abstract void onResume(); public abstract void onDispose(); public void load(String sceneName){ log("Load "+sceneName); if(!sceneName.contains(basePackage) && !sceneName.contains("gdxstudio")) sceneName = basePackage+sceneName; String[] lines = scenesMap.get(sceneName).split("\n"); for(String line: lines){ if(line.trim().isEmpty()) continue; json.fromJson(null, line); //log(line); } if(!sceneBackground.equals("None")) setBackground(sceneBackground); if(!sceneMusic.equals("None")) Asset.musicPlay(sceneMusic); if(!sceneTransition.equals("None")) Effect.createEffect(Scene.getRoot(), EffectType.valueOf(sceneTransition), 1f, sceneDuration, sceneInterpolationType); } protected void save(){ save(sceneName); } public void save(String sceneName){ if(!isDirty) return; if(sceneName == null || sceneName.isEmpty()) return; Scene.log("Save "+sceneName); if(!sceneName.contains(basePackage) && !sceneName.contains("gdxstudio")) sceneName = basePackage+sceneName; StringBuilder sb = new StringBuilder(); for(Actor actor: getChildren()){ sb.append(json.toJson(actor)); sb.append("\n"); } sb.append(json.toJson(getRoot().findActor(this.sceneName)));//??Warning scenesMap.put(sceneName, sb.toString()); Gdx.files.local(Asset.basePath+"scene").writeString(json.toJson(scenesMap, ArrayMap.class, String.class), false); sb = null; isDirty = false; } /** * Set the current scene to be displayed * @param className The scene's Class Name **/ public static void setScene(String className){ if(!className.contains(basePackage) && !className.contains("gdxstudio")) className = basePackage+className; if(!scenesMap.containsKey(className)){ log(className+": Scene Does not Exist"); return; } /* * Every time the scene Changes disable panning/following/listening as it can cause the * camera to move around aimlessly, thus abrupting the scene and clear * all the listeners/huds that were registered in the previous scene */ sceneIndex = Scene.scenesMap.keys().toArray().indexOf(className, false); if(currentScene != null) currentScene.onDispose(); try { if(cl != null) cl.loadClass(className).newInstance(); else Class.forName(className).newInstance(); } catch (InstantiationException e) { log("Scene cannot be created , Check if scene class constructor is empty"); e.printStackTrace(); } catch (IllegalAccessException e) { log("Scene cannot be created , Check if scene class can be found"); e.printStackTrace(); } catch (ClassNotFoundException e) { log("Scene cannot be created , Check if scene class can be found"); e.printStackTrace(); } //if (fpsLabel != null && configJson.getBoolean("showFPS")){ // fpsLabel.setPosition(targetWidth - 80, targetHeight - 20); // Camera.addHud(fpsLabel); //} } /** * Set the current scene to be displayed with an amount of delay * @param className The registered scene's name **/ public static void setSceneWithDelay(final String className, float delay){ Timer.schedule(new Task(){ @Override public void run() { setScene(className); } }, delay); } /** * Returns the current scene being Displayed on stage **/ public static Scene getCurrentScene(){ return currentScene; } /** * Changes to the next scene in the scnesList **/ public static void nextScene(){ if(sceneIndex <= scenesMap.size) sceneIndex++; setScene(scenesMap.getKeyAt(sceneIndex)); } /** * Changes to the previous scene in the scnesList **/ public static void prevScene(){ if(sceneIndex >= 0) sceneIndex--; setScene(scenesMap.getKeyAt(sceneIndex)); } /** * Changes to the next scene in the scnesList **/ public static void nextSceneWithDelay(float delay){ if(sceneIndex <= scenesMap.size) sceneIndex++; setSceneWithDelay(Scene.scenesMap.getKeyAt(sceneIndex), delay); } /** * Changes to the previous scene in the scnesList **/ public static void prevSceneWithDelay(float delay){ if(sceneIndex >= 0) sceneIndex--; setSceneWithDelay(scenesMap.getKeyAt(sceneIndex), delay); } private static Image imgbg = null; public void setBackground(String texName) { if(imgbg != null) removeBackground(); if(Asset.tex(texName) != null){ imgbg = new Image(new TextureRegionDrawable(Asset.tex(texName)), Scaling.stretch); imgbg.setFillParent(true); stage2d.addActor(imgbg); imgbg.toBack(); } } public void removeBackground() { getRoot().removeActor(imgbg); } public static Group getRoot(){ return stage2d.getRoot(); } public void addActor(Actor actor, float x, float y){ if(actor != null){ actor.setPosition(x, y); addActor(actor); } } public void addActorWithDelay(final Actor actor, float delay){ Timer.schedule(new Task(){ @Override public void run() { addActor(actor); } }, delay); } public boolean removeActor(String actorName){ return removeActor(findActor(actorName)); } public void removeActorWithDelay(Actor actor, float delay){ addAction(Actions.sequence(Actions.delay(delay), Actions.removeActor(actor))); } public Actor hit(float x, float y){ return hit(x, y, true); } /* Dragging Camera Related */ static boolean gestureStarted = false; static Actor validActor = null; private final ClickListener touchInput = new ClickListener(){ @Override public void clicked(InputEvent event, float x, float y){ super.clicked(event, x, y); mouse.set(x, y); validActor = hit(x,y); if(validActor != null && validActor.getName() != null) Scene.getCurrentScene().onClick(validActor); } @Override public boolean touchDown(InputEvent event, float x, float y, int pointer, int button){ mouse.set(x, y); mousePointer = pointer; mouseButton = button; touchInitialX = x; touchInitialY = y; gestureStarted = true; validActor = hit(x,y); if(validActor != null && validActor.getName() != null) Scene.getCurrentScene().onTouchDown(validActor); return super.touchDown(event, x, y, pointer, button); } @Override public void touchDragged(InputEvent event, float x, float y, int pointer){ super.touchDragged(event, x, y, pointer); mouse.set(x, y); mousePointer = pointer; Scene.getCurrentScene().onDragged(); if(gestureStarted == true){ touchCurrentX = x; touchCurrentY = y; if(getGestureDirection() != GestureType.None){ gestureStarted = false; Scene.getCurrentScene().onGesture(getGestureDirection()); } } if(Camera.useDrag) Camera.dragCam((int)x, (int)-y); } @Override public void touchUp(InputEvent event, float x, float y, int pointer, int button){ super.touchUp(event, x, y, pointer, button); mouse.set(x, y); mousePointer = pointer; mouseButton = button; // reset Gesture difX = 0.0f; difY = 0.0f; touchInitialX = 0.0f; touchInitialY = 0.0f; touchCurrentX = 0.0f; touchCurrentY = 0.0f; touchDifX = 0.0f; touchDifY = 0.0f; prevDifX = 0.0f; prevDifY = 0.0f; // reset Gesture Scene.getCurrentScene().onTouchUp(); Camera.resetDrag(); gestureStarted = false; } @Override public boolean keyTyped(InputEvent event, char key) { Scene.getCurrentScene().onKeyTyped(key); return super.keyUp(event, key); } @Override public boolean keyUp(InputEvent event, int keycode) { Scene.getCurrentScene().onKeyUp(keycode); return super.keyUp(event, keycode); } @Override public boolean keyDown(InputEvent event, int keycode) { Scene.getCurrentScene().onKeyDown(keycode); return super.keyDown(event, keycode); } }; /* * Gesture related */ public static float touchDragIntervalRange = 200f; // 200px drag for a gesture event public static float touchInitialX = 0.0f, touchInitialY = 0.0f; public static float touchCurrentX = 0.0f, touchCurrentY = 0.0f; public static float difX; public static float difY; public static float prevDifX; public static float prevDifY; public static float touchDifX; public static float touchDifY; public boolean isTouchDragInterval() { difX = java.lang.Math.abs(touchInitialX - touchCurrentX); difY = java.lang.Math.abs(touchInitialY - touchCurrentY); if (difX > touchDragIntervalRange || difY > touchDragIntervalRange) return true; else return false; } public static GestureType getGestureDirection() { prevDifX = difX; prevDifY = difY; difX = java.lang.Math.abs(touchInitialX - touchCurrentX); difY = java.lang.Math.abs(touchInitialY - touchCurrentY); /** * Get minimal changes on drag * <p> checkMomentumChanges * EXAMPLE<br> * User drags finger to left, suddenly dragging to right without removing * his finger from the screen * */ if (prevDifX > difX || prevDifY > difY) { touchInitialX = touchCurrentX; touchInitialY = touchCurrentY; // difX = 0.0f; difY = 0.0f; prevDifX = 0.0f; prevDifY = 0.0f; /** * Set touch differences, optional, if you need amount of change from * initial touch to drag, USE THIS: on touchDrag, pan or similar mthods * */ touchDifX = java.lang.Math.abs(touchInitialX - touchCurrentX); touchDifY = java.lang.Math.abs(touchInitialY - touchCurrentY); } if (touchInitialY < touchCurrentY && difY > difX) { return GestureType.Up; } else if (touchInitialY > touchCurrentY && difY > difX) { return GestureType.Down; } else if (touchInitialX < touchCurrentX && difY < difX) { return GestureType.Right; } else if (touchInitialX > touchCurrentX && difY < difX) { return GestureType.Left; } else { return GestureType.None; } } /* * Dialog Methods */ public void showToast(String message, float duration){ Table table = new Table(Asset.skin); table.add(" "+message+" "); table.setBackground(Asset.skin.getDrawable("dialogDim")); table.pack(); table.setPosition(Scene.targetWidth/2 - table.getWidth(), Scene.targetHeight/2 - table.getHeight()); addActor(table); table.addAction(Actions.sequence(Actions.delay(duration), Actions.removeActor(table))); } public void showMessageDialog(String title, String message){ Dialog dialog = new Dialog(title, Asset.skin); dialog.getContentTable().add(message); dialog.button("OK", "OK"); dialog.pack(); dialog.show(getStage()); } public boolean showConfirmDialog(String title, String message){ Dialog dialog = new Dialog(title, Asset.skin); dialog.button("Yes", "Yes"); dialog.button("No", "No"); dialog.pack(); dialog.show(getStage()); //if(dialog.result().equals("Yes")) FIXME update Gdx // return true; return false; } public void outline(Actor actor){ selectionBox.setPosition(actor.getX(), actor.getY()); selectionBox.setSize(actor.getWidth(), actor.getHeight()); stage2d.addActor(selectionBox); } /*********************************************************************************************************** * 3d Related Functions * ************************************************************************************************************/ public static void addActor3d(Actor3d actor3d){ stage3d.addActor3d(actor3d); } public static void removeActor3d(Actor3d actor3d){ stage3d.getRoot().removeActor3d(actor3d); } public static void removeActor3d(String actor3dName){ getRoot3d().removeActor3d(stage3d.getRoot().findActor(actor3dName)); } public static Group3d getRoot3d(){ return stage3d.getRoot(); } public static void getChildren3d(){ stage3d.getActors3d(); } public static void resetCamera3d(){ stage3d.getCamera().position.set(10f, 10f, 10f); stage3d.getCamera().lookAt(0,0,0); stage3d.getCamera().near = 0.1f; stage3d.getCamera().far = 300f; } public static PerspectiveCamera getCamera3d(){ return stage3d.getCamera(); } public static void log(String log) { if(Scene.configJson.getBoolean("loggingEnabled")) Gdx.app.log("Stage ", log); } /*********************************************************************************************************** * Utilities Related Functions * ************************************************************************************************************/ /* * The the angle in degrees of the inclination of a line * @param cx, cy The center point x, y * @param tx, ty The target point x, y */ public static float getAngle(float cx, float cy, float tx, float ty) { float angle = (float) Math.toDegrees(MathUtils.atan2(tx - cx, ty - cy)); //if(angle < 0){ // angle += 360; //} return angle; } private static Vector2 distVector = new Vector2(); public static final float getDistance(Actor a, Actor b){ distVector.set(a.getX(), a.getY()); return distVector.dst(b.getX(), b.getY()); } public static final float getDistance(float x1, float y1, float x2, float y2){ distVector.set(x1, y1); return distVector.dst(x2, y2); } /* * Capitalizes the First Letter of a String */ public static String capitalize(String text){ if(text != null && text != "") return (text.substring(0, 1)).toUpperCase() + text.substring(1); else return ""; } /* * UnCapitalizes the First Letter of a String */ public static String uncapitalize(String text){ return text.substring(0, 1).toLowerCase()+text.substring(1); } public static Rectangle getBounds(Actor actor) { float posX = actor.getX(); float posY = actor.getY(); float width = actor.getWidth(); float height = actor.getHeight(); return new Rectangle(posX, posY, width, height); } public static boolean collides(Actor actor, float x, float y) { Rectangle rectA1 = getBounds(actor); Rectangle rectA2 = new Rectangle(x, y, 5, 5); // Check if rectangles collides if (Intersector.overlaps(rectA1, rectA2)) { return true; } else { return false; } } public static boolean collides(Actor actor1, Actor actor2) { Rectangle rectA1 = getBounds(actor1); Rectangle rectA2 = getBounds(actor2); // Check if rectangles collides if (Intersector.overlaps(rectA1, rectA2)) { return true; } else { return false; } } /** * Get screen time from start in format of HH:MM:SS. It is calculated from * "secondsTime" parameter. * */ public static String toScreenTime(float secondstime) { int seconds = (int)(secondstime % 60); int minutes = (int)((secondstime / 60) % 60); int hours = (int)((secondstime / 3600) % 24); return new String(addZero(hours) + ":" + addZero(minutes) + ":" + addZero(seconds)); } private static String addZero(int value){ String str = ""; if(value < 10) str = "0" + value; else str = "" + value; return str; } /* * TEA Encryption and Decryption */ public static String encryptKey = "Default"; private static final int encryptDelta = 0x9E3779B9; private static final int MX(int sum, int y, int z, int p, int e, int[] k) { return (z >>> 5 ^ y << 2) + (y >>> 3 ^ z << 4) ^ (sum ^ y) + (k[p & 3 ^ e] ^ z); } public static final byte[] encrypt(String data) { return encrypt(data.getBytes(), encryptKey.getBytes()); } public static final byte[] decrypt(String data) { return decrypt(data.getBytes(), encryptKey.getBytes()); } public static final byte[] encrypt(String data, String key) { return encrypt(data.getBytes(), key.getBytes()); } public static final byte[] decrypt(String data, String key) { return decrypt(data.getBytes(), key.getBytes()); } private static final byte[] encrypt(byte[] data, byte[] key) { if (data.length == 0) return data; return toByteArray(encrypt(toIntArray(data, true), toIntArray(key, false)), false); } private static final byte[] decrypt(byte[] data, byte[] key) { if (data.length == 0) return data; return toByteArray(decrypt(toIntArray(data, false), toIntArray(key, false)), true); } private static final int[] encrypt(int[] v, int[] k) { int n = v.length - 1; if (n < 1) { return v; } if (k.length < 4) { int[] key = new int[4]; System.arraycopy(k, 0, key, 0, k.length); k = key; } int z = v[n], y = v[0], sum = 0, e; int p, q = 6 + 52 / (n + 1); while (q-- > 0) { sum = sum + encryptDelta; e = sum >>> 2 & 3; for (p = 0; p < n; p++) { y = v[p + 1]; z = v[p] += MX(sum, y, z, p, e, k); } y = v[0]; z = v[n] += MX(sum, y, z, p, e, k); } return v; } private static final int[] decrypt(int[] v, int[] k) { int n = v.length - 1; if (n < 1) { return v; } if (k.length < 4) { int[] key = new int[4]; System.arraycopy(k, 0, key, 0, k.length); k = key; } int z = v[n], y = v[0], sum, e; int p, q = 6 + 52 / (n + 1); sum = q * encryptDelta; while (sum != 0) { e = sum >>> 2 & 3; for (p = n; p > 0; p--) { z = v[p - 1]; y = v[p] -= MX(sum, y, z, p, e, k); } z = v[n]; y = v[0] -= MX(sum, y, z, p, e, k); sum = sum - encryptDelta; } return v; } private static final int[] toIntArray(byte[] data, boolean includeLength) { int n = (((data.length & 3) == 0) ? (data.length >>> 2) : ((data.length >>> 2) + 1)); int[] result; if (includeLength) { result = new int[n + 1]; result[n] = data.length; } else { result = new int[n]; } n = data.length; for (int i = 0; i < n; i++) { result[i >>> 2] |= (0x000000ff & data[i]) << ((i & 3) << 3); } return result; } private static final byte[] toByteArray(int[] data, boolean includeLength) { int n = data.length << 2; if (includeLength) { int m = data[data.length - 1]; if (m > n) { return null; } else { n = m; } } byte[] result = new byte[n]; for (int i = 0; i < n; i++) { result[i] = (byte) ((data[i >>> 2] >>> ((i & 3) << 3)) & 0xff); } return result; } private static ShapeRenderer shapeRenderer; private final static Actor selectionBox = new Actor(){ @Override public void draw(Batch batch, float alpha){ batch.end(); shapeRenderer.begin(ShapeType.Line); shapeRenderer.setColor(Color.GREEN); shapeRenderer.rect(getX(), getY(), getWidth(),getHeight()); shapeRenderer.end(); batch.begin(); } }; static void setupFps(){ fpsLabel = new Label("", Asset.skin); fpsLabel.setName("Fps"); } public static float stateTime = 0; public static float gameUptime = 0; private static float startTime = System.nanoTime(); /* * The main application listener for the game */ public static ApplicationListener app = new ApplicationListener() { public int dots = 40; public int xlines; public int ylines; @Override public final void create() { log("Create"); Config.setup(); Serializer.setup(); stage2d = new com.badlogic.gdx.scenes.scene2d.Stage(Gdx.graphics.getWidth(), Gdx.graphics.getHeight(), Scene.configJson.getBoolean("keepAspectRatio")); stage2d.getRoot().setName("Root"); stage2d.getRoot().setTouchable(Touchable.childrenOnly); stage2d.setCamera(new Camera()); inputMux = new InputMultiplexer(); inputMux.addProcessor(stage2d); stage3d = new Stage3d(); //camController = new CameraInputController(stage3d.getCamera()); //inputMux.addProcessor(stage3d); //inputMux.addProcessor(camController); shapeRenderer = new ShapeRenderer(); selectionBox.setTouchable(Touchable.disabled); selectionBox.setName("Shape"); JsonValue sv = Scene.jsonReader.parse(Gdx.files.internal(Asset.basePath+"scene")); for(JsonValue jv: sv.iterator()) scenesMap.put(jv.name, jv.asString()); setScene(scenesMap.firstKey()); Gdx.input.setCatchBackKey(true); Gdx.input.setCatchMenuKey(true); Gdx.input.setInputProcessor(inputMux); xlines = (int)Gdx.graphics.getWidth()/dots; ylines = (int)Gdx.graphics.getHeight()/dots; } /* * This is the main rendering call that updates the time, updates the stage, * loads assets asynchronously, updates the camera and FPS text. */ @Override public final void render(){ Gdx.gl.glClearColor(bgColor.r, bgColor.g, bgColor.b, bgColor.a); Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT |GL20.GL_DEPTH_BUFFER_BIT); if (System.nanoTime() - startTime >= 1000000000) { gameUptime +=1 ; startTime = System.nanoTime(); } stateTime += Gdx.graphics.getDeltaTime(); Asset.load(); stage3d.act(); stage3d.draw(); //camController.update(); Scene.stage2d.act();//Gdx.graphics.getDeltaTime(); Scene.stage2d.draw(); if(debug){ shapeRenderer.begin(ShapeType.Point); shapeRenderer.setColor(Color.BLACK); for(int i = 0; i<=xlines; i++) for(int j = 0; j<=ylines; j++) shapeRenderer.point(2+i*dots, j*dots, 0); shapeRenderer.end(); } } @Override public final void resize(int width, int height) { log("Resize"); stage2d.setViewport(targetWidth, targetHeight, configJson.getBoolean("keepAspectRatio")); stage3d.setViewport(targetWidth, targetHeight, configJson.getBoolean("keepAspectRatio")); } @Override public final void pause() { log("Pause"); Asset.musicPause(); Asset.soundStop(); Scene.pauseState = true; Scene.getCurrentScene().onPause(); } @Override public final void resume() { log("Resume"); Asset.musicResume(); Scene.pauseState = false; Scene.getCurrentScene().onResume(); } @Override public final void dispose() { log("Dispose"); Scene.getCurrentScene().onDispose(); Scene.stage2d.dispose(); Asset.unloadAll(); Gdx.app.exit(); } }; public static final void exit(){ log("Disposing and Exiting"); getCurrentScene().onDispose(); stage2d.dispose(); stage3d.dispose(); Asset.unloadAll(); Gdx.app.exit(); } public enum GestureType { None, Up, Down, Left, Right } public enum OnEventType { DoEffect, SetScene } }