From d5f778240de2dee16ba15ffd86606db07ddc0e31 Mon Sep 17 00:00:00 2001 From: Lonami Exo Date: Fri, 10 Feb 2017 18:28:07 +0100 Subject: [PATCH] Show bonus score after clearing strips (closes #7) --- .../github/lonamiwebs/klooni/game/BaseScorer.java | 10 +++++----- .../klooni/game/BonusParticleHandler.java | 8 ++++---- .../lonamiwebs/klooni/game/PieceHolder.java | 4 ++++ .../io/github/lonamiwebs/klooni/game/Scorer.java | 3 ++- .../github/lonamiwebs/klooni/game/TimeScorer.java | 4 +++- .../lonamiwebs/klooni/screens/GameScreen.java | 15 ++++++++++++++- 6 files changed, 32 insertions(+), 12 deletions(-) diff --git a/core/src/io/github/lonamiwebs/klooni/game/BaseScorer.java b/core/src/io/github/lonamiwebs/klooni/game/BaseScorer.java index 03443a0..5e9da10 100644 --- a/core/src/io/github/lonamiwebs/klooni/game/BaseScorer.java +++ b/core/src/io/github/lonamiwebs/klooni/game/BaseScorer.java @@ -48,7 +48,7 @@ public abstract class BaseScorer implements BinSerializable { //region Private methods - protected abstract void addScore(int score); + protected abstract int addScore(int score); // The original game seems to work as follows: // If < 1 were cleared, score = 0 @@ -65,13 +65,13 @@ public abstract class BaseScorer implements BinSerializable { //region Public methods // Adds the score a given piece would give - public final void addPieceScore(int areaPut) { - addScore(areaPut); + public final int addPieceScore(int areaPut) { + return addScore(areaPut); } // Adds the score given by the board, this is, the count of cleared strips - public final void addBoardScore(int stripsCleared, int boardSize) { - addScore(calculateClearScore(stripsCleared, boardSize)); + public final int addBoardScore(int stripsCleared, int boardSize) { + return addScore(calculateClearScore(stripsCleared, boardSize)); } public void pause() { } diff --git a/core/src/io/github/lonamiwebs/klooni/game/BonusParticleHandler.java b/core/src/io/github/lonamiwebs/klooni/game/BonusParticleHandler.java index 4ec32c5..12cbbc4 100644 --- a/core/src/io/github/lonamiwebs/klooni/game/BonusParticleHandler.java +++ b/core/src/io/github/lonamiwebs/klooni/game/BonusParticleHandler.java @@ -7,21 +7,21 @@ import com.badlogic.gdx.utils.Array; import java.util.Iterator; -class BonusParticleHandler { +public class BonusParticleHandler { private final Array particles; private final Label.LabelStyle labelStyle; - BonusParticleHandler(final Label.LabelStyle style) { + public BonusParticleHandler(final Label.LabelStyle style) { labelStyle = style; particles = new Array(); } - void addBonus(final Vector2 pos, final int score) { + public void addBonus(final Vector2 pos, final int score) { particles.add(new BonusParticle(pos, score, labelStyle)); } - void run(final Batch batch) { + public void run(final Batch batch) { BonusParticle particle; Iterator iterator = particles.iterator(); while (iterator.hasNext()) { diff --git a/core/src/io/github/lonamiwebs/klooni/game/PieceHolder.java b/core/src/io/github/lonamiwebs/klooni/game/PieceHolder.java index 9c3ec40..84808fe 100644 --- a/core/src/io/github/lonamiwebs/klooni/game/PieceHolder.java +++ b/core/src/io/github/lonamiwebs/klooni/game/PieceHolder.java @@ -172,6 +172,10 @@ public class PieceHolder implements BinSerializable { return heldPiece > -1 ? pieces[heldPiece].calculateArea() : 0; } + public Vector2 calculateHeldPieceCenter() { + return heldPiece > -1 ? pieces[heldPiece].calculateGravityCenter() : null; + } + // Tries to drop the piece on the given board. As a result, it // returns one of the following: NO_DROP, NORMAL_DROP, ON_BOARD_DROP public int dropPiece(Board board) { diff --git a/core/src/io/github/lonamiwebs/klooni/game/Scorer.java b/core/src/io/github/lonamiwebs/klooni/game/Scorer.java index 854ff64..03dab8b 100644 --- a/core/src/io/github/lonamiwebs/klooni/game/Scorer.java +++ b/core/src/io/github/lonamiwebs/klooni/game/Scorer.java @@ -40,8 +40,9 @@ public class Scorer extends BaseScorer implements BinSerializable { //region Private methods @Override - protected void addScore(int score) { + protected int addScore(int score) { currentScore += score; + return score; } //endregion diff --git a/core/src/io/github/lonamiwebs/klooni/game/TimeScorer.java b/core/src/io/github/lonamiwebs/klooni/game/TimeScorer.java index a062093..9cfa86d 100644 --- a/core/src/io/github/lonamiwebs/klooni/game/TimeScorer.java +++ b/core/src/io/github/lonamiwebs/klooni/game/TimeScorer.java @@ -58,8 +58,10 @@ public class TimeScorer extends BaseScorer implements BinSerializable { //region Private methods @Override - protected void addScore(int score) { + protected int addScore(int score) { + int scoreBefore = getCurrentScore(); deadTime += scoreToNanos(score); + return getCurrentScore() - scoreBefore; } private int nanosToSeconds(long nano) { diff --git a/core/src/io/github/lonamiwebs/klooni/screens/GameScreen.java b/core/src/io/github/lonamiwebs/klooni/screens/GameScreen.java index 1b28e34..211a1d6 100644 --- a/core/src/io/github/lonamiwebs/klooni/screens/GameScreen.java +++ b/core/src/io/github/lonamiwebs/klooni/screens/GameScreen.java @@ -8,6 +8,8 @@ import com.badlogic.gdx.audio.Sound; import com.badlogic.gdx.files.FileHandle; import com.badlogic.gdx.graphics.GL20; import com.badlogic.gdx.graphics.g2d.SpriteBatch; +import com.badlogic.gdx.math.Vector2; +import com.badlogic.gdx.scenes.scene2d.ui.Label; import java.io.DataInputStream; import java.io.DataOutputStream; @@ -16,6 +18,7 @@ import java.io.IOException; import io.github.lonamiwebs.klooni.Klooni; import io.github.lonamiwebs.klooni.game.BaseScorer; import io.github.lonamiwebs.klooni.game.Board; +import io.github.lonamiwebs.klooni.game.BonusParticleHandler; import io.github.lonamiwebs.klooni.game.GameLayout; import io.github.lonamiwebs.klooni.game.Piece; import io.github.lonamiwebs.klooni.game.PieceHolder; @@ -30,6 +33,7 @@ class GameScreen implements Screen, InputProcessor, BinSerializable { //region Members private final BaseScorer scorer; + private final BonusParticleHandler bonusParticleHandler; private final Board board; private final PieceHolder holder; @@ -86,6 +90,10 @@ class GameScreen implements Screen, InputProcessor, BinSerializable { holder = new PieceHolder(layout, HOLDER_PIECE_COUNT, board.cellSize); pauseMenu = new PauseMenuStage(layout, game, scorer, gameMode); + Label.LabelStyle labelStyle = new Label.LabelStyle(); + labelStyle.font = game.skin.getFont("font"); + bonusParticleHandler = new BonusParticleHandler(labelStyle); + gameOverSound = Gdx.audio.newSound(Gdx.files.internal("sound/game_over.mp3")); if (gameMode == GAME_MODE_SCORE) { @@ -165,6 +173,7 @@ class GameScreen implements Screen, InputProcessor, BinSerializable { board.draw(batch); holder.update(); holder.draw(batch); + bonusParticleHandler.run(batch); batch.end(); @@ -199,13 +208,17 @@ class GameScreen implements Screen, InputProcessor, BinSerializable { @Override public boolean touchUp(int screenX, int screenY, int pointer, int button) { int area = holder.calculateHeldPieceArea(); + Vector2 pos = holder.calculateHeldPieceCenter(); + int action = holder.dropPiece(board); if (action == PieceHolder.NO_DROP) return false; if (action == PieceHolder.ON_BOARD_DROP) { scorer.addPieceScore(area); - scorer.addBoardScore(board.clearComplete(), board.cellCount); + int bonus = scorer.addBoardScore(board.clearComplete(), board.cellCount); + if (bonus > 0) + bonusParticleHandler.addBonus(pos, bonus); // After the piece was put, check if it's game over if (isGameOver()) {