diff --git a/bin/de/bricked/resources/sounds/hit_wall.mp3 b/bin/de/bricked/resources/sounds/hit_wall.mp3 index b3944f7afdc3a2186323014077e1bf74b2190b3d..89e45f6bc237c7d5f3714d315e6b81346bcc4653 100644 Binary files a/bin/de/bricked/resources/sounds/hit_wall.mp3 and b/bin/de/bricked/resources/sounds/hit_wall.mp3 differ diff --git a/src/de/bricked/game/Game.java b/src/de/bricked/game/Game.java index dc3a8ed8bdc2887d38d84a85a1f188221c770e4d..649c06251fd8178cf7ba6daa4f767489a4183d52 100644 --- a/src/de/bricked/game/Game.java +++ b/src/de/bricked/game/Game.java @@ -36,10 +36,8 @@ public class Game public Game() { this.settings = new Settings(); - this.soundHandler = new SoundHandler(); - //DEBUG - soundHandler.setVolume(1.0); - soundHandler.setMuted(false); + //DEBUG values in constructor should be loaded from settings + this.soundHandler = new SoundHandler(1.0, false); this.levelPack = null; this.level = null; this.livesRemaining = 0; diff --git a/src/de/bricked/game/board/Board.java b/src/de/bricked/game/board/Board.java index 7e8b3afa18024a4de810b96ecf1862bb8b699ff4..2474070ac7927baf93eb52cf67509a5b169cdef0 100644 --- a/src/de/bricked/game/board/Board.java +++ b/src/de/bricked/game/board/Board.java @@ -10,6 +10,7 @@ import de.bricked.game.powerups.ExtraLifePowerUp; import de.bricked.game.powerups.PowerUp; import de.bricked.game.powerups.ball.ExplodeBallPowerUp; import de.bricked.game.powerups.ball.NoCollisionBallPowerUp; +import de.bricked.game.sound.SoundType; import de.bricked.ui.LevelController; public class Board @@ -210,11 +211,11 @@ public class Board if(hittedBrick.getType().equals(BrickType.TNT)) { explodeBrick(row, col); - game.getSoundHandler().play("tnt"); + game.getSoundHandler().play(SoundType.TNT); } else { - game.getSoundHandler().play("destroy_brick"); + game.getSoundHandler().play(SoundType.DESTROY_BRICK); } if(hittedBrick.getPowerUp() != null) @@ -234,7 +235,7 @@ public class Board } else { - game.getSoundHandler().play("hit_brick"); + game.getSoundHandler().play(SoundType.HIT_BRICK); LevelController.redrawBrick(col, row, bricks.get(row).get(col), false); } } diff --git a/src/de/bricked/game/sound/SoundHandler.java b/src/de/bricked/game/sound/SoundHandler.java index e72c1e8dffcb6d7f3e0f920f41e7b37be0105549..f37a3593ea8b97c88a120a47551b29d4d200e6a7 100644 --- a/src/de/bricked/game/sound/SoundHandler.java +++ b/src/de/bricked/game/sound/SoundHandler.java @@ -2,72 +2,83 @@ package de.bricked.game.sound; import java.net.MalformedURLException; import java.net.URISyntaxException; +import java.util.HashMap; import de.bricked.game.Config; import javafx.scene.media.Media; import javafx.scene.media.MediaPlayer; +import javafx.scene.media.MediaPlayer.Status; import logger.LogLevel; import logger.Logger; public class SoundHandler { - private double volume; - private boolean muted; - private boolean isPlayingTNT; - - public SoundHandler() - { - volume = 0.0; - muted = false; - isPlayingTNT = false; - } + private double volume; + private boolean muted; + private HashMap<SoundType, MediaPlayer> mediaPlayers; - public void play(String soundID) - { - if(volume > 0 && !muted) - { - try - { - if(!isPlayingTNT) - { - if(soundID.equalsIgnoreCase("tnt")) - { - isPlayingTNT = true; - } - String path = SoundHandler.class.getResource(Config.JAR_SOUND_SAVEDIR + soundID + ".mp3").toURI().toURL().toString(); - Media sound = new Media(path); - MediaPlayer mediaPlayer = new MediaPlayer(sound); - mediaPlayer.setVolume(volume); - mediaPlayer.setAutoPlay(true); - mediaPlayer.setOnEndOfMedia(()->{ - isPlayingTNT = false; - }); - } - } - catch (MalformedURLException | URISyntaxException e) - { - Logger.log(LogLevel.ERROR, Logger.exceptionToString(e)); - } - } + public SoundHandler(double volume, boolean muted) + { + this.volume = volume; + this.muted = muted; + + mediaPlayers = new HashMap<>(); + + for(SoundType currentType : SoundType.values()) + { + try + { + String path = SoundHandler.class.getResource(Config.JAR_SOUND_SAVEDIR + currentType.getFileName() + ".mp3").toURI().toURL().toString(); + Media sound = new Media(path); + MediaPlayer mediaPlayer = new MediaPlayer(sound); + mediaPlayer.setVolume(volume); + mediaPlayer.setAutoPlay(false); + mediaPlayer.setOnEndOfMedia(()->{ + mediaPlayer.stop(); + }); + + mediaPlayers.put(currentType, mediaPlayer); + } + catch(MalformedURLException | URISyntaxException e) + { + Logger.log(LogLevel.ERROR, Logger.exceptionToString(e)); + } + } + } + + public void play(SoundType soundType) + { + if(volume > 0 && !muted) + { + MediaPlayer player = mediaPlayers.get(soundType); + + if(player != null) + { + if(!player.getStatus().equals(Status.PLAYING)) + { + player.play(); + } + } + } } - public double getVolume() - { - return volume; - } + public double getVolume() + { + return volume; + } - public boolean isMuted() - { - return muted; - } + public boolean isMuted() + { + return muted; + } - public void setVolume(double volume) - { - this.volume = volume; - } + public void setVolume(double volume) + { + this.volume = volume; + } - public void setMuted(boolean muted) - { - this.muted = muted; - } + public void setMuted(boolean muted) + { + this.muted = muted; + } } \ No newline at end of file diff --git a/src/de/bricked/game/sound/SoundType.java b/src/de/bricked/game/sound/SoundType.java new file mode 100644 index 0000000000000000000000000000000000000000..191d459747e628d8af9c7dbe62c87760e01f4762 --- /dev/null +++ b/src/de/bricked/game/sound/SoundType.java @@ -0,0 +1,26 @@ +package de.bricked.game.sound; + +public enum SoundType +{ + HIT_WALL("hit_wall"), + HIT_PADDLE("hit_paddle"), + HIT_BRICK("hit_brick"), + DESTROY_BRICK("destroy_brick"), + TNT("tnt"), + LIFE_LOST("life_lost"), + GAME_OVER("game_over"), + FINISHED_LEVEL("finished_level"), + UNLOCKED("unlocked"); + + private String fileName; + + private SoundType(String fileName) + { + this.fileName = fileName; + } + + public String getFileName() + { + return fileName; + } +} \ No newline at end of file diff --git a/src/de/bricked/resources/sounds/hit_wall.mp3 b/src/de/bricked/resources/sounds/hit_wall.mp3 index b3944f7afdc3a2186323014077e1bf74b2190b3d..89e45f6bc237c7d5f3714d315e6b81346bcc4653 100644 Binary files a/src/de/bricked/resources/sounds/hit_wall.mp3 and b/src/de/bricked/resources/sounds/hit_wall.mp3 differ diff --git a/src/de/bricked/ui/LevelController.java b/src/de/bricked/ui/LevelController.java index 185cf18ff8ddfd39921ab8832a6738a968f5245b..f2d2d082bd8119af07eb865adf43790236f5aba0 100644 --- a/src/de/bricked/ui/LevelController.java +++ b/src/de/bricked/ui/LevelController.java @@ -19,6 +19,7 @@ import de.bricked.game.paddle.Paddle; import de.bricked.game.paddle.PaddleSize; import de.bricked.game.powerups.PowerUp; import de.bricked.game.powerups.PowerUpType; +import de.bricked.game.sound.SoundType; import de.bricked.utils.CountdownTimer; import fontAwesome.FontIcon; import fontAwesome.FontIconType; @@ -441,7 +442,7 @@ public class LevelController gameState = GameState.STOPPED; timer.stop(); - game.getSoundHandler().play("game_over"); + game.getSoundHandler().play(SoundType.GAME_OVER); Platform.runLater(() -> { Alert alert = new Alert(AlertType.INFORMATION); @@ -460,7 +461,7 @@ public class LevelController gameState = GameState.WAITING; timer.stop(); - game.getSoundHandler().play("life_lost"); + game.getSoundHandler().play(SoundType.LIFE_LOST); // reset paddle and ball initPaddle(game.getLevel().getInitPadSize()); @@ -472,7 +473,7 @@ public class LevelController { game.getBall().setDirection(game.reflectBall(hitLocation, game.getBall().getDirection())); - game.getSoundHandler().play("hit_wall"); + game.getSoundHandler().play(SoundType.HIT_WALL); switch(hitLocation) { @@ -524,7 +525,7 @@ public class LevelController resetMultiplicator(); - game.getSoundHandler().play("hit_paddle"); + game.getSoundHandler().play(SoundType.HIT_PADDLE); } // ball doesn't collide with paddle --> check collision with bricks else @@ -804,7 +805,7 @@ public class LevelController resetMultiplicator(); timer.stop(); - game.getSoundHandler().play("finished_level"); + game.getSoundHandler().play(SoundType.FINISHED_LEVEL); Platform.runLater(() -> { Alert alert = new Alert(AlertType.INFORMATION);