diff --git a/android/assets/sound/effect_evaporate.mp3 b/android/assets/sound/effect_evaporate.mp3 new file mode 100644 index 0000000..6256f5d Binary files /dev/null and b/android/assets/sound/effect_evaporate.mp3 differ diff --git a/android/assets/sound/strip_clear.mp3 b/android/assets/sound/effect_vanish.mp3 similarity index 100% rename from android/assets/sound/strip_clear.mp3 rename to android/assets/sound/effect_vanish.mp3 diff --git a/core/src/io/github/lonamiwebs/klooni/Klooni.java b/core/src/io/github/lonamiwebs/klooni/Klooni.java index 4579127..766d004 100644 --- a/core/src/io/github/lonamiwebs/klooni/Klooni.java +++ b/core/src/io/github/lonamiwebs/klooni/Klooni.java @@ -22,11 +22,15 @@ import com.badlogic.gdx.Game; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.Preferences; import com.badlogic.gdx.Screen; -import com.badlogic.gdx.graphics.Texture; -import com.badlogic.gdx.graphics.g2d.BitmapFont; -import com.badlogic.gdx.graphics.g2d.NinePatch; +import com.badlogic.gdx.audio.Sound; +import com.badlogic.gdx.math.MathUtils; +import com.badlogic.gdx.math.Vector2; import com.badlogic.gdx.scenes.scene2d.ui.Skin; +import io.github.lonamiwebs.klooni.effects.EvaporateEffect; +import io.github.lonamiwebs.klooni.effects.IEffect; +import io.github.lonamiwebs.klooni.effects.VanishEffect; +import io.github.lonamiwebs.klooni.game.Cell; import io.github.lonamiwebs.klooni.screens.MainMenuScreen; import io.github.lonamiwebs.klooni.screens.TransitionScreen; @@ -47,6 +51,9 @@ public class Klooni extends Game { public static final int GAME_HEIGHT = 680; public static final int GAME_WIDTH = 408; + private static int usedEffect; + private Sound effectSound; + //endregion //region Creation @@ -75,6 +82,9 @@ public class Klooni extends Game { Gdx.input.setCatchBackKey(true); // To show the pause menu setScreen(new MainMenuScreen(this)); + + usedEffect = effectNameToInt(getUsedEffect()); + setUsedEffect(null); // Update the effect sound } //endregion @@ -99,6 +109,32 @@ public class Klooni extends Game { super.dispose(); skin.dispose(); theme.dispose(); + if (effectSound != null) + effectSound.dispose(); + } + + //endregion + + //region Effects + + // Effects used when clearing a row + public static IEffect createEffect(final Cell deadCell, final Vector2 culprit) { + final IEffect effect; + switch (usedEffect) { + default: + case 0: + effect = new VanishEffect(); + break; + case 1: + effect = new EvaporateEffect(); + break; + } + effect.setInfo(deadCell, culprit); + return effect; + } + + public void playEffectSound() { + effectSound.play(MathUtils.random(0.7f, 1f), MathUtils.random(0.8f, 1.2f), 0); } //endregion @@ -181,6 +217,38 @@ public class Klooni extends Game { theme.update(newTheme.getName()); } + // Effects related + public static String getUsedEffect() { + return prefs.getString("effectName"); + } + + public void setUsedEffect(final String name) { + if (name != null) + prefs.putString("effectName", name).flush(); + + if (effectSound != null) + effectSound.dispose(); + + switch (effectNameToInt(getUsedEffect())) { + default: + case 0: + effectSound = Gdx.audio.newSound(Gdx.files.internal("sound/effect_vanish.mp3")); + break; + case 1: + effectSound = Gdx.audio.newSound(Gdx.files.internal("sound/effect_evaporate.mp3")); + break; + } + } + + private static int effectNameToInt(final String name) { + // String comparision is more expensive compared to a single integer one, + // and when creating instances of a lot of effects it's better if we can + // save some processor cycles. + if (name.equals("vanish")) return 0; + if (name.equals("evaporate")) return 1; + return -1; + } + // Money related public static void addMoneyFromScore(int score) { setMoney(getRealMoney() + score * SCORE_TO_MONEY); diff --git a/core/src/io/github/lonamiwebs/klooni/game/Board.java b/core/src/io/github/lonamiwebs/klooni/game/Board.java index c50ee51..84e83fc 100644 --- a/core/src/io/github/lonamiwebs/klooni/game/Board.java +++ b/core/src/io/github/lonamiwebs/klooni/game/Board.java @@ -46,7 +46,6 @@ public class Board implements BinSerializable { private final Array effects; // Particle effects once they vanish final Vector2 pos; - private final Sound stripClearSound; // Used to animate cleared cells vanishing private final Vector2 lastPutPiecePos; @@ -58,8 +57,6 @@ public class Board implements BinSerializable { public Board(final GameLayout layout, int cellCount) { this.cellCount = cellCount; - stripClearSound = Gdx.audio.newSound(Gdx.files.internal("sound/strip_clear.mp3")); - lastPutPiecePos = new Vector2(); pos = new Vector2(); effects = new Array(32); // 32 capacity for 3 rows (most common) @@ -206,16 +203,11 @@ public class Board implements BinSerializable { clearCount++; } if (clearCount > 0) { - float pan = 0; - // Do clear those rows and columns - // TODO Don't always use "vanish effect" for (int i = 0; i < cellCount; ++i) { if (clearedRows[i]) { for (int j = 0; j < cellCount; ++j) { - IEffect effect = new EvaporateEffect(); - effect.setInfo(cells[i][j], lastPutPiecePos); - effects.add(effect); + effects.add(Klooni.createEffect(cells[i][j], lastPutPiecePos)); cells[i][j].set(-1); } } @@ -223,21 +215,12 @@ public class Board implements BinSerializable { for (int j = 0; j < cellCount; ++j) { if (clearedCols[j]) { - pan += 2f * (j - cellCount / 2) / (float)cellCount; for (int i = 0; i < cellCount; ++i) { - IEffect effect = new EvaporateEffect(); - effect.setInfo(cells[i][j], lastPutPiecePos); - effects.add(effect); + effects.add(Klooni.createEffect(cells[i][j], lastPutPiecePos)); cells[i][j].set(-1); } } } - - if (Klooni.soundsEnabled()) { - pan = MathUtils.clamp(pan, -1, 1); - stripClearSound.play( - MathUtils.random(0.7f, 1f), MathUtils.random(0.8f, 1.2f), pan); - } } return clearCount; diff --git a/core/src/io/github/lonamiwebs/klooni/screens/GameScreen.java b/core/src/io/github/lonamiwebs/klooni/screens/GameScreen.java index 6e10b74..7488d38 100644 --- a/core/src/io/github/lonamiwebs/klooni/screens/GameScreen.java +++ b/core/src/io/github/lonamiwebs/klooni/screens/GameScreen.java @@ -25,6 +25,7 @@ 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.MathUtils; import java.io.DataInputStream; import java.io.DataOutputStream; @@ -47,6 +48,7 @@ class GameScreen implements Screen, InputProcessor, BinSerializable { //region Members + private final Klooni game; private final BaseScorer scorer; private final BonusParticleHandler bonusParticleHandler; @@ -93,6 +95,7 @@ class GameScreen implements Screen, InputProcessor, BinSerializable { GameScreen(final Klooni game, final int gameMode, final boolean loadSave) { batch = new SpriteBatch(); + this.game = game; this.gameMode = gameMode; final GameLayout layout = new GameLayout(); @@ -236,8 +239,12 @@ class GameScreen implements Screen, InputProcessor, BinSerializable { if (result.onBoard) { scorer.addPieceScore(result.area); int bonus = scorer.addBoardScore(board.clearComplete(), board.cellCount); - if (bonus > 0) + if (bonus > 0) { bonusParticleHandler.addBonus(result.pieceCenter, bonus); + if (Klooni.soundsEnabled()) { + game.playEffectSound(); + } + } // After the piece was put, check if it's game over if (isGameOver()) {