diff --git a/core/src/io/github/lonamiwebs/klooni/game/BaseScorer.java b/core/src/io/github/lonamiwebs/klooni/game/BaseScorer.java index 28b06c2..48a29b3 100644 --- a/core/src/io/github/lonamiwebs/klooni/game/BaseScorer.java +++ b/core/src/io/github/lonamiwebs/klooni/game/BaseScorer.java @@ -75,14 +75,15 @@ public abstract class BaseScorer { addScore(calculateClearScore(stripsCleared, boardSize)); } + public void pause() { } + public void resume() { } + abstract public boolean isGameOver(); + abstract protected boolean isNewRecord(); abstract public int getCurrentScore(); - abstract public void saveScore(); - abstract protected boolean isNewRecord(); - public void draw(SpriteBatch batch) { // If we beat a new record, the cup color will linear interpolate to the high score color cupColor.lerp(isNewRecord() ? Klooni.theme.highScore : Klooni.theme.currentScore, 0.05f); diff --git a/core/src/io/github/lonamiwebs/klooni/game/TimeScorer.java b/core/src/io/github/lonamiwebs/klooni/game/TimeScorer.java index 3465b41..98cb17f 100644 --- a/core/src/io/github/lonamiwebs/klooni/game/TimeScorer.java +++ b/core/src/io/github/lonamiwebs/klooni/game/TimeScorer.java @@ -10,7 +10,7 @@ public class TimeScorer extends BaseScorer { //region Members - private final long startTime; + private long startTime; // Indicates where we would die in time. Score adds to this, so we take // longer to die. To get the "score" we simply calculate `deadTime - startTime` @@ -18,6 +18,10 @@ public class TimeScorer extends BaseScorer { private static final long START_TIME = 20 * 1000000000L; + // We need to know when the game was paused to "stop" counting + private long pauseTime; + private int pausedTimeLeft; + //endregion //region Constructor @@ -28,6 +32,8 @@ public class TimeScorer extends BaseScorer { startTime = TimeUtils.nanoTime(); deadTime = startTime + START_TIME; + + pausedTimeLeft = -1; } //endregion @@ -48,9 +54,8 @@ public class TimeScorer extends BaseScorer { return (long)((score / 4.0) * 1e+09); } - @Override - public boolean isGameOver() { - return TimeUtils.nanoTime() > deadTime; + private int getTimeLeft() { + return Math.max(nanosToSeconds(deadTime - TimeUtils.nanoTime()), 0); } //endregion @@ -62,6 +67,11 @@ public class TimeScorer extends BaseScorer { return nanosToSeconds(deadTime - startTime); } + @Override + public boolean isGameOver() { + return TimeUtils.nanoTime() > deadTime; + } + @Override public void saveScore() { // TODO Save high time score @@ -73,9 +83,27 @@ public class TimeScorer extends BaseScorer { return false; } + @Override + public void pause() { + pauseTime = TimeUtils.nanoTime(); + pausedTimeLeft = getTimeLeft(); + } + + @Override + public void resume() { + if (pauseTime != 0L) { + long difference = TimeUtils.nanoTime() - pauseTime; + startTime += difference; + deadTime += difference; + + pauseTime = 0L; + pausedTimeLeft = -1; + } + } + @Override public void draw(SpriteBatch batch) { - int timeLeft = Math.max(nanosToSeconds(deadTime - TimeUtils.nanoTime()), 0); + int timeLeft = pausedTimeLeft < 0 ? getTimeLeft() : pausedTimeLeft; leftLabel.setText(Integer.toString(timeLeft)); super.draw(batch); diff --git a/core/src/io/github/lonamiwebs/klooni/screens/GameScreen.java b/core/src/io/github/lonamiwebs/klooni/screens/GameScreen.java index b473c93..f4a5adc 100644 --- a/core/src/io/github/lonamiwebs/klooni/screens/GameScreen.java +++ b/core/src/io/github/lonamiwebs/klooni/screens/GameScreen.java @@ -22,7 +22,7 @@ class GameScreen implements Screen, InputProcessor { //region Members - private final BaseScorer scorerlol; + private final BaseScorer scorer; private final Board board; private final PieceHolder holder; @@ -57,10 +57,10 @@ class GameScreen implements Screen, InputProcessor { final GameLayout layout = new GameLayout(); switch (gameMode) { case GAME_MODE_SCORE: - scorerlol = new Scorer(game, layout); + scorer = new Scorer(game, layout); break; case GAME_MODE_TIME: - scorerlol = new TimeScorer(game, layout); + scorer = new TimeScorer(game, layout); break; default: throw new RuntimeException("Unknown game mode given: "+gameMode); @@ -68,7 +68,7 @@ class GameScreen implements Screen, InputProcessor { board = new Board(layout, BOARD_SIZE); holder = new PieceHolder(layout, HOLDER_PIECE_COUNT, board.cellSize); - pauseMenu = new PauseMenuStage(layout, game, scorerlol); + pauseMenu = new PauseMenuStage(layout, game, scorer, gameMode); gameOverSound = Gdx.audio.newSound(Gdx.files.internal("sound/game_over.mp3")); } @@ -109,13 +109,13 @@ class GameScreen implements Screen, InputProcessor { Klooni.theme.glClearBackground(); Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); - if (scorerlol.isGameOver() && !pauseMenu.isShown()) { + if (scorer.isGameOver() && !pauseMenu.isShown()) { doGameOver(); } batch.begin(); - scorerlol.draw(batch); + scorer.draw(batch); board.draw(batch); holder.update(); holder.draw(batch); @@ -158,8 +158,8 @@ class GameScreen implements Screen, InputProcessor { return false; if (action == PieceHolder.ON_BOARD_DROP) { - scorerlol.addPieceScore(area); - scorerlol.addBoardScore(board.clearComplete(), board.cellCount); + scorer.addPieceScore(area); + scorer.addBoardScore(board.clearComplete(), board.cellCount); // After the piece was put, check if it's game over if (isGameOver()) { diff --git a/core/src/io/github/lonamiwebs/klooni/screens/PauseMenuStage.java b/core/src/io/github/lonamiwebs/klooni/screens/PauseMenuStage.java index b4cbeda..a7e7864 100644 --- a/core/src/io/github/lonamiwebs/klooni/screens/PauseMenuStage.java +++ b/core/src/io/github/lonamiwebs/klooni/screens/PauseMenuStage.java @@ -40,7 +40,7 @@ class PauseMenuStage extends Stage { //region Constructor // 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) { + PauseMenuStage(final GameLayout layout, final Klooni game, final BaseScorer scorer, final int gameMode) { this.scorer = scorer; shapeRenderer = new ShapeRenderer(20); // 20 vertex seems to be enough for a rectangle @@ -72,7 +72,7 @@ class PauseMenuStage extends Stage { replayButton.addListener(new ChangeListener() { @Override public void changed(ChangeEvent event, Actor actor) { - game.setScreen(new GameScreen(game, GameScreen.GAME_MODE_SCORE)); + game.setScreen(new GameScreen(game, gameMode)); dispose(); } }); @@ -122,6 +122,7 @@ class PauseMenuStage extends Stage { } } )); + scorer.resume(); } //endregion @@ -130,6 +131,7 @@ class PauseMenuStage extends Stage { // Shows the pause menu, indicating whether it's game over or not void show(final boolean gameOver) { + scorer.pause(); scorer.saveScore(); // Save the last input processor so then we can return the handle to it