diff --git a/Projekte/battleship/client/src/main/java/pp/battleship/client/BattleshipApp.java b/Projekte/battleship/client/src/main/java/pp/battleship/client/BattleshipApp.java index 6ac1c729..db31edac 100644 --- a/Projekte/battleship/client/src/main/java/pp/battleship/client/BattleshipApp.java +++ b/Projekte/battleship/client/src/main/java/pp/battleship/client/BattleshipApp.java @@ -265,11 +265,23 @@ private void setupStates() { flyCam.setEnabled(false); stateManager.detach(stateManager.getState(StatsAppState.class)); stateManager.detach(stateManager.getState(DebugKeysAppState.class)); - + attachGameMusic(); attachGameSound(); stateManager.attachAll(new EditorAppState(), new BattleAppState(), new SeaAppState()); } + /** + * Attaches the game sound state and sets its initial enabled state. + */ + private void attachGameMusic() { + //TODO: start volume + final GameMusic gameMusic = new GameMusic(0.5f); + logic.addListener(gameMusic); + gameMusic.setEnabled(true); +// gameMusic.setEnabled(GameSound.enabledInPreferences()); + stateManager.attach(gameMusic); + } + /** * Attaches the game sound state and sets its initial enabled state. */ diff --git a/Projekte/battleship/client/src/main/java/pp/battleship/client/GameMusic.java b/Projekte/battleship/client/src/main/java/pp/battleship/client/GameMusic.java new file mode 100644 index 00000000..a27003bf --- /dev/null +++ b/Projekte/battleship/client/src/main/java/pp/battleship/client/GameMusic.java @@ -0,0 +1,76 @@ +package pp.battleship.client; + +import com.jme3.app.Application; +import com.jme3.app.state.AbstractAppState; +import com.jme3.app.state.AppStateManager; +import com.jme3.asset.AssetLoadException; +import com.jme3.asset.AssetNotFoundException; +import com.jme3.audio.AudioData; +import com.jme3.audio.AudioNode; +import pp.battleship.notification.GameEventListener; + +import java.lang.System.Logger; +import java.lang.System.Logger.Level; + +public class GameMusic extends AbstractAppState implements GameEventListener { + private static final Logger LOGGER = System.getLogger(GameMusic.class.getName()); + private AudioNode backgroundMusic; + private float startVolume; + + public GameMusic(float startVolume){ + this. startVolume = startVolume; + } + + @Override + public void initialize(AppStateManager stateManager, Application app) { + super.initialize(stateManager, app); + backgroundMusic = loadSound(app, "Sound/background.wav"); + setMusicVolume(startVolume); + playMusic(); + } + + private AudioNode loadSound(Application app, String name) { + try { + final AudioNode sound = new AudioNode(app.getAssetManager(), name, AudioData.DataType.Buffer); + sound.setLooping(false); + sound.setPositional(false); + return sound; + } + catch (AssetLoadException | AssetNotFoundException ex) { + LOGGER.log(Level.ERROR, ex.getMessage(), ex); + } + return null; + } + + @Override + public void setEnabled(boolean enabled) { + if(enabled && !isEnabled()){ + playMusic(); + } + else if(!enabled && isEnabled()){ + stopMusic(); + } + super.setEnabled(enabled); + } + + public void playMusic(){ + if (backgroundMusic != null){ + backgroundMusic.play(); + } + } + + /** + * Stops background music + */ + public void stopMusic(){ + if (backgroundMusic != null){ + backgroundMusic.stop(); + } + } + + public void setMusicVolume(float volume){ + if(backgroundMusic != null){ + backgroundMusic.setVolume(volume); + } + } +} diff --git a/Projekte/battleship/client/src/main/java/pp/battleship/client/GameSound.java b/Projekte/battleship/client/src/main/java/pp/battleship/client/GameSound.java index 0fdcef68..4fbc69cf 100644 --- a/Projekte/battleship/client/src/main/java/pp/battleship/client/GameSound.java +++ b/Projekte/battleship/client/src/main/java/pp/battleship/client/GameSound.java @@ -35,6 +35,7 @@ public class GameSound extends AbstractAppState implements GameEventListener { private AudioNode shipDestroyedSound; private AudioNode explosionSound; + /** * Checks if sound is enabled in the preferences. * diff --git a/Projekte/battleship/client/src/main/java/pp/battleship/client/Menu.java b/Projekte/battleship/client/src/main/java/pp/battleship/client/Menu.java index 0e100e86..470d194e 100644 --- a/Projekte/battleship/client/src/main/java/pp/battleship/client/Menu.java +++ b/Projekte/battleship/client/src/main/java/pp/battleship/client/Menu.java @@ -10,6 +10,8 @@ import com.simsilica.lemur.Button; import com.simsilica.lemur.Checkbox; import com.simsilica.lemur.Label; +import com.simsilica.lemur.RangedValueModel; +import com.simsilica.lemur.Slider; import com.simsilica.lemur.style.ElementId; import pp.dialog.Dialog; import pp.dialog.StateCheckboxModel; @@ -33,6 +35,7 @@ class Menu extends Dialog { private final BattleshipApp app; private final Button loadButton = new Button(lookup("menu.map.load")); private final Button saveButton = new Button(lookup("menu.map.save")); + private final VolumeSlider volumeSlider; /** * Constructs the Menu dialog for the Battleship application. @@ -42,9 +45,15 @@ class Menu extends Dialog { public Menu(BattleshipApp app) { super(app.getDialogManager()); this.app = app; + volumeSlider = new VolumeSlider(0.5f, app.getStateManager().getState(GameMusic.class)); + addChild(new Label(lookup("battleship.name"), new ElementId("header"))); //NON-NLS addChild(new Checkbox(lookup("menu.sound-enabled"), new StateCheckboxModel(app, GameSound.class))); + + addChild(new Checkbox(lookup("menu.music-enabled"), new StateCheckboxModel(app, GameMusic.class))); + addChild(volumeSlider); + addChild(loadButton) .addClickCommands(s -> ifTopDialog(this::loadDialog)); addChild(saveButton) @@ -65,6 +74,11 @@ public void update() { saveButton.setEnabled(app.getGameLogic().maySaveMap()); } + @Override + public void update(float delta){ + volumeSlider.update(); + } + /** * As an escape action, this method closes the menu if it is the top dialog. */ diff --git a/Projekte/battleship/client/src/main/java/pp/battleship/client/SliderRangedValueModel.java b/Projekte/battleship/client/src/main/java/pp/battleship/client/SliderRangedValueModel.java new file mode 100644 index 00000000..506bbe20 --- /dev/null +++ b/Projekte/battleship/client/src/main/java/pp/battleship/client/SliderRangedValueModel.java @@ -0,0 +1,71 @@ +package pp.battleship.client; + +import com.simsilica.lemur.RangedValueModel; +import com.simsilica.lemur.core.VersionedReference; + +public class SliderRangedValueModel implements RangedValueModel { + + SliderRangedValueModel(){ + + } + + + @Override + public void setValue( double val ){ + System.out.println(val); + } + + @Override + public double getValue(){ + + return 0; + } + + @Override + public void setPercent( double val ){ + System.out.println(val); + } + + @Override + public double getPercent(){ + + return 0; + } + + @Override + public void setMaximum( double max ){ + + } + + @Override + public double getMaximum(){ + + return 0; + } + + @Override + public void setMinimum( double min ){ + + } + + @Override + public double getMinimum(){ + + return 0; + } + + @Override + public long getVersion() { + return 0; + } + + @Override + public Double getObject() { + return 0.0; + } + + @Override + public VersionedReference createReference() { + return null; + } +} diff --git a/Projekte/battleship/client/src/main/java/pp/battleship/client/VolumeSlider.java b/Projekte/battleship/client/src/main/java/pp/battleship/client/VolumeSlider.java new file mode 100644 index 00000000..4ca22a9e --- /dev/null +++ b/Projekte/battleship/client/src/main/java/pp/battleship/client/VolumeSlider.java @@ -0,0 +1,25 @@ +package pp.battleship.client; + +import com.simsilica.lemur.Slider; + +public class VolumeSlider extends Slider { + private GameMusic gameMusic; + private float volume; + + public VolumeSlider(float startVolume, GameMusic gameMusic){ + super(); + getModel().setPercent(startVolume); + this.gameMusic = gameMusic; + this.volume = (float) getModel().getPercent(); + gameMusic.setMusicVolume(volume); + System.out.println("init"); + } + + public void update(){ + if(getModel().getPercent() != volume){ + System.out.println(volume); + this.volume = (float) getModel().getPercent(); + gameMusic.setMusicVolume(volume); + } + } +} diff --git a/Projekte/battleship/client/src/main/resources/Sound/background.wav b/Projekte/battleship/client/src/main/resources/Sound/background.wav new file mode 100644 index 00000000..b857cb0c Binary files /dev/null and b/Projekte/battleship/client/src/main/resources/Sound/background.wav differ diff --git a/Projekte/battleship/model/src/main/resources/battleship.properties b/Projekte/battleship/model/src/main/resources/battleship.properties index b9fb7d8c..97f6848a 100644 --- a/Projekte/battleship/model/src/main/resources/battleship.properties +++ b/Projekte/battleship/model/src/main/resources/battleship.properties @@ -31,6 +31,7 @@ menu.return-to-game=Return to game menu.sound-enabled=Sound switched on menu.map.load=Load map from file... menu.map.save=Save map in file... +menu.music-enabled=Music on label.file=File: label.connecting=Connecting... dialog.error=Error @@ -38,3 +39,4 @@ dialog.question=Question port.must.be.integer=Port must be an integer number map.doesnt.fit=The map doesn't fit to this game invalid.map=Invalid Map! + diff --git a/Projekte/battleship/model/src/main/resources/battleship_de.properties b/Projekte/battleship/model/src/main/resources/battleship_de.properties index 5647d6cf..3057142b 100644 --- a/Projekte/battleship/model/src/main/resources/battleship_de.properties +++ b/Projekte/battleship/model/src/main/resources/battleship_de.properties @@ -31,6 +31,7 @@ menu.return-to-game=Zur menu.sound-enabled=Sound eingeschaltet menu.map.load=Karte von Datei laden... menu.map.save=Karte in Datei speichern... +menu.music-enabled=Musik an label.file=Datei: label.connecting=Verbindung wird aufgebaut... dialog.error=Fehler