Add money band to the customize screen
This commit is contained in:
parent
8c6a6cebfa
commit
32a8e70129
2 changed files with 181 additions and 1 deletions
170
core/src/io/github/lonamiwebs/klooni/actors/MoneyBuyBand.java
Normal file
170
core/src/io/github/lonamiwebs/klooni/actors/MoneyBuyBand.java
Normal file
|
@ -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
|
||||||
|
}
|
|
@ -17,6 +17,7 @@ import com.badlogic.gdx.scenes.scene2d.utils.ChangeListener;
|
||||||
|
|
||||||
import io.github.lonamiwebs.klooni.Klooni;
|
import io.github.lonamiwebs.klooni.Klooni;
|
||||||
import io.github.lonamiwebs.klooni.Theme;
|
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.SoftButton;
|
||||||
import io.github.lonamiwebs.klooni.actors.ThemeCard;
|
import io.github.lonamiwebs.klooni.actors.ThemeCard;
|
||||||
import io.github.lonamiwebs.klooni.game.GameLayout;
|
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);
|
table.add(new ScrollPane(optionsGroup)).pad(20, 4, 12, 4);
|
||||||
|
|
||||||
// Load all the available themes
|
// Load all the available themes
|
||||||
|
final MoneyBuyBand buyBand = new MoneyBuyBand(game);
|
||||||
|
|
||||||
table.row();
|
table.row();
|
||||||
final VerticalGroup themesGroup = new VerticalGroup();
|
final VerticalGroup themesGroup = new VerticalGroup();
|
||||||
for (Theme theme : Theme.getThemes()) {
|
for (Theme theme : Theme.getThemes()) {
|
||||||
|
@ -124,7 +127,10 @@ class CustomizeScreen implements Screen {
|
||||||
card.addListener(new InputListener() {
|
card.addListener(new InputListener() {
|
||||||
@Override
|
@Override
|
||||||
public boolean touchDown(InputEvent event, float x, float y, int pointer, int button) {
|
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()) {
|
for (Actor a : themesGroup.getChildren()) {
|
||||||
ThemeCard c = (ThemeCard)a;
|
ThemeCard c = (ThemeCard)a;
|
||||||
|
@ -138,6 +144,10 @@ class CustomizeScreen implements Screen {
|
||||||
|
|
||||||
themesGroup.space(8);
|
themesGroup.space(8);
|
||||||
table.add(new ScrollPane(themesGroup)).expand().fill();
|
table.add(new ScrollPane(themesGroup)).expand().fill();
|
||||||
|
|
||||||
|
// Show the current money row
|
||||||
|
table.row();
|
||||||
|
table.add(buyBand).expandX().fillX();
|
||||||
}
|
}
|
||||||
|
|
||||||
//endregion
|
//endregion
|
||||||
|
|
Loading…
Reference in a new issue