From 32a8e701298c11a23ca764d096074016435dbd7e Mon Sep 17 00:00:00 2001 From: Lonami Exo Date: Thu, 2 Mar 2017 20:44:35 +0100 Subject: [PATCH] Add money band to the customize screen --- .../klooni/actors/MoneyBuyBand.java | 170 ++++++++++++++++++ .../klooni/screens/CustomizeScreen.java | 12 +- 2 files changed, 181 insertions(+), 1 deletion(-) create mode 100644 core/src/io/github/lonamiwebs/klooni/actors/MoneyBuyBand.java diff --git a/core/src/io/github/lonamiwebs/klooni/actors/MoneyBuyBand.java b/core/src/io/github/lonamiwebs/klooni/actors/MoneyBuyBand.java new file mode 100644 index 0000000..e2c099e --- /dev/null +++ b/core/src/io/github/lonamiwebs/klooni/actors/MoneyBuyBand.java @@ -0,0 +1,170 @@ +package io.github.lonamiwebs.klooni.actors; + +import com.badlogic.gdx.graphics.g2d.Batch; +import com.badlogic.gdx.graphics.g2d.TextureRegion; +import com.badlogic.gdx.scenes.scene2d.Actor; +import com.badlogic.gdx.scenes.scene2d.ui.Label; +import com.badlogic.gdx.scenes.scene2d.ui.Table; +import com.badlogic.gdx.scenes.scene2d.utils.ChangeListener; +import com.badlogic.gdx.scenes.scene2d.utils.TextureRegionDrawable; +import com.badlogic.gdx.utils.Align; +import com.badlogic.gdx.utils.TimeUtils; + +import io.github.lonamiwebs.klooni.Klooni; +import io.github.lonamiwebs.klooni.Theme; + +public class MoneyBuyBand extends Table { + + //region Members + + private final Label infoLabel; + private final SoftButton confirmButton, cancelButton; + + private String infoText; + private boolean showingTemp; + + // Used to interpolate between strings + private StringBuilder shownText; + + // When the next text update will take place + private long nextTextUpdate; + + // When the temporary text should be reverted next + private long nextTempRevertUpdate; + + // Milliseconds + private final static long SHOW_ONE_CHARACTER_EVERY = 30; + private final static long TEMP_TEXT_DELAY = 2 * 1000; + + //endregion + + //region Constructor + + public MoneyBuyBand(final Klooni game) { + infoText = ""; + shownText = new StringBuilder(); + + final Label.LabelStyle labelStyle = new Label.LabelStyle(); + labelStyle.font = game.skin.getFont("font_small"); + + infoLabel = new Label(infoText, labelStyle); + infoLabel.setAlignment(Align.left); + add(infoLabel).expandX().left().padLeft(20); + + confirmButton = new SoftButton(0, "ok_texture"); + add(confirmButton).pad(8, 0, 8, 4); + confirmButton.setVisible(false); + + cancelButton = new SoftButton(3, "cancel_texture"); + cancelButton.addListener(new ChangeListener() { + @Override + public void changed(ChangeEvent event, Actor actor) { + showCurrentMoney(); + confirmButton.setVisible(false); + cancelButton.setVisible(false); + } + }); + add(cancelButton).pad(8, 4, 8, 8); + cancelButton.setVisible(false); + + setBackground(new TextureRegionDrawable(new TextureRegion(Theme.getBlankTexture()))); + showCurrentMoney(); + } + + //endregion + + //region Private methods + + private void showCurrentMoney() { + setText("money: 0"); + } + + // Set the text to which the shown text will interpolate. + // This will remove any temporary shown text or otherwise + // it would mess up this new text. + private void setText(String text) { + infoText = text; + showingTemp = false; + nextTextUpdate = TimeUtils.millis() + SHOW_ONE_CHARACTER_EVERY; + } + + // Temporary text will always reset to the shown money + // because it would make no sense to go back to the buy "confirm?" + private void setTempText(String text) { + setText(text); + showingTemp = true; + nextTempRevertUpdate = TimeUtils.millis() + TEMP_TEXT_DELAY; + } + + // Funky method to interpolate between the information + // text and the currently being shown text + private void interpolateText() { + // If the currently shown text does not match the information text, + // then that means that we need to interpolate between them. + if (!shownText.toString().equals(infoText)) { + // We need the pick the minimum text length limit + // or charAt() will throw an IndexOutOfBoundsException + int limit = Math.min(shownText.length(), infoText.length()); + for (int i = 0; i < limit; ++i) { + // As soon as we found a character which differs, we can interpolate + // to the new string by updating that single character + if (shownText.charAt(i) != infoText.charAt(i)) { + shownText.setCharAt(i, infoText.charAt(i)); + infoLabel.setText(shownText); + return; + } + } + + // All the preceding characters matched, so now + // what's left is to check for the string length + if (shownText.length() > infoText.length()) { + // The old text was longer than the new one, so shorten it + shownText.setLength(shownText.length() - 1); + } + else { + // It can't be equal length or we wouldn't be here, + // so avoid checking shown.length() < info.length(). + // We need to append the next character that we want to show + shownText.append(infoText.charAt(shownText.length())); + } + infoLabel.setText(shownText); + } + } + + //endregion + + //region Public methods + + // Asks the user to buy the given theme, or shows + // that they don't have enough money to buy it + public void askBuy(final Theme toBuy) { + int moneyIHaz = 10; // TODO use a real value + if (toBuy.getPrice() > moneyIHaz) { + setTempText("cannot buy!"); + confirmButton.setVisible(false); + cancelButton.setVisible(false); + } + else { + setText("confirm?"); + confirmButton.setVisible(true); + cancelButton.setVisible(true); + } + } + + @Override + public void draw(Batch batch, float parentAlpha) { + long now = TimeUtils.millis(); + if (now > nextTextUpdate) { + interpolateText(); + nextTextUpdate = TimeUtils.millis() + SHOW_ONE_CHARACTER_EVERY; + if (now > nextTempRevertUpdate && showingTemp) { + // We won't be showing temp anymore if the current money is shown + showCurrentMoney(); + } + } + setColor(Klooni.theme.bandColor); + super.draw(batch, parentAlpha); + } + + //endregion +} diff --git a/core/src/io/github/lonamiwebs/klooni/screens/CustomizeScreen.java b/core/src/io/github/lonamiwebs/klooni/screens/CustomizeScreen.java index 3d7d92d..42e933e 100644 --- a/core/src/io/github/lonamiwebs/klooni/screens/CustomizeScreen.java +++ b/core/src/io/github/lonamiwebs/klooni/screens/CustomizeScreen.java @@ -17,6 +17,7 @@ import com.badlogic.gdx.scenes.scene2d.utils.ChangeListener; import io.github.lonamiwebs.klooni.Klooni; import io.github.lonamiwebs.klooni.Theme; +import io.github.lonamiwebs.klooni.actors.MoneyBuyBand; import io.github.lonamiwebs.klooni.actors.SoftButton; import io.github.lonamiwebs.klooni.actors.ThemeCard; import io.github.lonamiwebs.klooni.game.GameLayout; @@ -117,6 +118,8 @@ class CustomizeScreen implements Screen { table.add(new ScrollPane(optionsGroup)).pad(20, 4, 12, 4); // Load all the available themes + final MoneyBuyBand buyBand = new MoneyBuyBand(game); + table.row(); final VerticalGroup themesGroup = new VerticalGroup(); for (Theme theme : Theme.getThemes()) { @@ -124,7 +127,10 @@ class CustomizeScreen implements Screen { card.addListener(new InputListener() { @Override public boolean touchDown(InputEvent event, float x, float y, int pointer, int button) { - Klooni.updateTheme(card.theme); + if (Klooni.isThemeBought(card.theme)) + Klooni.updateTheme(card.theme); + else + buyBand.askBuy(card.theme); for (Actor a : themesGroup.getChildren()) { ThemeCard c = (ThemeCard)a; @@ -138,6 +144,10 @@ class CustomizeScreen implements Screen { themesGroup.space(8); table.add(new ScrollPane(themesGroup)).expand().fill(); + + // Show the current money row + table.row(); + table.add(buyBand).expandX().fillX(); } //endregion