Skip to content
Snippets Groups Projects
Commit 405b6861 authored by Matyáš Latner's avatar Matyáš Latner
Browse files

#45 Tutorial game steps and actions highliting

parent 128e677e
No related branches found
No related tags found
No related merge requests found
Showing
with 217 additions and 148 deletions
core/assets/common/_global/application/button/tablexiabutton_blank_blue_solarized.9.png

5.47 KiB

core/assets/common/_global/application/button/tablexiabutton_blank_green_solarized.9.png

5.17 KiB

core/assets/common/_global/application/button/tablexiabutton_blank_red_solarized.9.png

5.95 KiB

......@@ -336,6 +336,7 @@ public class Tablexia extends TablexiaApplication {
TablexiaButton button = new TablexiaButton(new NinePatchDrawable(new NinePatch(new Texture(Gdx.files.internal(unpressed)))),
new NinePatchDrawable(new NinePatch(new Texture(Gdx.files.internal(pressed)))),
null,
null,
ApplicationTextManager.getInstance().getText(textKey));
createButton(button, clickListener);
......
......@@ -12,6 +12,7 @@ import com.badlogic.gdx.scenes.scene2d.utils.ClickListener;
import com.badlogic.gdx.utils.Align;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
......@@ -29,7 +30,6 @@ import cz.nic.tablexia.game.games.in_the_darkness.map.mapobject.MapObject;
import cz.nic.tablexia.game.games.in_the_darkness.map.mapobject.MapObjectType;
import cz.nic.tablexia.game.games.in_the_darkness.map.tile.Tile;
import cz.nic.tablexia.game.games.in_the_darkness.map.widget.MapWidget;
import cz.nic.tablexia.model.User;
import cz.nic.tablexia.util.ScaleUtil;
import cz.nic.tablexia.util.ui.TablexiaButton;
......@@ -159,6 +159,11 @@ public class InTheDarknessGame extends AbstractTablexiaGame<Void> implements Map
private static final String SCORE2_TEXT_KEY = "score_2";
private static final String SCORE3_TEXT_KEY = "score_3";
public static final List<ActionType> TUTORIAL_STEPS = Arrays.asList(new ActionType[]{ActionType.GO,
ActionType.RIGHT,
ActionType.DOOR,
ActionType.GO});
private Group contentGroup;
......@@ -421,7 +426,7 @@ public class InTheDarknessGame extends AbstractTablexiaGame<Void> implements Map
private void goToPlayMode() {
setGameScore(SCORE_KEY_PLANNING_DURATION, getGameScoreFloat(SCORE_KEY_PLANNING_DURATION, 0f) + (System.currentTimeMillis() - planningStartTime - getGame().getAllPausesDuration()));
startButton.setDisabled(true);
disableStartButton(true);
actionsWidget.disableActions();
actionsStripWidget.disableControl();
showDimmer();
......@@ -465,6 +470,7 @@ public class InTheDarknessGame extends AbstractTablexiaGame<Void> implements Map
startGameSequence();
}
});
startButton.setDisabled(true);
GameLayer.BUTTON_LAYER.getLayerEntity().addActor(startButton);
return startButton;
}
......@@ -474,8 +480,8 @@ public class InTheDarknessGame extends AbstractTablexiaGame<Void> implements Map
// GameLayer.BACKGROUND_TEXTURE_LAYER.getLayerEntity().attachChild(actionStripBackground);
ActionsStripWidget actionStripWidget = new ActionsStripWidget(ACTION_STRIP_WIDGET_WIDTH, contentGroup.getHeight(), this);
actionStripWidget.setPosition(getStage().getWidth() - actionStripWidget.getWidth(), -SCREEN_Y_CORRECTION_OFFSET);
// actionStripWidget.enableActionSorting(getInTheDarknessDifficulty() != PotmeDifficulty.TUTORIAL);
// actionStripWidget.enableStartButtonControl(getInTheDarknessDifficulty() != PotmeDifficulty.TUTORIAL);
actionStripWidget.enableActionSorting(getInTheDarknessDifficulty() != InTheDarknessDifficulty.TUTORIAL);
actionStripWidget.enableStartButtonControl(getInTheDarknessDifficulty() != InTheDarknessDifficulty.TUTORIAL);
GameLayer.ACTION_STRIP_LAYER.getLayerEntity().addActor(actionStripWidget);
return actionStripWidget;
}
......@@ -488,6 +494,15 @@ public class InTheDarknessGame extends AbstractTablexiaGame<Void> implements Map
return widget;
}
public void disableStartButton(boolean disabled) {
startButton.setDisabled(disabled);
highliteStartButton(false);
}
public void highliteStartButton(boolean enableBlinking) {
startButton.highliteButton(enableBlinking);
}
//////////////////////////////////////////// MAP WIDGET
......@@ -747,19 +762,23 @@ public class InTheDarknessGame extends AbstractTablexiaGame<Void> implements Map
GameLayer.FADE_LAYER.getLayerEntity().addActor(dimmer);
}
private void showDimmer() {
dimmer.addAction(alpha(0));
dimmer.setVisible(true);
dimmer.addAction(alpha(FADE_ALPHA, FADE_DURATION, FADE_IN_INTERPOLATION));
public void showDimmer() {
if (!dimmer.isVisible()) {
dimmer.addAction(alpha(0));
dimmer.setVisible(true);
dimmer.addAction(alpha(FADE_ALPHA, FADE_DURATION, FADE_IN_INTERPOLATION));
}
}
private void hideDimmer() {
dimmer.addAction(sequence(alpha(0, FADE_DURATION), run(new Runnable() {
@Override
public void run() {
dimmer.setVisible(false);
}
})));
public void hideDimmer() {
if (dimmer.isVisible()) {
dimmer.addAction(sequence(alpha(0, FADE_DURATION), run(new Runnable() {
@Override
public void run() {
dimmer.setVisible(false);
}
})));
}
}
......
......@@ -26,6 +26,7 @@ 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.MoveToAction;
import com.badlogic.gdx.scenes.scene2d.actions.RunnableAction;
import com.badlogic.gdx.scenes.scene2d.ui.Image;
......@@ -660,6 +661,7 @@ public class ActionsStripWidget extends Group implements ActionListener {
// action.setClickable(scene);
action.setActionsStripWidget(this);
action.addActionListener(this);
action.setTouchable(enableActionSorting ? Touchable.enabled : Touchable.disabled);
return action;
}
......
......@@ -19,9 +19,10 @@
package cz.nic.tablexia.game.games.in_the_darkness.action.widget;
import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.graphics.g2d.TextureRegion;
import com.badlogic.gdx.math.Vector2;
import com.badlogic.gdx.scenes.scene2d.Group;
import com.badlogic.gdx.scenes.scene2d.actions.RepeatAction;
import com.badlogic.gdx.scenes.scene2d.ui.Image;
import java.util.ArrayList;
......@@ -35,6 +36,9 @@ import cz.nic.tablexia.game.games.in_the_darkness.action.ActionType;
import cz.nic.tablexia.game.games.in_the_darkness.assets.InTheDarknessAssets;
import static com.badlogic.gdx.scenes.scene2d.actions.Actions.delay;
import static com.badlogic.gdx.scenes.scene2d.actions.Actions.fadeIn;
import static com.badlogic.gdx.scenes.scene2d.actions.Actions.fadeOut;
import static com.badlogic.gdx.scenes.scene2d.actions.Actions.forever;
import static com.badlogic.gdx.scenes.scene2d.actions.Actions.run;
import static com.badlogic.gdx.scenes.scene2d.actions.Actions.sequence;
......@@ -48,8 +52,7 @@ public class ActionsWidget extends Group implements ActionListener {
public enum ActionLayer {
BACKGROUND_LAYER (0),
ACTIONS_LAYER (1),
INFO_LAYER (2);
ACTIONS_LAYER (1);
private Group layerEntity;
private int layerZIndex;
......@@ -77,84 +80,50 @@ public class ActionsWidget extends Group implements ActionListener {
containerGroup.addActor(group);
group.setZIndex(actionLayer.getLayerZIndex());
}
// containerGroup.sortChildren();
}
}
private static final float TUTORIAL_INFO_ARROW_BLINK_DURATION = 0.3f;
private static final float TUTORIAL_INFO_ARROW_FADEIN_DELAY = 0.5f;
private static final int TOP_Z_INDEX = ActionType.values().length + 1;
private static final float BACKGROUND_WIDTH_RATIO = 1.3f;
private static final double BACKGROUND_Y_POSITION_RATIO = 0.9;
private static final float START_ANIMATION_DELAY = 0.15f;
private static final int NUMBER_OF_COLUMNS = 2;
public static final int ACTION_OFFSET = InTheDarknessGame.ACTION_SIZE_SMALLER / 10;
private static final float DIMMER_ALPHA = 0.5f;
private static final Color DIMMER_COLOR = Color.BLACK;
private static final float START_ARROW_X_OFFSET = InTheDarknessGame.ACTION_SIZE_SMALLER * 1.3f;
private static final int START_ARROW_Y_OFFSET = InTheDarknessGame.ACTION_SIZE_SMALLER / 2;
private static final float START_ARROW_X_OFFSET = InTheDarknessGame.ACTION_SIZE_SMALLER / 15;
private static final float START_ARROW_Y_OFFSET = -InTheDarknessGame.ACTION_SIZE_SMALLER / 20;
private static final float START_ARROW_WIDTH = InTheDarknessGame.TILE_SIZE * 1.5f;
private static final float START_ARROW_HEIGHT = InTheDarknessGame.TILE_SIZE;
private ActionsStripWidget actionsStripWidget;
private List<Action> actions;
// private final Scene scene;
// private Rectangle dimmer;
private InTheDarknessDifficulty inTheDarknessDifficulty;
private int currentStepNumber;
// private StartButton startButton;
private int currentTutorialStepNumber;
private InTheDarknessGame inTheDarknessGame;
private Image tutorialArrowImage;
private RepeatAction blinkAction;
public ActionsWidget(InTheDarknessDifficulty inTheDarknessDifficulty,
ActionsStripWidget actionsStripWidget,
InTheDarknessGame inTheDarknessGame) {
this.inTheDarknessGame = inTheDarknessGame;
this.inTheDarknessDifficulty = inTheDarknessDifficulty;
// this.scene = scene;
this.actionsStripWidget = actionsStripWidget;
this.actions = new ArrayList<Action>();
currentStepNumber = 0;
List<ActionType> actionTypes = ActionType.getActionTypesForGameDifficulty(inTheDarknessDifficulty);
this.inTheDarknessGame = inTheDarknessGame;
this.inTheDarknessDifficulty = inTheDarknessDifficulty;
this.actionsStripWidget = actionsStripWidget;
this.actions = new ArrayList<Action>();
this.currentTutorialStepNumber = 0;
// SET ACTOR SIZE
List<ActionType> actionTypes = ActionType.getActionTypesForGameDifficulty(inTheDarknessDifficulty);
setSize((float) (NUMBER_OF_COLUMNS * (InTheDarknessGame.ACTION_SIZE_SMALLER + ACTION_OFFSET) - ACTION_OFFSET),
(float) Math.ceil(Double.valueOf(actionTypes.size()) / NUMBER_OF_COLUMNS) * (InTheDarknessGame.ACTION_SIZE_SMALLER + ACTION_OFFSET) - ACTION_OFFSET);
// BACKGROUND
TextureRegion backgroundTexture = inTheDarknessGame.getScreenTextureRegion(InTheDarknessAssets.BACKGROUND_ACTIONS);
float backgroundHeight = getHeight();
float backgroundWidth = backgroundTexture.getRegionWidth() * (backgroundHeight / backgroundTexture.getRegionHeight());
Image actionsBackground = new Image(backgroundTexture);
actionsBackground.setSize(backgroundWidth, backgroundHeight);
actionsBackground.setPosition((getWidth() / 2) - (backgroundWidth / 2), 0);
// DIMMER
// float actionStripWidgetOffset = (actionStripWidgetWidth / 2) * 0.95f;
// dimmer = new Rectangle(-positionX + (displaySizeX / 2) - actionStripWidgetOffset,
// -positionY + (displaySizeY / 2),
// displaySizeX - actionStripWidgetOffset,
// displaySizeY,
// vertexBufferObjectManager);
// dimmer.setColor(DIMMER_COLOR);
// dimmer.setAlpha(DIMMER_ALPHA);
// dimmer.setVisible(false);
// PREPARE LAYERS
ActionLayer.attachLayersToEntity(this);
for (ActionType actionType: actionTypes) {
createAction(actionType, actionType.ordinal(), false, inTheDarknessGame);
}
// ActionLayer.ACTIONS_LAYER.getLayerEntity().attachChild(dimmer);
ActionLayer.BACKGROUND_LAYER.getLayerEntity().addActor(actionsBackground);
tryDimmAllActions();
prepareBackground();
prepareActions(actionTypes);
prepareTutorialArrowImage();
}
// public void setStartButton(StartButton startButton) {
// this.startButton = startButton;
// }
private Action createAction(ActionType actionType, int orderNumber, boolean visible, InTheDarknessGame inTheDarknessGame) {
int actionSize = InTheDarknessGame.ACTION_SIZE_SMALLER;
Action action = new Action(actionType,
......@@ -171,7 +140,36 @@ public class ActionsWidget extends Group implements ActionListener {
actions.add(action.getOrderNumber(), action);
return action;
}
//////////////////////////////////////////// SCREEN COMPONENTS
private void prepareBackground() {
TextureRegion backgroundTexture = inTheDarknessGame.getScreenTextureRegion(InTheDarknessAssets.BACKGROUND_ACTIONS);
float backgroundHeight = getHeight();
float backgroundWidth = backgroundTexture.getRegionWidth() * (backgroundHeight / backgroundTexture.getRegionHeight());
Image actionsBackground = new Image(backgroundTexture);
actionsBackground.setSize(backgroundWidth, backgroundHeight);
actionsBackground.setPosition((getWidth() / 2) - (backgroundWidth / 2), 0);
ActionLayer.BACKGROUND_LAYER.getLayerEntity().addActor(actionsBackground);
}
private void prepareActions(List<ActionType> actionTypes) {
for (ActionType actionType: actionTypes) {
createAction(actionType, actionType.ordinal(), false, inTheDarknessGame);
}
}
private void prepareTutorialArrowImage() {
if (inTheDarknessDifficulty == InTheDarknessDifficulty.TUTORIAL) {
tutorialArrowImage = new Image(inTheDarknessGame.getScreenTextureRegion(InTheDarknessAssets.INFO_START_ARROW));
tutorialArrowImage.setSize(START_ARROW_WIDTH, START_ARROW_HEIGHT);
tutorialArrowImage.setVisible(false);
blinkAction = forever(sequence(fadeIn(TUTORIAL_INFO_ARROW_BLINK_DURATION), fadeOut(TUTORIAL_INFO_ARROW_BLINK_DURATION)));
tutorialArrowImage.addAction(blinkAction);
}
}
//////////////////////////////////////////// COLLISIONS
......@@ -183,6 +181,7 @@ public class ActionsWidget extends Group implements ActionListener {
//////////////////////////////////////////// ANIMATIONS
public void showActions() {
tryDimAllActions();
float actualDelay = 0;
for (int i = 0; i < actions.size(); i++) {
final Action action = actions.get(i);
......@@ -206,7 +205,7 @@ public class ActionsWidget extends Group implements ActionListener {
}
/* //////////////////////////////////////////// ACTION STATE */
//////////////////////////////////////////// ACTION STATE
public void enableActions() {
if (inTheDarknessDifficulty != InTheDarknessDifficulty.TUTORIAL) {
......@@ -225,102 +224,79 @@ public class ActionsWidget extends Group implements ActionListener {
}
/* //////////////////////////////////////////// ACTION LISTENER */
//////////////////////////////////////////// ACTION LISTENER
@Override
public void onActionDrag(Action lastAction) {
InTheDarknessGame.GameLayer.ACTIONS_LAYER.sendToFront();
actions.remove(lastAction);
Action action = createAction(lastAction.getActionType(), lastAction.getOrderNumber(), false, inTheDarknessGame);
action.showWithAnimation();
prepareActionsReactionAreas(action);
disableActions();
hideArrowSprite();
tryHideTutorialArrowSprite();
}
@Override
public void onActionDrop(Action action, int collidesWithNumber) {
if (collidesWithNumber != Action.NO_COLLISION_NUMBER) {
actionsStripWidget.addSelectedAction(action.getActionType(), collidesWithNumber, inTheDarknessGame);
currentStepNumber++;
currentTutorialStepNumber++;
}
tryToPerformNextTutorialStep();
}
/* //////////////////////////////////////////// TUTORIAL STEPS */
//////////////////////////////////////////// TUTORIAL STEPS
private void tryToPerformNextTutorialStep() {
// if (inTheDarknessDifficulty == PotmeDifficulty.TUTORIAL) {
// if (currentStepNumber < PotmeActivity.TUTORIAL_STEPS.size()) {
// highliteAction(PotmeActivity.TUTORIAL_STEPS.get(currentStepNumber));
// } else {
// PotmeActivity.GameLayer.BUTTON_LAYER.sendToFront(scene);
// if (startButton != null) {
// startButton.enable();
// startButton.enablePulsing();
// }
// }
// } else {
// enableActions();
// }
if (inTheDarknessDifficulty == InTheDarknessDifficulty.TUTORIAL) {
if (currentTutorialStepNumber < InTheDarknessGame.TUTORIAL_STEPS.size()) {
highliteAction(InTheDarknessGame.TUTORIAL_STEPS.get(currentTutorialStepNumber));
} else {
InTheDarknessGame.GameLayer.BUTTON_LAYER.sendToFront();
inTheDarknessGame.disableStartButton(false);
inTheDarknessGame.highliteStartButton(true);
}
} else {
enableActions();
}
}
private void tryDimmAllActions() {
// if (inTheDarknessDifficulty == PotmeDifficulty.TUTORIAL) {
// dimmer.setVisible(true);
// for (int i = 0; i < actions.size(); i++) {
// Action action = actions.get(actions.keyAt(i));
// action.setZIndex(action.getOrderNumber());
// action.disable();
// }
// dimmer.setZIndex(actions.size());
// ActionLayer.ACTIONS_LAYER.getLayerEntity().sortChildren();
// }
private void tryDimAllActions() {
if (inTheDarknessDifficulty == InTheDarknessDifficulty.TUTORIAL) {
inTheDarknessGame.showDimmer();
}
}
private void highliteAction(ActionType actionType) {
if (actionType.ordinal() < actions.size()) {
tryDimmAllActions();
if (actionType.ordinal() < actions.size()) {
Action action = actions.get(actionType.ordinal());
action.setZIndex(TOP_Z_INDEX);
action.enable();
showArrowSprite(action.getX(), action.getY());
// ActionLayer.ACTIONS_LAYER.getLayerEntity().sortChildren();
showArrowSprite(action.getX() + action.getWidth(), action.getY() - action.getHeight() / 2);
action.setVisible(false);
Vector2 stageCoordinates = action.localToStageCoordinates(new Vector2());
InTheDarknessGame.GameLayer.ACTION_STRIP_LAYER.getLayerEntity().stageToLocalCoordinates(stageCoordinates);
action.setPosition(stageCoordinates.x, stageCoordinates.y);
InTheDarknessGame.GameLayer.ACTION_STRIP_LAYER.getLayerEntity().addActor(action);
action.setVisible(true);
}
}
private void showArrowSprite(float positionX, float positionY) {
// hideArrowSprite();
// final Image infoArrowSprite = new Image(positionX + START_ARROW_X_OFFSET,
// positionY - START_ARROW_Y_OFFSET,
// START_ARROW_WIDTH,
// START_ARROW_HEIGHT,
// InResourceManager.getInstance().getTexture(ResourceManager.INFO_START_ARROW));
//
// infoArrowSprite.setAlpha(0);
// ActionLayer.INFO_LAYER.getLayerEntity().attachChild(infoArrowSprite);
//
// FadeInModifier fadeIn = new FadeInModifier(TUTORIAL_INFO_ARROW_BLINK_DURATION);
// fadeIn.setAutoUnregisterWhenFinished(true);
// FadeOutModifier fadeOut = new FadeOutModifier(TUTORIAL_INFO_ARROW_BLINK_DURATION);
// fadeOut.setAutoUnregisterWhenFinished(true);
// final SequenceEntityModifier sequenceModifier = new SequenceEntityModifier(fadeIn, fadeOut);
// sequenceModifier.setAutoUnregisterWhenFinished(true);
//
// DelayModifier delayModifier = new DelayModifier(TUTORIAL_INFO_ARROW_FADEIN_DELAY);
// delayModifier.setAutoUnregisterWhenFinished(true);
// delayModifier.addModifierListener(new EntityModifierListenerAdapter() {
//
// @Override
// public void onModifierFinished(IModifier<IEntity> pModifier, IEntity pItem) {
// infoArrowSprite.registerEntityModifier(new LoopEntityModifier(sequenceModifier));
// }
//
// });
// infoArrowSprite.registerEntityModifier(delayModifier);
if (tutorialArrowImage != null) {
addActor(tutorialArrowImage);
tutorialArrowImage.setPosition(positionX + START_ARROW_X_OFFSET, positionY + START_ARROW_Y_OFFSET);
Vector2 stageCoordinates = tutorialArrowImage.localToStageCoordinates(new Vector2());
InTheDarknessGame.GameLayer.ACTION_STRIP_LAYER.getLayerEntity().stageToLocalCoordinates(stageCoordinates);
tutorialArrowImage.setPosition(stageCoordinates.x, stageCoordinates.y);
InTheDarknessGame.GameLayer.ACTION_STRIP_LAYER.getLayerEntity().addActor(tutorialArrowImage);
tutorialArrowImage.setVisible(true);
}
}
private void hideArrowSprite() {
ActionLayer.INFO_LAYER.getLayerEntity().clear();
private void tryHideTutorialArrowSprite() {
if (tutorialArrowImage != null) {
tutorialArrowImage.remove();
}
}
}
......@@ -51,12 +51,16 @@ public class ApplicationAtlasManager extends TablexiaAtlasManager implements IAp
public static final String BUTTON_RED_PART = "tablexiabutton_blank_red";
public static final String BUTTON_PRESSED_PART = "_pressed";
public static final String BUTTON_UNPRESSED_PART = "_unpressed";
public static final String BUTTON_SOLARIZED_PART = "_solarized";
public static final String BUTTON_BLUE_PRESSED = BUTTON_PATH + BUTTON_BLUE_PART + BUTTON_PRESSED_PART;
public static final String BUTTON_BLUE_UNPRESSED = BUTTON_PATH + BUTTON_BLUE_PART + BUTTON_UNPRESSED_PART;
public static final String BUTTON_BLUE_SOLARIZED = BUTTON_PATH + BUTTON_BLUE_PART + BUTTON_SOLARIZED_PART;
public static final String BUTTON_GREEN_PRESSED = BUTTON_PATH + BUTTON_GREEN_PART + BUTTON_PRESSED_PART;
public static final String BUTTON_GREEN_UNPRESSED = BUTTON_PATH + BUTTON_GREEN_PART + BUTTON_UNPRESSED_PART;
public static final String BUTTON_GREEN_SOLARIZED = BUTTON_PATH + BUTTON_GREEN_PART + BUTTON_SOLARIZED_PART;
public static final String BUTTON_RED_PRESSED = BUTTON_PATH + BUTTON_RED_PART + BUTTON_PRESSED_PART;
public static final String BUTTON_RED_UNPRESSED = BUTTON_PATH + BUTTON_RED_PART + BUTTON_UNPRESSED_PART;
public static final String BUTTON_RED_SOLARIZED = BUTTON_PATH + BUTTON_RED_PART + BUTTON_SOLARIZED_PART;
public static final String BUTTON_DISABLED = BUTTON_PATH + "tablexiabutton_disabled";
public static final String UNIVERSAL_PATH = "universal/";
......
......@@ -2,33 +2,49 @@ package cz.nic.tablexia.util.ui;
import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.graphics.g2d.NinePatch;
import com.badlogic.gdx.scenes.scene2d.Touchable;
import com.badlogic.gdx.scenes.scene2d.actions.Actions;
import com.badlogic.gdx.scenes.scene2d.actions.RepeatAction;
import com.badlogic.gdx.scenes.scene2d.ui.Image;
import com.badlogic.gdx.scenes.scene2d.ui.TextButton;
import com.badlogic.gdx.scenes.scene2d.utils.NinePatchDrawable;
import cz.nic.tablexia.loader.application.ApplicationAtlasManager;
import cz.nic.tablexia.loader.application.ApplicationFontManager;
import static com.badlogic.gdx.scenes.scene2d.actions.Actions.alpha;
import static com.badlogic.gdx.scenes.scene2d.actions.Actions.fadeIn;
import static com.badlogic.gdx.scenes.scene2d.actions.Actions.fadeOut;
import static com.badlogic.gdx.scenes.scene2d.actions.Actions.forever;
import static com.badlogic.gdx.scenes.scene2d.actions.Actions.sequence;
/**
* Created by Václav Tarantík on 11.5.15.
*/
public class TablexiaButton extends TextButton {
private static final Color DEFAULT_BUTTON_TEXT_COLOR = Color.BLACK;
private static final String DEFAULT_BUTTON_TEXT_FONT = ApplicationFontManager.APPLICATION_DEFAULT_FONT_REGULAR;
private static final Color DEFAULT_BUTTON_TEXT_COLOR = Color.BLACK;
private static final String DEFAULT_BUTTON_TEXT_FONT = ApplicationFontManager.APPLICATION_DEFAULT_FONT_REGULAR;
private static final float DEFAULT_BUTTON_HIGHLITE_DURATION = 0.5f;
private Image solarizedBackgroundImage;
private RepeatAction highliteAction;
public enum ButtonType{
BLUE (ApplicationAtlasManager.BUTTON_BLUE_PRESSED, ApplicationAtlasManager.BUTTON_BLUE_UNPRESSED),
GREEN (ApplicationAtlasManager.BUTTON_GREEN_PRESSED, ApplicationAtlasManager.BUTTON_GREEN_UNPRESSED),
RED (ApplicationAtlasManager.BUTTON_RED_PRESSED, ApplicationAtlasManager.BUTTON_RED_UNPRESSED);
BLUE (ApplicationAtlasManager.BUTTON_BLUE_PRESSED, ApplicationAtlasManager.BUTTON_BLUE_UNPRESSED, ApplicationAtlasManager.BUTTON_BLUE_SOLARIZED),
GREEN (ApplicationAtlasManager.BUTTON_GREEN_PRESSED, ApplicationAtlasManager.BUTTON_GREEN_UNPRESSED, ApplicationAtlasManager.BUTTON_GREEN_SOLARIZED),
RED (ApplicationAtlasManager.BUTTON_RED_PRESSED, ApplicationAtlasManager.BUTTON_RED_UNPRESSED, ApplicationAtlasManager.BUTTON_RED_SOLARIZED);
public static final String BUTTON_DISABLED = ApplicationAtlasManager.BUTTON_DISABLED;
private String buttonPressedResourceName;
private String buttonUnpressedResourceName;
private String buttonSolarizedResourceName;
ButtonType(String buttonPressedResourceName, String buttonUnpressedResourceName){
ButtonType(String buttonPressedResourceName, String buttonUnpressedResourceName, String buttonSolarizedResourceName){
this.buttonPressedResourceName = buttonPressedResourceName;
this.buttonUnpressedResourceName = buttonUnpressedResourceName;
this.buttonSolarizedResourceName = buttonSolarizedResourceName;
}
public NinePatch getUnpressedDrawable() {
......@@ -39,6 +55,10 @@ public class TablexiaButton extends TextButton {
return getNinePatchForName(buttonPressedResourceName);
}
public NinePatch getSolarizedDrawable() {
return getNinePatchForName(buttonSolarizedResourceName);
}
private NinePatch getNinePatchForName(String name) {
return ApplicationAtlasManager.getInstance().getPatch(name);
}
......@@ -46,20 +66,67 @@ public class TablexiaButton extends TextButton {
public TablexiaButton(String buttonText, ButtonType buttonType) {
this(new NinePatchDrawable(buttonType.getUnpressedDrawable()),
new NinePatchDrawable(buttonType.getPressedDrawable()),
new NinePatchDrawable(ApplicationAtlasManager.getInstance().getPatch(buttonType.BUTTON_DISABLED)),
buttonText);
new NinePatchDrawable(buttonType.getPressedDrawable()),
new NinePatchDrawable(ApplicationAtlasManager.getInstance().getPatch(buttonType.BUTTON_DISABLED)),
new NinePatchDrawable(buttonType.getSolarizedDrawable()),
buttonText);
}
public TablexiaButton(NinePatchDrawable npdUp, NinePatchDrawable npdDown, NinePatchDrawable npdDis, String buttonText) {
public TablexiaButton(NinePatchDrawable npdUp, NinePatchDrawable npdDown, NinePatchDrawable npdDis, NinePatchDrawable solarizedBackground, String buttonText) {
super(buttonText, getButtonStyle(npdUp, npdDown, npdDis));
if (solarizedBackground != null) {
solarizedBackgroundImage = new Image(solarizedBackground);
solarizedBackgroundImage.setSize(getWidth(), getHeight());
solarizedBackgroundImage.setVisible(false);
solarizedBackgroundImage.setTouchable(Touchable.childrenOnly);
addActorAt(0, solarizedBackgroundImage);
}
// TODO auto size button around text
// TODO screen size independent button size?
}
@Override
public void setSize(float width, float height) {
super.setSize(width, height);
if (solarizedBackgroundImage != null) {
solarizedBackgroundImage.setSize(width, height);
}
}
@Override
public void setWidth(float width) {
super.setWidth(width);
if (solarizedBackgroundImage != null) {
solarizedBackgroundImage.setWidth(width);
}
}
@Override
public void setHeight(float height) {
super.setHeight(height);
if (solarizedBackgroundImage != null) {
solarizedBackgroundImage.setHeight(height);
}
}
private static TextButton.TextButtonStyle getButtonStyle(NinePatchDrawable npdUp, NinePatchDrawable npdDown, NinePatchDrawable npdDis){
TextButton.TextButtonStyle textButtonStyle = new TextButton.TextButtonStyle(npdUp, npdDown, npdDis, ApplicationFontManager.getInstance().getFont(DEFAULT_BUTTON_TEXT_FONT));
textButtonStyle.fontColor = DEFAULT_BUTTON_TEXT_COLOR;
return textButtonStyle;
}
public void highliteButton(boolean enable) {
if (solarizedBackgroundImage != null) {
if (enable) {
solarizedBackgroundImage.addAction(alpha(0));
highliteAction = forever(sequence(fadeIn(DEFAULT_BUTTON_HIGHLITE_DURATION), fadeOut(DEFAULT_BUTTON_HIGHLITE_DURATION)));
solarizedBackgroundImage.addAction(highliteAction);
solarizedBackgroundImage.setVisible(true);
} else {
solarizedBackgroundImage.setVisible(false);
solarizedBackgroundImage.removeAction(highliteAction);
}
}
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment