From 392a81b2d86fc7dc8c05871d9b1636f485c7d961 Mon Sep 17 00:00:00 2001 From: Yvonne Schmidt Date: Sat, 7 Dec 2024 18:29:41 +0100 Subject: [PATCH] fixed background music overlap --- .../java/pp/monopoly/client/GameMusic.java | 38 ++++++++------ .../pp/monopoly/client/gui/LobbyMenu.java | 30 +++++++++-- .../pp/monopoly/client/gui/SettingsMenu.java | 52 ++++++++++++++++--- 3 files changed, 96 insertions(+), 24 deletions(-) diff --git a/Projekte/monopoly/client/src/main/java/pp/monopoly/client/GameMusic.java b/Projekte/monopoly/client/src/main/java/pp/monopoly/client/GameMusic.java index d3cd100..64d72c8 100644 --- a/Projekte/monopoly/client/src/main/java/pp/monopoly/client/GameMusic.java +++ b/Projekte/monopoly/client/src/main/java/pp/monopoly/client/GameMusic.java @@ -13,14 +13,13 @@ import com.jme3.asset.AssetLoadException; import com.jme3.asset.AssetNotFoundException; import com.jme3.audio.AudioData; import com.jme3.audio.AudioNode; - /** * Handles the background and secondary music in the game. * Allows playing, stopping, and toggling between background music and a secondary track. */ public class GameMusic extends AbstractAppState { - private static final Logger LOGGER = System.getLogger(GameMusic.class.getName()); - private static final Preferences PREFERENCES = getPreferences(GameMusic.class); + private static final Logger LOGGER = System.getLogger(pp.monopoly.client.GameMusic.class.getName()); + private static final Preferences PREFERENCES = getPreferences(pp.monopoly.client.GameMusic.class); private static final String ENABLED_PREF = "enabled"; // NON-NLS private static final String VOLUME_PREF = "volume"; // NON-NLS @@ -68,8 +67,9 @@ public class GameMusic extends AbstractAppState { /** * Plays the main music. + */ - private void playMainMusic() { + public void playMainMusic() { if (!isEnabled()) { return; // Sound is disabled } @@ -92,11 +92,10 @@ public class GameMusic extends AbstractAppState { /** * Plays the secondary music and stops the main music. * - * @param app The application instance - * @param secondaryMusicFile The file path of the secondary audio file */ - private void playSecondaryMusic() { - if(!isEnabled()) { + public void playSecondaryMusic() { + if (!isEnabled()) { + stopAllMusic(); return; } if (isSecondaryMusicPlaying) { @@ -115,7 +114,7 @@ public class GameMusic extends AbstractAppState { /** * Stops the secondary music. */ - private void stopSecondaryMusic() { + public void stopSecondaryMusic() { if (secondaryMusic != null && isSecondaryMusicPlaying) { secondaryMusic.stop(); isSecondaryMusicPlaying = false; @@ -127,17 +126,17 @@ public class GameMusic extends AbstractAppState { * If the secondary track is playing, it stops and resumes the background music. * If the background music is playing, it pauses and plays the secondary track. * - * @param app The application instance - * @param secondaryMusicFile The file path of the secondary audio file */ public void toggleMusic() { - if(!isEnabled()) { + if (!isEnabled()) { + stopAllMusic(); return; } if (isSecondaryMusicPlaying) { stopSecondaryMusic(); playMainMusic(); } else { + stopMainMusic(); playSecondaryMusic(); } } @@ -153,6 +152,14 @@ public class GameMusic extends AbstractAppState { PREFERENCES.putFloat(VOLUME_PREF, vol); } + /** + * Stops all music (both main and secondary). + */ + public void stopAllMusic() { + stopMainMusic(); + stopSecondaryMusic(); + } + /** * Enables or disables the sound system. * When disabled, all music stops. @@ -161,13 +168,14 @@ public class GameMusic extends AbstractAppState { */ @Override public void setEnabled(boolean enabled) { - if (isEnabled() == enabled) return; + if (isEnabled() == enabled) return; // Avoid redundant operations + + PREFERENCES.putBoolean(ENABLED_PREF, enabled); if (enabled) { playMainMusic(); } else { - stopMainMusic(); - stopSecondaryMusic(); + stopAllMusic(); } super.setEnabled(enabled); diff --git a/Projekte/monopoly/client/src/main/java/pp/monopoly/client/gui/LobbyMenu.java b/Projekte/monopoly/client/src/main/java/pp/monopoly/client/gui/LobbyMenu.java index 174a5b4..fa468f9 100644 --- a/Projekte/monopoly/client/src/main/java/pp/monopoly/client/gui/LobbyMenu.java +++ b/Projekte/monopoly/client/src/main/java/pp/monopoly/client/gui/LobbyMenu.java @@ -79,8 +79,9 @@ public class LobbyMenu extends Dialog { this.app = app; GameMusic music = app.getStateManager().getState(GameMusic.class); - music.toggleMusic(); - + if (music != null && music.isEnabled()) { + music.playSecondaryMusic(); + } playerInputField = new TextField("Spieler "+(app.getId()+1)); // Hintergrundbild laden und hinzufügen addBackgroundImage(); @@ -276,6 +277,12 @@ public class LobbyMenu extends Dialog { new SettingsMenu(app).open(); } + /** + * Updates the menu at regular intervals. + * Checks if the dropdown selection has been updated and invokes the selection change handler. + * + * @param tpf Time per frame, in seconds, since the last update. + */ @Override public void update(float tpf) { if (selectionRef.update()) { @@ -283,10 +290,27 @@ public class LobbyMenu extends Dialog { } } + /** + * Closes the current menu and transitions music playback. + * Stops the secondary music (if playing) and resumes the main background music + * if music is enabled in the preferences. Ensures smooth transitions in audio. + */ + @Override + public void close() { + GameMusic music = app.getStateManager().getState(GameMusic.class); + if (music != null) { + music.stopSecondaryMusic(); + if (music.isEnabled()) { + music.playMainMusic(); + } + } + super.close(); + } + /** * Updates the selected figure based on the dropdown menu selection. * - * @param selected the selected figure + * @param selector the selected figure */ private void onDropdownSelectionChanged(Selector selector) { app.getGameLogic().playSound(Sound.BUTTON); diff --git a/Projekte/monopoly/client/src/main/java/pp/monopoly/client/gui/SettingsMenu.java b/Projekte/monopoly/client/src/main/java/pp/monopoly/client/gui/SettingsMenu.java index 76369f8..3f3b9a7 100644 --- a/Projekte/monopoly/client/src/main/java/pp/monopoly/client/gui/SettingsMenu.java +++ b/Projekte/monopoly/client/src/main/java/pp/monopoly/client/gui/SettingsMenu.java @@ -51,7 +51,17 @@ public class SettingsMenu extends Dialog { private final SoundSlider soundSlider; /** - * Constructs the Menu dialog for the Battleship application. + * Checkbox for toggling sound effects. + */ + private final Checkbox soundCheckbox; + + /** + * Checkbox for toggling background music. + */ + private final Checkbox musicCheckbox; + + /** + * Constructs the Menu dialog for the Monopoly application. * * @param app the MonopolyApp instance */ @@ -65,11 +75,15 @@ public class SettingsMenu extends Dialog { addChild(soundSlider); - addChild(new Checkbox("Soundeffekte an / aus", new StateCheckboxModel(app, GameSound.class))); - + soundCheckbox = new Checkbox("Soundeffekte an / aus", new StateCheckboxModel(app, GameSound.class)); + addChild(soundCheckbox); + addChild(new Label("Hintergrund Musik", new ElementId("label"))); //NON-NLS - addChild(new Checkbox("Musik an / aus", new StateCheckboxModel(app, GameMusic.class))); - + + musicCheckbox = new Checkbox("Musik an / aus", new StateCheckboxModel(app, GameMusic.class)); + musicCheckbox.addClickCommands(s -> toggleMusicPreference()); + addChild(musicCheckbox); + addChild(musicSlider); addChild(new Button("Zurück zum Spiel", new ElementId("button"))).addClickCommands(s -> ifTopDialog(() -> { @@ -84,16 +98,42 @@ public class SettingsMenu extends Dialog { } /** - * Updates the state of the load and save buttons based on the game logic. + * Toggles the music preference based on the state of the musicCheckbox. + * Enables or disables background music and starts playback if enabled. + */ + private void toggleMusicPreference() { + boolean enabled = musicCheckbox.isChecked(); + GameMusic gameMusic = app.getStateManager().getState(GameMusic.class); + if (gameMusic != null) { + gameMusic.setEnabled(enabled); + if (enabled) { + gameMusic.playMainMusic(); + } + } + } + + /** + * Updates the state of the music checkbox to match the current preferences. + * This ensures the checkbox reflects the actual enabled/disabled state of the music. */ @Override public void update() { + GameMusic gameMusic = app.getStateManager().getState(GameMusic.class); + if (gameMusic != null) { + musicCheckbox.setChecked(gameMusic.isEnabled()); + } } + /** + * Updates UI elements such as sliders and synchronizes the state of the settings menu. + * + * @param delta the time in seconds since the last update + */ @Override public void update(float delta) { musicSlider.update(); soundSlider.update(); + update(); } /**