add undo (which might be a bit wasteful by it works so meh for now) to pause menu (doesnt work after new pieces generation for balance)
This commit is contained in:
parent
0be7645aba
commit
ef8f9c0797
6 changed files with 81 additions and 2 deletions
|
@ -35,6 +35,7 @@ public abstract class BaseScorer implements BinSerializable {
|
||||||
//region Members
|
//region Members
|
||||||
|
|
||||||
int currentScore;
|
int currentScore;
|
||||||
|
int lastScore;
|
||||||
|
|
||||||
final Label currentScoreLabel;
|
final Label currentScoreLabel;
|
||||||
final Label highScoreLabel;
|
final Label highScoreLabel;
|
||||||
|
@ -86,8 +87,13 @@ public abstract class BaseScorer implements BinSerializable {
|
||||||
|
|
||||||
//region Public methods
|
//region Public methods
|
||||||
|
|
||||||
|
public void undo() {
|
||||||
|
currentScore = lastScore;
|
||||||
|
}
|
||||||
|
|
||||||
// Adds the score a given piece would give
|
// Adds the score a given piece would give
|
||||||
public void addPieceScore(final int areaPut) {
|
public void addPieceScore(final int areaPut) {
|
||||||
|
lastScore = currentScore;
|
||||||
currentScore += areaPut;
|
currentScore += areaPut;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -40,6 +40,7 @@ public class Board implements BinSerializable {
|
||||||
public final int cellCount;
|
public final int cellCount;
|
||||||
public float cellSize;
|
public float cellSize;
|
||||||
private Cell[][] cells;
|
private Cell[][] cells;
|
||||||
|
private Cell[][] lastCells;
|
||||||
private final Array<IEffect> effects = new Array<IEffect>(); // Particle effects once they vanish
|
private final Array<IEffect> effects = new Array<IEffect>(); // Particle effects once they vanish
|
||||||
|
|
||||||
public final Vector2 pos = new Vector2();
|
public final Vector2 pos = new Vector2();
|
||||||
|
@ -70,9 +71,19 @@ public class Board implements BinSerializable {
|
||||||
|
|
||||||
private void createCells() {
|
private void createCells() {
|
||||||
cells = new Cell[this.cellCount][this.cellCount];
|
cells = new Cell[this.cellCount][this.cellCount];
|
||||||
|
lastCells = new Cell[this.cellCount][this.cellCount];
|
||||||
for (int i = 0; i < this.cellCount; ++i) {
|
for (int i = 0; i < this.cellCount; ++i) {
|
||||||
for (int j = 0; j < this.cellCount; ++j) {
|
for (int j = 0; j < this.cellCount; ++j) {
|
||||||
cells[i][j] = new Cell(j * cellSize, i * cellSize, cellSize);
|
cells[i][j] = new Cell(j * cellSize, i * cellSize, cellSize);
|
||||||
|
lastCells[i][j] = new Cell(cells[i][j]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void CopyToLastCells() {
|
||||||
|
for(int y = 0; y < cells.length; y += 1) {
|
||||||
|
for(int x = 0; x < cells[0].length; x += 1) {
|
||||||
|
lastCells[y][x] = new Cell(cells[y][x]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -110,6 +121,7 @@ public class Board implements BinSerializable {
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
lastPutPiecePos.set(piece.calculateGravityCenter());
|
lastPutPiecePos.set(piece.calculateGravityCenter());
|
||||||
|
CopyToLastCells();
|
||||||
for (int i = 0; i < piece.cellRows; ++i)
|
for (int i = 0; i < piece.cellRows; ++i)
|
||||||
for (int j = 0; j < piece.cellCols; ++j)
|
for (int j = 0; j < piece.cellCols; ++j)
|
||||||
if (piece.filled(i, j))
|
if (piece.filled(i, j))
|
||||||
|
@ -122,6 +134,16 @@ public class Board implements BinSerializable {
|
||||||
|
|
||||||
//region Public methods
|
//region Public methods
|
||||||
|
|
||||||
|
public void undo() {
|
||||||
|
if(lastCells != null) {
|
||||||
|
for(int y = 0; y < cells.length; y += 1) {
|
||||||
|
for(int x = 0; x < cells[0].length; x += 1) {
|
||||||
|
cells[y][x] = new Cell(lastCells[y][x]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public void draw(final Batch batch) {
|
public void draw(final Batch batch) {
|
||||||
batch.setTransformMatrix(batch.getTransformMatrix().translate(pos.x, pos.y, 0));
|
batch.setTransformMatrix(batch.getTransformMatrix().translate(pos.x, pos.y, 0));
|
||||||
|
|
||||||
|
|
|
@ -52,6 +52,12 @@ public class Cell implements BinSerializable {
|
||||||
colorIndex = -1;
|
colorIndex = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Cell(Cell c) {
|
||||||
|
pos = new Vector2(c.pos.x, c.pos.y);
|
||||||
|
size = c.size;
|
||||||
|
colorIndex = c.colorIndex;
|
||||||
|
}
|
||||||
|
|
||||||
//endregion
|
//endregion
|
||||||
|
|
||||||
//region Package local methods
|
//region Package local methods
|
||||||
|
|
|
@ -41,6 +41,7 @@ public class PieceHolder implements BinSerializable {
|
||||||
|
|
||||||
final Rectangle area;
|
final Rectangle area;
|
||||||
private final Piece[] pieces;
|
private final Piece[] pieces;
|
||||||
|
private Piece lastPiece = null;
|
||||||
|
|
||||||
private final Sound pieceDropSound;
|
private final Sound pieceDropSound;
|
||||||
private final Sound invalidPieceDropSound;
|
private final Sound invalidPieceDropSound;
|
||||||
|
@ -51,6 +52,7 @@ public class PieceHolder implements BinSerializable {
|
||||||
|
|
||||||
// Currently held piece index (picked by the user)
|
// Currently held piece index (picked by the user)
|
||||||
private int heldPiece;
|
private int heldPiece;
|
||||||
|
private int lastHeldPiece;
|
||||||
public boolean enabled;
|
public boolean enabled;
|
||||||
|
|
||||||
// Needed after a piece is dropped, so it can go back
|
// Needed after a piece is dropped, so it can go back
|
||||||
|
@ -110,6 +112,7 @@ public class PieceHolder implements BinSerializable {
|
||||||
|
|
||||||
// Takes a new set of pieces. Should be called when there are no more piece left
|
// Takes a new set of pieces. Should be called when there are no more piece left
|
||||||
private void takeMore() {
|
private void takeMore() {
|
||||||
|
lastPiece = null; // NO UNDO!
|
||||||
for (int i = 0; i < count; ++i)
|
for (int i = 0; i < count; ++i)
|
||||||
pieces[i] = Piece.random();
|
pieces[i] = Piece.random();
|
||||||
updatePiecesStartLocation();
|
updatePiecesStartLocation();
|
||||||
|
@ -155,6 +158,17 @@ public class PieceHolder implements BinSerializable {
|
||||||
|
|
||||||
//region Public methods
|
//region Public methods
|
||||||
|
|
||||||
|
public boolean undo() {
|
||||||
|
if(lastPiece != null) {
|
||||||
|
pieces[lastHeldPiece] = lastPiece;
|
||||||
|
lastPiece = null;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Picks the piece below the finger/mouse, returning true if any was picked
|
// Picks the piece below the finger/mouse, returning true if any was picked
|
||||||
public boolean pickPiece() {
|
public boolean pickPiece() {
|
||||||
Vector2 mouse = new Vector2(
|
Vector2 mouse = new Vector2(
|
||||||
|
@ -211,6 +225,8 @@ public class PieceHolder implements BinSerializable {
|
||||||
float pitch = 1.104f - pieces[heldPiece].calculateArea() * 0.04f;
|
float pitch = 1.104f - pieces[heldPiece].calculateArea() * 0.04f;
|
||||||
pieceDropSound.play(1, pitch, 0);
|
pieceDropSound.play(1, pitch, 0);
|
||||||
}
|
}
|
||||||
|
lastPiece = pieces[heldPiece];
|
||||||
|
lastHeldPiece = heldPiece;
|
||||||
|
|
||||||
result = new DropResult(calculateHeldPieceArea(), calculateHeldPieceCenter());
|
result = new DropResult(calculateHeldPieceArea(), calculateHeldPieceCenter());
|
||||||
pieces[heldPiece] = null;
|
pieces[heldPiece] = null;
|
||||||
|
|
|
@ -25,6 +25,7 @@ import com.badlogic.gdx.audio.Sound;
|
||||||
import com.badlogic.gdx.files.FileHandle;
|
import com.badlogic.gdx.files.FileHandle;
|
||||||
import com.badlogic.gdx.graphics.GL20;
|
import com.badlogic.gdx.graphics.GL20;
|
||||||
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
|
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
|
||||||
|
import com.badlogic.gdx.math.Vector2;
|
||||||
|
|
||||||
import java.io.DataInputStream;
|
import java.io.DataInputStream;
|
||||||
import java.io.DataOutputStream;
|
import java.io.DataOutputStream;
|
||||||
|
@ -111,7 +112,7 @@ class GameScreen implements Screen, InputProcessor, BinSerializable {
|
||||||
|
|
||||||
board = new Board(layout, BOARD_SIZE);
|
board = new Board(layout, BOARD_SIZE);
|
||||||
holder = new PieceHolder(layout, board, HOLDER_PIECE_COUNT, board.cellSize);
|
holder = new PieceHolder(layout, board, HOLDER_PIECE_COUNT, board.cellSize);
|
||||||
pauseMenu = new PauseMenuStage(layout, game, scorer, gameMode);
|
pauseMenu = new PauseMenuStage(layout, game, scorer, gameMode, board, holder);
|
||||||
bonusParticleHandler = new BonusParticleHandler(game);
|
bonusParticleHandler = new BonusParticleHandler(game);
|
||||||
|
|
||||||
gameOverSound = Gdx.audio.newSound(Gdx.files.internal("sound/game_over.mp3"));
|
gameOverSound = Gdx.audio.newSound(Gdx.files.internal("sound/game_over.mp3"));
|
||||||
|
|
|
@ -35,7 +35,9 @@ import dev.lonami.klooni.Klooni;
|
||||||
import dev.lonami.klooni.actors.Band;
|
import dev.lonami.klooni.actors.Band;
|
||||||
import dev.lonami.klooni.actors.SoftButton;
|
import dev.lonami.klooni.actors.SoftButton;
|
||||||
import dev.lonami.klooni.game.BaseScorer;
|
import dev.lonami.klooni.game.BaseScorer;
|
||||||
|
import dev.lonami.klooni.game.Board;
|
||||||
import dev.lonami.klooni.game.GameLayout;
|
import dev.lonami.klooni.game.GameLayout;
|
||||||
|
import dev.lonami.klooni.game.PieceHolder;
|
||||||
|
|
||||||
// The pause stage is not a whole screen but rather a menu
|
// The pause stage is not a whole screen but rather a menu
|
||||||
// which can be overlaid on top of another screen
|
// which can be overlaid on top of another screen
|
||||||
|
@ -55,12 +57,14 @@ class PauseMenuStage extends Stage {
|
||||||
private final SoftButton playButton;
|
private final SoftButton playButton;
|
||||||
private final SoftButton customButton; // Customize & "Shut down"
|
private final SoftButton customButton; // Customize & "Shut down"
|
||||||
|
|
||||||
|
|
||||||
//endregion
|
//endregion
|
||||||
|
|
||||||
|
|
||||||
//region Constructor
|
//region Constructor
|
||||||
|
|
||||||
// We need the score to save the maximum score if a new record was beaten
|
// We need the score to save the maximum score if a new record was beaten
|
||||||
PauseMenuStage(final GameLayout layout, final Klooni game, final BaseScorer scorer, final int gameMode) {
|
PauseMenuStage(final GameLayout layout, final Klooni game, final BaseScorer scorer, final int gameMode, final Board board, final PieceHolder holder) {
|
||||||
this.game = game;
|
this.game = game;
|
||||||
this.scorer = scorer;
|
this.scorer = scorer;
|
||||||
|
|
||||||
|
@ -108,6 +112,30 @@ class PauseMenuStage extends Stage {
|
||||||
playButton = new SoftButton(2, "play_texture");
|
playButton = new SoftButton(2, "play_texture");
|
||||||
table.add(playButton).space(16);
|
table.add(playButton).space(16);
|
||||||
playButton.addListener(playChangeListener);
|
playButton.addListener(playChangeListener);
|
||||||
|
|
||||||
|
// UNDO :))))))
|
||||||
|
if(gameMode == 0) // this is kinda bad but meh for now, 0 is normal game, so no undo in the time thingy!
|
||||||
|
{
|
||||||
|
SoftButton undoButton = new SoftButton(3, "back_texture");
|
||||||
|
undoButton.setPosition(
|
||||||
|
(Gdx.graphics.getWidth() - undoButton.getWidth())* 0.5f,
|
||||||
|
Gdx.graphics.getHeight() * 0.25f
|
||||||
|
);
|
||||||
|
addActor(undoButton);
|
||||||
|
ChangeListener undoChangeListener = new ChangeListener() {
|
||||||
|
@Override
|
||||||
|
public void changed(ChangeEvent event, Actor actor) {
|
||||||
|
boolean undo = holder.undo();
|
||||||
|
if(undo) {
|
||||||
|
scorer.undo();
|
||||||
|
board.undo();
|
||||||
|
}
|
||||||
|
hide();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
undoButton.addListener(undoChangeListener);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//endregion
|
//endregion
|
||||||
|
|
Loading…
Reference in a new issue