package com.uwsoft.editor.renderer.systems.action; import com.badlogic.ashley.core.Entity; import com.badlogic.gdx.graphics.Color; import com.badlogic.gdx.math.Interpolation; import com.uwsoft.editor.renderer.components.ActionComponent; import com.uwsoft.editor.renderer.systems.action.data.*; import com.uwsoft.editor.renderer.systems.action.logic.*; import com.uwsoft.editor.renderer.utils.ComponentRetriever; import java.util.HashMap; /** * Created by Eduard on 10/13/2015. */ public class Actions { public static HashMap<String, ActionLogic> actionLogicMap = new HashMap<String, ActionLogic>(); private static boolean initialized; private static void initialize() throws InstantiationException, IllegalAccessException { registerActionClass(MoveToAction.class); registerActionClass(MoveByAction.class); registerActionClass(SizeToAction.class); registerActionClass(SizeByAction.class); registerActionClass(ScaleToAction.class); registerActionClass(ScaleByAction.class); registerActionClass(RotateToAction.class); registerActionClass(RotateByAction.class); registerActionClass(ColorAction.class); registerActionClass(AlphaAction.class); registerActionClass(RunnableAction.class); registerActionClass(DelayAction.class); registerActionClass(ParallelAction.class); registerActionClass(SequenceAction.class); initialized = true; } public static <T extends ActionLogic> void registerActionClass(Class<T> type) throws IllegalAccessException, InstantiationException { if (!actionLogicMap.containsKey(type.getName())) { actionLogicMap.put(type.getName(), type.newInstance()); } } private static void checkInit() { if (!initialized) try { initialize(); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } } public static ActionData moveTo(float x, float y, float duration) { return moveTo(x, y, duration, null); } public static ActionData moveTo(float x, float y, float duration, Interpolation interpolation) { MoveToData actionData = new MoveToData( interpolation, duration, x, y ); actionData.logicClassName = MoveToAction.class.getName(); return (actionData); } public static ActionData moveBy(float x, float y, float duration) { return moveBy(x, y, duration, null); } public static ActionData moveBy(float x, float y, float duration, Interpolation interpolation) { MoveByData actionData = new MoveByData( interpolation, duration, x, y ); actionData.logicClassName = MoveByAction.class.getName(); return actionData; } static public ActionData run(Runnable runnable) { RunnableData actionData = new RunnableData( runnable ); actionData.logicClassName = RunnableAction.class.getName(); return actionData; } static public RotateToData rotateTo(float end, float duration) { return rotateTo(end, duration, null); } static public RotateToData rotateTo(float end, float duration, Interpolation interpolation) { RotateToData actionData = new RotateToData( interpolation, duration, end ); actionData.logicClassName = RotateToAction.class.getName(); return actionData; } static public RotateByData rotateBy(float amount, float duration) { return rotateBy(amount, duration, null); } static public RotateByData rotateBy(float amount, float duration, Interpolation interpolation) { RotateByData actionData = new RotateByData( interpolation, duration, amount ); actionData.logicClassName = RotateByAction.class.getName(); return actionData; } public static SizeToData sizeTo(float width, float height, float duration) { return sizeTo(width, height, duration, null); } public static SizeToData sizeTo(float width, float height, float duration, Interpolation interpolation) { SizeToData actionData = new SizeToData( interpolation, duration, width, height ); actionData.logicClassName = SizeToAction.class.getName(); return actionData; } public static SizeByData sizeBy(float width, float height, float duration) { return sizeBy(width, height, duration, null); } public static SizeByData sizeBy(float width, float height, float duration, Interpolation interpolation) { SizeByData actionData = new SizeByData( interpolation, duration, width, height ); actionData.logicClassName = SizeByAction.class.getName(); return actionData; } public static ScaleToData scaleTo(float width, float height, float duration) { return scaleTo(width, height, duration, null); } public static ScaleToData scaleTo(float width, float height, float duration, Interpolation interpolation) { ScaleToData actionData = new ScaleToData( interpolation, duration, width, height ); actionData.logicClassName = ScaleToAction.class.getName(); return actionData; } public static ScaleByData scaleBy(float width, float height, float duration) { return scaleBy(width, height, duration, null); } public static ScaleByData scaleBy(float width, float height, float duration, Interpolation interpolation) { ScaleByData actionData = new ScaleByData( interpolation, duration, width, height ); actionData.logicClassName = ScaleByAction.class.getName(); return actionData; } public static ColorData color(Color color, float duration) { return color(color, duration, null); } public static ColorData color(Color color, float duration, Interpolation interpolation) { ColorData colorData = new ColorData( interpolation, duration, color ); colorData.logicClassName = ColorAction.class.getName(); return colorData; } public static AlphaData alpha(float alpha, float duration) { return alpha(alpha, duration, null); } public static AlphaData alpha(float alpha, float duration, Interpolation interpolation) { AlphaData alphaData = new AlphaData( interpolation, duration, alpha ); alphaData.logicClassName = AlphaAction.class.getName(); return alphaData; } public static AlphaData fadeIn(float duration) { return alpha(1, duration, null); } public static AlphaData fadeIn(float duration, Interpolation interpolation) { return alpha(1, duration, interpolation); } public static AlphaData fadeOut(float duration) { return alpha(0, duration, null); } public static AlphaData fadeOut(float duration, Interpolation interpolation) { return alpha(0, duration, interpolation); } public static DelayData delay(float duration) { DelayData delayData = new DelayData( duration ); delayData.logicClassName = DelayAction.class.getName(); return delayData; } static public ParallelData parallel(ActionData... actionDatas) { ParallelData actionData = new ParallelData(actionDatas); actionData.logicClassName = ParallelAction.class.getName(); return actionData; } static public SequenceData sequence(ActionData... actionDatas) { SequenceData actionData = new SequenceData(actionDatas); actionData.logicClassName = SequenceAction.class.getName(); return actionData; } public static void addAction(final Entity entity, ActionData data) { checkInit(); ActionComponent actionComponent; actionComponent = ComponentRetriever.get(entity, ActionComponent.class); if (actionComponent == null) { actionComponent = new ActionComponent(); entity.add(actionComponent); } actionComponent.dataArray.add(data); } public static void removeActions(Entity entity) { ActionComponent actionComponent = ComponentRetriever.get(entity, ActionComponent.class); if (actionComponent != null) { actionComponent.dataArray.clear(); // action component with empty data array will be removed later by ActionSystem } } public static void removeAction(Entity entity, ActionData data) { ActionComponent actionComponent = ComponentRetriever.get(entity, ActionComponent.class); if (actionComponent != null) { if (actionComponent.dataArray.contains(data, true)) { actionComponent.dataArray.removeValue(data, true); } } } }