diff --git a/build.gradle b/build.gradle index 6b4db654..d4a45e12 100644 --- a/build.gradle +++ b/build.gradle @@ -96,6 +96,7 @@ dependencies { implementation project(":hyperlap2d-runtime-libgdx") implementation project(":h2d-libgdx-spine-extension") + implementation "com.rafaskoberg.gdx:typing-label:$typingLabelVersion" implementation "com.kotcrab.vis:vis-ui:$visuiVersion" implementation "com.esotericsoftware.spine:spine-libgdx:$spineVersion" implementation "com.mortennobel:java-image-scaling:0.8.5" diff --git a/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/data/LabelVO.java b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/data/LabelVO.java index 6d6e4267..1ff839e1 100644 --- a/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/data/LabelVO.java +++ b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/data/LabelVO.java @@ -3,6 +3,7 @@ package games.rednblack.editor.renderer.data; import com.badlogic.ashley.core.Entity; import games.rednblack.editor.renderer.components.DimensionsComponent; import games.rednblack.editor.renderer.components.label.LabelComponent; +import games.rednblack.editor.renderer.components.label.TypingLabelComponent; public class LabelVO extends MainItemVO { @@ -15,6 +16,7 @@ public class LabelVO extends MainItemVO { public float height = 0; public boolean wrap = false; + public boolean isTyping = false; public LabelVO() { super(); @@ -22,13 +24,14 @@ public class LabelVO extends MainItemVO { public LabelVO(LabelVO vo) { super(vo); - text = new String(vo.text); - style = new String(vo.style); - size = vo.size; - align = vo.align; - width = vo.width; - height = vo.height; - wrap = vo.wrap; + text = new String(vo.text); + style = new String(vo.style); + size = vo.size; + align = vo.align; + width = vo.width; + height = vo.height; + wrap = vo.wrap; + isTyping = vo.isTyping; } @Override @@ -36,12 +39,16 @@ public class LabelVO extends MainItemVO { super.loadFromEntity(entity); LabelComponent labelComponent = entity.getComponent(LabelComponent.class); DimensionsComponent dimensionsComponent = entity.getComponent(DimensionsComponent.class); + TypingLabelComponent typingLabelComponent = entity.getComponent(TypingLabelComponent.class); + text = labelComponent.getText().toString(); style = labelComponent.fontName; size = labelComponent.fontSize; align = labelComponent.labelAlign; wrap = labelComponent.wrap; + isTyping = typingLabelComponent != null; + width = dimensionsComponent.width; height = dimensionsComponent.height; } diff --git a/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/factory/component/LabelComponentFactory.java b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/factory/component/LabelComponentFactory.java index 56d58b77..f2dd1c08 100644 --- a/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/factory/component/LabelComponentFactory.java +++ b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/factory/component/LabelComponentFactory.java @@ -8,6 +8,7 @@ import com.badlogic.gdx.physics.box2d.World; import com.badlogic.gdx.scenes.scene2d.ui.Label.LabelStyle; import games.rednblack.editor.renderer.components.DimensionsComponent; import games.rednblack.editor.renderer.components.label.LabelComponent; +import games.rednblack.editor.renderer.components.label.TypingLabelComponent; import games.rednblack.editor.renderer.data.*; import games.rednblack.editor.renderer.factory.EntityFactory; import games.rednblack.editor.renderer.resources.IResourceRetriever; @@ -54,6 +55,11 @@ public class LabelComponentFactory extends ComponentFactory{ component.setFontScale(multiplier/projectInfoVO.pixelToWorld); entity.add(component); + + if (vo.isTyping) { + TypingLabelComponent typingLabelComponent = engine.createComponent(TypingLabelComponent.class); + entity.add(typingLabelComponent); + } return component; } diff --git a/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/TypingLabelSystem.java b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/TypingLabelSystem.java index 3961027b..7f2482a4 100644 --- a/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/TypingLabelSystem.java +++ b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/TypingLabelSystem.java @@ -27,7 +27,6 @@ public class TypingLabelSystem extends IteratingSystem { if (typingLabelComponent.typingLabel == null) { typingLabelComponent.typingLabel = new TypingLabel(labelComponent.text, labelComponent.style); - BitmapFont font = typingLabelComponent.typingLabel.getBitmapFontCache().getFont(); float fontScaleX = labelComponent.fontScaleX; @@ -37,8 +36,23 @@ public class TypingLabelSystem extends IteratingSystem { typingLabelComponent.typingLabel.setSize(dimensionsComponent.width, dimensionsComponent.height); typingLabelComponent.typingLabel.setWrap(labelComponent.wrap); typingLabelComponent.typingLabel.setAlignment(labelComponent.labelAlign, labelComponent.lineAlign); - } else if (!typingLabelComponent.typingLabel.getOriginalText().equals(labelComponent.text)){ - typingLabelComponent.typingLabel.setText(labelComponent.text); + } else { + if (!typingLabelComponent.typingLabel.getOriginalText().equals(labelComponent.text)){ + typingLabelComponent.typingLabel.setText(labelComponent.text); + } + if (typingLabelComponent.typingLabel.getWrap() != labelComponent.wrap) { + typingLabelComponent.typingLabel.setWrap(labelComponent.wrap); + } + if (typingLabelComponent.typingLabel.getLabelAlign() != labelComponent.labelAlign + || typingLabelComponent.typingLabel.getLineAlign() != labelComponent.lineAlign) { + typingLabelComponent.typingLabel.setAlignment(labelComponent.labelAlign, labelComponent.lineAlign); + } + if (typingLabelComponent.typingLabel.getWidth() != dimensionsComponent.width) { + typingLabelComponent.typingLabel.setWidth(dimensionsComponent.width); + } + if (typingLabelComponent.typingLabel.getHeight() != dimensionsComponent.height) { + typingLabelComponent.typingLabel.setHeight(dimensionsComponent.height); + } } typingLabelComponent.typingLabel.act(deltaTime); diff --git a/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/render/logic/LabelDrawableLogic.java b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/render/logic/LabelDrawableLogic.java index f61302e9..7e5e9f0d 100644 --- a/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/render/logic/LabelDrawableLogic.java +++ b/hyperlap2d-runtime-libgdx/src/main/java/games/rednblack/editor/renderer/systems/render/logic/LabelDrawableLogic.java @@ -53,6 +53,7 @@ public class LabelDrawableLogic implements Drawable { } else { typingLabelComponent.typingLabel.setColor(tmpColor); typingLabelComponent.typingLabel.setPosition(entityTransformComponent.x, entityTransformComponent.y); + typingLabelComponent.typingLabel.setOrigin(entityTransformComponent.originX, entityTransformComponent.originY); typingLabelComponent.typingLabel.draw(batch, 1); } } diff --git a/src/main/java/games/rednblack/editor/view/ui/box/UIMultiPropertyBoxMediator.java b/src/main/java/games/rednblack/editor/view/ui/box/UIMultiPropertyBoxMediator.java index 94b25b0a..f19f82e1 100644 --- a/src/main/java/games/rednblack/editor/view/ui/box/UIMultiPropertyBoxMediator.java +++ b/src/main/java/games/rednblack/editor/view/ui/box/UIMultiPropertyBoxMediator.java @@ -21,6 +21,7 @@ package games.rednblack.editor.view.ui.box; import com.badlogic.ashley.core.Entity; import com.badlogic.gdx.utils.reflect.ClassReflection; import com.badlogic.gdx.utils.reflect.ReflectionException; +import games.rednblack.editor.renderer.components.label.TypingLabelComponent; import games.rednblack.editor.renderer.components.light.LightBodyComponent; import games.rednblack.h2d.common.MsgAPI; import com.puremvc.patterns.mediator.Mediator; @@ -110,6 +111,8 @@ public class UIMultiPropertyBoxMediator extends PanelMediator itemTypeMap = new HashMap<>(); - public static final String POLYGON_COMPONENT_KEY = "Polygon Component"; - public static final String PHYSICS_COMPONENT_KEY = "Physics Component"; - public static final String SHADER_COMPONENT_KEY = "Shader Component"; - public static final String LIGHT_COMPONENT_KEY = "Light Component"; - public static final String TYPING_LABEL_COMPONENT_KEY = "Typing Label Component"; + public static final String POLYGON_COMPONENT_KEY = "Polygon"; + public static final String PHYSICS_COMPONENT_KEY = "Physics"; + public static final String SHADER_COMPONENT_KEY = "Shader"; + public static final String LIGHT_COMPONENT_KEY = "Light"; + public static final String TYPING_LABEL_COMPONENT_KEY = "Typing Label"; final private HashMap> componentClassMap = new HashMap<>(); diff --git a/src/main/java/games/rednblack/editor/view/ui/properties/panels/UIPhysicsProperties.java b/src/main/java/games/rednblack/editor/view/ui/properties/panels/UIPhysicsProperties.java index 65028bbc..6d56843e 100644 --- a/src/main/java/games/rednblack/editor/view/ui/properties/panels/UIPhysicsProperties.java +++ b/src/main/java/games/rednblack/editor/view/ui/properties/panels/UIPhysicsProperties.java @@ -41,7 +41,7 @@ public class UIPhysicsProperties extends UIRemovableProperties { private VisCheckBox fixedRotation; public UIPhysicsProperties() { - super("Physics Component"); + super("Physics"); bodyTypes.put(0, "STATIC"); bodyTypes.put(1, "KINEMATIC"); diff --git a/src/main/java/games/rednblack/editor/view/ui/properties/panels/UIPolygonComponentProperties.java b/src/main/java/games/rednblack/editor/view/ui/properties/panels/UIPolygonComponentProperties.java index e1963cd6..91e981d1 100644 --- a/src/main/java/games/rednblack/editor/view/ui/properties/panels/UIPolygonComponentProperties.java +++ b/src/main/java/games/rednblack/editor/view/ui/properties/panels/UIPolygonComponentProperties.java @@ -47,7 +47,7 @@ public class UIPolygonComponentProperties extends UIRemovableProperties { private VisTextButton pasteBtn; public UIPolygonComponentProperties() { - super("Polygon Component"); + super("Polygon"); } public void initView() { diff --git a/src/main/java/games/rednblack/editor/view/ui/properties/panels/UIShaderProperties.java b/src/main/java/games/rednblack/editor/view/ui/properties/panels/UIShaderProperties.java index 25fba961..fcf2007a 100644 --- a/src/main/java/games/rednblack/editor/view/ui/properties/panels/UIShaderProperties.java +++ b/src/main/java/games/rednblack/editor/view/ui/properties/panels/UIShaderProperties.java @@ -41,7 +41,7 @@ public class UIShaderProperties extends UIRemovableProperties { private VisSelectBox shadersSelector; public UIShaderProperties() { - super("Custom Shader Component"); + super("Custom Shader"); } public void initView(HashMap shaders) { diff --git a/src/main/java/games/rednblack/editor/view/ui/properties/panels/UITypingLabelProperties.java b/src/main/java/games/rednblack/editor/view/ui/properties/panels/UITypingLabelProperties.java new file mode 100644 index 00000000..b30cf3de --- /dev/null +++ b/src/main/java/games/rednblack/editor/view/ui/properties/panels/UITypingLabelProperties.java @@ -0,0 +1,28 @@ +package games.rednblack.editor.view.ui.properties.panels; + +import com.badlogic.gdx.scenes.scene2d.ui.TextButton; +import games.rednblack.editor.HyperLap2DFacade; +import games.rednblack.editor.event.ButtonToNotificationListener; +import games.rednblack.editor.view.ui.properties.UIRemovableProperties; +import games.rednblack.h2d.common.view.ui.StandardWidgetsFactory; + +public class UITypingLabelProperties extends UIRemovableProperties { + + public static final String prefix = "games.rednblack.editor.view.ui.properties.panels.UITypingLabelProperties"; + public static final String CLOSE_CLICKED = prefix + ".CLOSE_CLICKED"; + public static final String RESTART_BUTTON_CLICKED = prefix + ".RESTART_BUTTON_CLICKED"; + + public UITypingLabelProperties() { + super("Typing Label"); + + TextButton restartButton = StandardWidgetsFactory.createTextButton("Restart"); + mainTable.add(restartButton); + + restartButton.addListener(new ButtonToNotificationListener(RESTART_BUTTON_CLICKED)); + } + + @Override + public void onRemove() { + HyperLap2DFacade.getInstance().sendNotification(CLOSE_CLICKED); + } +} diff --git a/src/main/java/games/rednblack/editor/view/ui/properties/panels/UITypingLabelPropertiesMediator.java b/src/main/java/games/rednblack/editor/view/ui/properties/panels/UITypingLabelPropertiesMediator.java new file mode 100644 index 00000000..320cb578 --- /dev/null +++ b/src/main/java/games/rednblack/editor/view/ui/properties/panels/UITypingLabelPropertiesMediator.java @@ -0,0 +1,60 @@ +package games.rednblack.editor.view.ui.properties.panels; + +import com.badlogic.ashley.core.Entity; +import com.puremvc.patterns.observer.Notification; +import games.rednblack.editor.HyperLap2DFacade; +import games.rednblack.editor.controller.commands.RemoveComponentFromItemCommand; +import games.rednblack.editor.renderer.components.label.TypingLabelComponent; +import games.rednblack.editor.renderer.utils.ComponentRetriever; +import games.rednblack.editor.view.ui.properties.UIItemPropertiesMediator; +import games.rednblack.h2d.common.MsgAPI; +import org.apache.commons.lang3.ArrayUtils; + +public class UITypingLabelPropertiesMediator extends UIItemPropertiesMediator { + private static final String TAG = UITypingLabelPropertiesMediator.class.getCanonicalName(); + public static final String NAME = TAG; + + public UITypingLabelPropertiesMediator() { + super(NAME, new UITypingLabelProperties()); + } + + @Override + public String[] listNotificationInterests() { + String[] defaultNotifications = super.listNotificationInterests(); + String[] notificationInterests = new String[]{ + UITypingLabelProperties.CLOSE_CLICKED, + UITypingLabelProperties.RESTART_BUTTON_CLICKED + }; + + return ArrayUtils.addAll(defaultNotifications, notificationInterests); + } + + @Override + public void handleNotification(Notification notification) { + super.handleNotification(notification); + + switch (notification.getName()) { + case UITypingLabelProperties.CLOSE_CLICKED: + HyperLap2DFacade.getInstance().sendNotification(MsgAPI.ACTION_REMOVE_COMPONENT, RemoveComponentFromItemCommand.payload(observableReference, TypingLabelComponent.class)); + break; + case UITypingLabelProperties.RESTART_BUTTON_CLICKED: + restartTypingLabel(); + break; + } + } + + private void restartTypingLabel() { + TypingLabelComponent typingLabelComponent = ComponentRetriever.get(observableReference, TypingLabelComponent.class); + typingLabelComponent.typingLabel.restart(); + } + + @Override + protected void translateObservableDataToView(Entity item) { + + } + + @Override + protected void translateViewToItemData() { + + } +}