diff --git a/src/main/java/edu/ntnu/idi/idatt2003/gruppe42/Audio/Audio.java b/src/main/java/edu/ntnu/idi/idatt2003/gruppe42/Audio/Audio.java new file mode 100644 index 0000000..1008b05 --- /dev/null +++ b/src/main/java/edu/ntnu/idi/idatt2003/gruppe42/Audio/Audio.java @@ -0,0 +1,24 @@ +package edu.ntnu.idi.idatt2003.gruppe42.Audio; + +public enum Audio { + + // Sound effects + OPEN_APP("/Audio/open_app.wav"), + CLOSE_APP("/Audio/close_app.wav"), + CLOCK("/Audio/clock.wav"), + TRANSACTION("/Audio/transaction.wav"), + + // Background music + WORK_THEME("/Audio/work_theme.mp3"), + WEEKEND_THEME("/Audio/weekend_theme.mp3"); + + private String path; + + Audio(String path) { + this.path = path; + } + + public String getPath() { + return path; + } +} diff --git a/src/main/java/edu/ntnu/idi/idatt2003/gruppe42/Audio/AudioManager.java b/src/main/java/edu/ntnu/idi/idatt2003/gruppe42/Audio/AudioManager.java index 6587275..1d1bca0 100644 --- a/src/main/java/edu/ntnu/idi/idatt2003/gruppe42/Audio/AudioManager.java +++ b/src/main/java/edu/ntnu/idi/idatt2003/gruppe42/Audio/AudioManager.java @@ -1,39 +1,60 @@ package edu.ntnu.idi.idatt2003.gruppe42.Audio; -import javafx.scene.media.AudioClip; +import javafx.scene.media.Media; +import javafx.scene.media.MediaPlayer; import java.util.EnumMap; import java.util.Map; public class AudioManager { - private static AudioManager instance = new AudioManager(); - private Map sounds = new EnumMap<>(SoundEffect.class); - private double volume = 1.0; + private static final AudioManager instance = new AudioManager(); + private final Map urlCache = new EnumMap<>(Audio.class); + private MediaPlayer bgPlayer; - public AudioManager() { + private AudioManager() { + for (Audio audio : Audio.values()) { + var url = getClass().getResource(audio.getPath()); + urlCache.put(audio, url.toExternalForm()); + } + } - for (SoundEffect effect : SoundEffect.values()) { + public static AudioManager getInstance() { return instance; } - AudioClip clip = new AudioClip( - getClass() - .getResource(effect.getPath()) - .toExternalForm() - ); + public void playSFX(Audio audio) { + String url = urlCache.get(audio); - sounds.put(effect, clip); + if (url == null) { + return; } - } - public static AudioManager getInstance() { - return instance; + MediaPlayer sfxPlayer = new MediaPlayer(new Media(url)); + sfxPlayer.setOnEndOfMedia(() -> { + sfxPlayer.stop(); + sfxPlayer.dispose(); + }); + + sfxPlayer.play(); } - public void play(SoundEffect sound) { - AudioClip audioClip = sounds.get(sound); + public void playBgMusic(Audio audio) { + stopBgMusic(); + + String url = urlCache.get(audio); + if (url == null) { + return; + } + + bgPlayer = new MediaPlayer(new Media(url)); + bgPlayer.setVolume(1); + bgPlayer.play(); + } - if (audioClip != null) { - audioClip.play(volume); + public void stopBgMusic() { + if (bgPlayer != null) { + bgPlayer.stop(); + bgPlayer.dispose(); + bgPlayer = null; } } -} +} \ No newline at end of file diff --git a/src/main/java/edu/ntnu/idi/idatt2003/gruppe42/Audio/SoundEffect.java b/src/main/java/edu/ntnu/idi/idatt2003/gruppe42/Audio/SoundEffect.java deleted file mode 100644 index 3341a6e..0000000 --- a/src/main/java/edu/ntnu/idi/idatt2003/gruppe42/Audio/SoundEffect.java +++ /dev/null @@ -1,17 +0,0 @@ -package edu.ntnu.idi.idatt2003.gruppe42.Audio; - -public enum SoundEffect { - - OPEN_APP("/Audio/open_app.wav"), - CLOSE_APP("/Audio/close_app.wav"); - - private String path; - - SoundEffect(String path) { - this.path = path; - } - - public String getPath() { - return path; - } -} diff --git a/src/main/java/edu/ntnu/idi/idatt2003/gruppe42/Controller/AppControllers/StockAppController.java b/src/main/java/edu/ntnu/idi/idatt2003/gruppe42/Controller/AppControllers/StockAppController.java index 9ebdf3e..b08777c 100644 --- a/src/main/java/edu/ntnu/idi/idatt2003/gruppe42/Controller/AppControllers/StockAppController.java +++ b/src/main/java/edu/ntnu/idi/idatt2003/gruppe42/Controller/AppControllers/StockAppController.java @@ -1,5 +1,7 @@ package edu.ntnu.idi.idatt2003.gruppe42.Controller.AppControllers; +import edu.ntnu.idi.idatt2003.gruppe42.Audio.AudioManager; +import edu.ntnu.idi.idatt2003.gruppe42.Audio.Audio; import edu.ntnu.idi.idatt2003.gruppe42.Controller.MarketController; import edu.ntnu.idi.idatt2003.gruppe42.Model.Player; import edu.ntnu.idi.idatt2003.gruppe42.Model.Stock; @@ -27,6 +29,7 @@ public final class StockAppController implements AppController { private final StockApp stockApp; private final Player player; private Stock currentStock; + private AudioManager audioManager = AudioManager.getInstance(); /** * Constructs a new StockAppController. @@ -65,7 +68,10 @@ public StockAppController( } }); - stockApp.getConfirmButton().setOnAction(e -> handleTransaction()); + stockApp.getConfirmButton().setOnAction(e -> { + audioManager.playSFX(Audio.TRANSACTION); + handleTransaction(); + }); } /** diff --git a/src/main/java/edu/ntnu/idi/idatt2003/gruppe42/Controller/GameController.java b/src/main/java/edu/ntnu/idi/idatt2003/gruppe42/Controller/GameController.java index 1d9ff8a..f83896a 100644 --- a/src/main/java/edu/ntnu/idi/idatt2003/gruppe42/Controller/GameController.java +++ b/src/main/java/edu/ntnu/idi/idatt2003/gruppe42/Controller/GameController.java @@ -1,5 +1,7 @@ package edu.ntnu.idi.idatt2003.gruppe42.Controller; +import edu.ntnu.idi.idatt2003.gruppe42.Audio.Audio; +import edu.ntnu.idi.idatt2003.gruppe42.Audio.AudioManager; import edu.ntnu.idi.idatt2003.gruppe42.Controller.AppControllers.AppController; import edu.ntnu.idi.idatt2003.gruppe42.Model.GameState; @@ -15,6 +17,9 @@ public final class GameController { private final List appControllers = new ArrayList<>(); private Timer timer; private GameState gameState; + private AudioManager audioManager = AudioManager.getInstance(); + private boolean workMusicPlaying = false; + private boolean weekendMusicPlaying = false; /** * Adds an application controller to the list of controllers to be updated. @@ -28,6 +33,17 @@ public void addAppController(final AppController appController) { public void setGameState(GameState gameState) { this.gameState = gameState; + if (gameState == GameState.WORKDAY && !workMusicPlaying) { + audioManager.playBgMusic(Audio.WORK_THEME); + workMusicPlaying = true; + weekendMusicPlaying = false; + } + + if ((gameState == GameState.RENTDAY || gameState == GameState.FREEDAY) && !weekendMusicPlaying) { + audioManager.playBgMusic(Audio.WEEKEND_THEME); + weekendMusicPlaying = true; + workMusicPlaying = false; + } } /** diff --git a/src/main/java/edu/ntnu/idi/idatt2003/gruppe42/Controller/PopupsController.java b/src/main/java/edu/ntnu/idi/idatt2003/gruppe42/Controller/PopupsController.java index 794a176..4805405 100644 --- a/src/main/java/edu/ntnu/idi/idatt2003/gruppe42/Controller/PopupsController.java +++ b/src/main/java/edu/ntnu/idi/idatt2003/gruppe42/Controller/PopupsController.java @@ -1,7 +1,7 @@ package edu.ntnu.idi.idatt2003.gruppe42.Controller; import edu.ntnu.idi.idatt2003.gruppe42.Audio.AudioManager; -import edu.ntnu.idi.idatt2003.gruppe42.Audio.SoundEffect; +import edu.ntnu.idi.idatt2003.gruppe42.Audio.Audio; import edu.ntnu.idi.idatt2003.gruppe42.Model.App; import edu.ntnu.idi.idatt2003.gruppe42.View.Popup; import java.util.List; @@ -38,7 +38,7 @@ public boolean show(App type) { popup.getRoot().autosize(); popup.getRoot().toFront(); }); - audioManager.play(SoundEffect.OPEN_APP); + audioManager.playSFX(Audio.OPEN_APP); return true; } @@ -47,7 +47,7 @@ public boolean hide(Popup popup) { return false; } popup.getRoot().setVisible(false); - audioManager.play(SoundEffect.CLOSE_APP); + audioManager.playSFX(Audio.CLOSE_APP); return true; } diff --git a/src/main/java/edu/ntnu/idi/idatt2003/gruppe42/Controller/TimeAndWeatherController.java b/src/main/java/edu/ntnu/idi/idatt2003/gruppe42/Controller/TimeAndWeatherController.java index 4fda836..247e217 100644 --- a/src/main/java/edu/ntnu/idi/idatt2003/gruppe42/Controller/TimeAndWeatherController.java +++ b/src/main/java/edu/ntnu/idi/idatt2003/gruppe42/Controller/TimeAndWeatherController.java @@ -1,9 +1,13 @@ package edu.ntnu.idi.idatt2003.gruppe42.Controller; +import edu.ntnu.idi.idatt2003.gruppe42.Audio.AudioManager; +import edu.ntnu.idi.idatt2003.gruppe42.Audio.Audio; import edu.ntnu.idi.idatt2003.gruppe42.Controller.AppControllers.AppController; import edu.ntnu.idi.idatt2003.gruppe42.Model.Day; import edu.ntnu.idi.idatt2003.gruppe42.Model.GameState; import java.util.Random; + +import javafx.application.Platform; import javafx.beans.property.IntegerProperty; import javafx.beans.property.SimpleIntegerProperty; import javafx.beans.property.SimpleStringProperty; @@ -21,6 +25,7 @@ public class TimeAndWeatherController implements AppController { private final StringProperty weather = new SimpleStringProperty("Sunny"); private final Random random = new Random(); private final GameController gameController; + private AudioManager audioManager = AudioManager.getInstance(); private static final Day[] DAYS = {Day.SUN, Day.MON, Day.TUE, Day.WED, Day.THU, Day.FRI, Day.SAT}; @@ -40,6 +45,7 @@ public void nextTick() { updateGameState(); updateWeather(); hour.set(0); + Platform.runLater(() -> audioManager.playSFX(Audio.CLOCK)); } else { hour.set(nextHour); } diff --git a/src/main/resources/Audio/clock.wav b/src/main/resources/Audio/clock.wav new file mode 100644 index 0000000..67e1002 Binary files /dev/null and b/src/main/resources/Audio/clock.wav differ diff --git a/src/main/resources/Audio/close_app.wav b/src/main/resources/Audio/close_app.wav index 55ea3aa..9b6291b 100644 Binary files a/src/main/resources/Audio/close_app.wav and b/src/main/resources/Audio/close_app.wav differ diff --git a/src/main/resources/Audio/mouse_click.wav b/src/main/resources/Audio/mouse_click.wav deleted file mode 100644 index 848eb7a..0000000 Binary files a/src/main/resources/Audio/mouse_click.wav and /dev/null differ diff --git a/src/main/resources/Audio/open_app.wav b/src/main/resources/Audio/open_app.wav index 1332cc1..5675422 100644 Binary files a/src/main/resources/Audio/open_app.wav and b/src/main/resources/Audio/open_app.wav differ diff --git a/src/main/resources/Audio/transaction.wav b/src/main/resources/Audio/transaction.wav new file mode 100644 index 0000000..6f135a9 Binary files /dev/null and b/src/main/resources/Audio/transaction.wav differ diff --git a/src/main/resources/Audio/weekend_theme.mp3 b/src/main/resources/Audio/weekend_theme.mp3 new file mode 100644 index 0000000..469e608 Binary files /dev/null and b/src/main/resources/Audio/weekend_theme.mp3 differ diff --git a/src/main/resources/Audio/work_theme.mp3 b/src/main/resources/Audio/work_theme.mp3 new file mode 100644 index 0000000..cc557cd Binary files /dev/null and b/src/main/resources/Audio/work_theme.mp3 differ