From dd192692bdc9e9af2cd8b50edf8039e905e3d435 Mon Sep 17 00:00:00 2001 From: lieght <49651652+BAFGdeJong@users.noreply.github.com> Date: Fri, 3 Oct 2025 17:12:50 +0200 Subject: [PATCH 1/4] Working sound effect for clicking, bug when using audio volume changer (changes some sounds to be wrong) --- .../main/java/org/toop/app/menu/MainMenu.java | 6 ++- app/src/main/java/org/toop/app/menu/Menu.java | 7 +++- .../java/org/toop/app/menu/OptionsMenu.java | 37 ++++++++++++++++++- .../toop/framework/asset/ResourceManager.java | 3 ++ .../asset/resources/SoundEffectAsset.java | 19 +++++++++- .../toop/framework/audio/SoundManager.java | 20 ++++++---- .../framework/audio/events/AudioEvents.java | 7 ++-- 7 files changed, 83 insertions(+), 16 deletions(-) diff --git a/app/src/main/java/org/toop/app/menu/MainMenu.java b/app/src/main/java/org/toop/app/menu/MainMenu.java index b0eceba..2765083 100644 --- a/app/src/main/java/org/toop/app/menu/MainMenu.java +++ b/app/src/main/java/org/toop/app/menu/MainMenu.java @@ -23,8 +23,10 @@ public final class MainMenu extends Menu { public MainMenu() { final Region background = createBackground(); - tictactoe = createButton(loc.getString("mainMenuSelectTicTacToe",currentLocale), () -> { App.activate(new GameSelectMenu(GameType.TICTACTOE)); }); - reversi = createButton(loc.getString("mainMenuSelectReversi",currentLocale), () -> { App.activate(new GameSelectMenu(GameType.REVERSI)); }); + tictactoe = createButton( + loc.getString("mainMenuSelectTicTacToe",currentLocale), () -> { App.activate(new GameSelectMenu(GameType.TICTACTOE)); }); + reversi = createButton( + loc.getString("mainMenuSelectReversi",currentLocale), () -> { App.activate(new GameSelectMenu(GameType.REVERSI)); }); final VBox gamesBox = new VBox(10, tictactoe, reversi); gamesBox.setAlignment(Pos.TOP_LEFT); diff --git a/app/src/main/java/org/toop/app/menu/Menu.java b/app/src/main/java/org/toop/app/menu/Menu.java index 9e9ac29..6863d8e 100644 --- a/app/src/main/java/org/toop/app/menu/Menu.java +++ b/app/src/main/java/org/toop/app/menu/Menu.java @@ -4,6 +4,8 @@ import javafx.scene.control.Button; import javafx.scene.layout.Pane; import javafx.scene.layout.Region; import javafx.scene.text.Text; +import org.toop.framework.audio.events.AudioEvents; +import org.toop.framework.eventbus.EventFlow; public abstract class Menu { protected Pane pane; @@ -34,7 +36,10 @@ public abstract class Menu { public Button createButton(String css, String x, Runnable runnable) { final Button button = new Button(x); - button.setOnAction(_ -> runnable.run()); + button.setOnAction(_ -> { + new EventFlow().addPostEvent(new AudioEvents.clickButton()).asyncPostEvent(); + runnable.run(); + }); button.getStyleClass().add(css); return button; diff --git a/app/src/main/java/org/toop/app/menu/OptionsMenu.java b/app/src/main/java/org/toop/app/menu/OptionsMenu.java index 0a96dbf..a707fe7 100644 --- a/app/src/main/java/org/toop/app/menu/OptionsMenu.java +++ b/app/src/main/java/org/toop/app/menu/OptionsMenu.java @@ -55,7 +55,7 @@ public final class OptionsMenu extends Menu { selectLanguage.getItems().add(locFile); } - selectLanguage.setConverter(new javafx.util.StringConverter() { + selectLanguage.setConverter(new javafx.util.StringConverter<>() { @Override public String toString(Locale locale) { return locale.getDisplayName(); @@ -67,7 +67,12 @@ public final class OptionsMenu extends Menu { } }); + selectLanguage.setOnShowing(event -> { + new EventFlow().addPostEvent(new AudioEvents.clickButton()).asyncPostEvent(); + }); + selectLanguage.setOnAction(event -> { + new EventFlow().addPostEvent(new AudioEvents.clickButton()).asyncPostEvent(); Locale selectedLocale = selectLanguage.getSelectionModel().getSelectedItem(); if (selectedLocale != null) { AppContext.setLocale(selectedLocale); @@ -87,7 +92,12 @@ public final class OptionsMenu extends Menu { selectScreen.getItems().add(screen); } + selectScreen.setOnShowing(event -> { + new EventFlow().addPostEvent(new AudioEvents.clickButton()).asyncPostEvent(); + }); + selectScreen.setOnAction(event -> { + new EventFlow().addPostEvent(new AudioEvents.clickButton()).asyncPostEvent(); int selectedIndex = selectScreen.getSelectionModel().getSelectedIndex(); Object selectedItem = selectScreen.getSelectionModel().getSelectedItem(); @@ -102,6 +112,17 @@ public final class OptionsMenu extends Menu { for (DisplayMode displayMode : currentScreenDevice.getDisplayModes()) { selectWindowSize.getItems().add(displayMode); } + selectWindowSize.setOnShowing(event -> { + new EventFlow().addPostEvent(new AudioEvents.clickButton()).asyncPostEvent(); + }); + selectWindowSize.setOnAction(event -> { + new EventFlow().addPostEvent(new AudioEvents.clickButton()).asyncPostEvent(); + int selectedIndex = selectWindowSize.getSelectionModel().getSelectedIndex(); + Object selectedItem = selectWindowSize.getSelectionModel().getSelectedItem(); + + System.out.println("Selection made: [" + selectedIndex + "] " + selectedItem); + System.out.println(" ChoiceBox.getValue(): " + selectWindowSize.getValue()); + }); return selectWindowSize; } @@ -109,6 +130,7 @@ public final class OptionsMenu extends Menu { final CheckBox setFullscreen = new CheckBox("Fullscreen"); setFullscreen.setSelected(App.isFullscreen()); setFullscreen.setOnAction(event -> { + new EventFlow().addPostEvent(new AudioEvents.clickButton()).asyncPostEvent(); boolean isSelected = setFullscreen.isSelected(); App.setFullscreen(isSelected); }); @@ -131,11 +153,24 @@ public final class OptionsMenu extends Menu { Label valueLabel = new Label(String.valueOf((int) volumeSlider.getValue())); + final long[] lastPlayed = {0}; + final long cooldown = 50; volumeSlider.valueProperty().addListener((obs, oldVal, newVal) -> { + long now = System.currentTimeMillis(); + + if (now - lastPlayed[0] >= cooldown) { + lastPlayed[0] = now; + + int value = newVal.intValue(); + valueLabel.setText(String.valueOf(value)); + + new EventFlow().addPostEvent(new AudioEvents.PlayEffect("soft-button-click.wav", false)).asyncPostEvent(); + } valueLabel.setText(String.valueOf(newVal.intValue())); new EventFlow().addPostEvent(new AudioEvents.ChangeVolume(newVal.doubleValue()/100.0)) .asyncPostEvent(); }); + return volumeSlider; } diff --git a/framework/src/main/java/org/toop/framework/asset/ResourceManager.java b/framework/src/main/java/org/toop/framework/asset/ResourceManager.java index 982caeb..8324b25 100644 --- a/framework/src/main/java/org/toop/framework/asset/ResourceManager.java +++ b/framework/src/main/java/org/toop/framework/asset/ResourceManager.java @@ -1,5 +1,7 @@ package org.toop.framework.asset; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; import org.toop.framework.asset.resources.*; import java.util.*; @@ -46,6 +48,7 @@ import java.util.concurrent.ConcurrentHashMap; * */ public class ResourceManager { + private static final Logger logger = LogManager.getLogger(ResourceManager.class); private static final ResourceManager INSTANCE = new ResourceManager(); private static final Map> assets = new ConcurrentHashMap<>(); diff --git a/framework/src/main/java/org/toop/framework/asset/resources/SoundEffectAsset.java b/framework/src/main/java/org/toop/framework/asset/resources/SoundEffectAsset.java index 1d0cedd..3ca6386 100644 --- a/framework/src/main/java/org/toop/framework/asset/resources/SoundEffectAsset.java +++ b/framework/src/main/java/org/toop/framework/asset/resources/SoundEffectAsset.java @@ -23,7 +23,10 @@ public class SoundEffectAsset extends BaseResource implements LoadableResource { Clip clip = AudioSystem.getClip(); // Insert a new audio stream into the clip - clip.open(this.getAudioStream()); + AudioInputStream inputStream = this.getAudioStream(); + AudioFormat baseFormat = inputStream.getFormat(); + if (baseFormat.getSampleSizeInBits() > 16) inputStream = downSampleAudio(inputStream, baseFormat); + clip.open(inputStream); // ^ Clip can only run 16 bit and lower, thus downsampling necessary. return clip; } @@ -32,6 +35,20 @@ public class SoundEffectAsset extends BaseResource implements LoadableResource { return AudioSystem.getAudioInputStream(this.file); } + private AudioInputStream downSampleAudio(AudioInputStream audioInputStream, AudioFormat baseFormat) { + AudioFormat decodedFormat = new AudioFormat( + AudioFormat.Encoding.PCM_SIGNED, + baseFormat.getSampleRate(), + 16, // force 16-bit + baseFormat.getChannels(), + baseFormat.getChannels() * 2, + baseFormat.getSampleRate(), + false // little-endian + ); + + return AudioSystem.getAudioInputStream(decodedFormat, audioInputStream); + } + @Override public void load() { try { diff --git a/framework/src/main/java/org/toop/framework/audio/SoundManager.java b/framework/src/main/java/org/toop/framework/audio/SoundManager.java index 2a0ec17..e65e613 100644 --- a/framework/src/main/java/org/toop/framework/audio/SoundManager.java +++ b/framework/src/main/java/org/toop/framework/audio/SoundManager.java @@ -1,5 +1,7 @@ package org.toop.framework.audio; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; import org.toop.framework.SnowflakeGenerator; import org.toop.framework.asset.ResourceManager; import org.toop.framework.asset.ResourceMeta; @@ -15,6 +17,7 @@ import java.util.*; import javax.sound.sampled.*; public class SoundManager { + private static final Logger logger = LogManager.getLogger(SoundManager.class); private final List activeMusic = new ArrayList<>(); private final Queue backgroundMusicQueue = new LinkedList<>(); private final Map activeSoundEffects = new HashMap<>(); @@ -38,16 +41,16 @@ public class SoundManager { .listen(this::handleMusicStart) .listen(this::handleVolumeChange) .listen(this::handleGetCurrentVolume) - .listen(AudioEvents.playOnClickButton.class, _ -> { + .listen(AudioEvents.clickButton.class, _ -> { try { - playSound("hitsound0.wav", false); + playSound("medium-button-click.wav", false); } catch (UnsupportedAudioFileException | LineUnavailableException | IOException e) { - throw new RuntimeException(e); + logger.error(e); } }); } - private void handlePlaySound(AudioEvents.PlayAudio event) { + private void handlePlaySound(AudioEvents.PlayEffect event) { try { this.playSound(event.fileName(), event.loop()); } catch (UnsupportedAudioFileException | LineUnavailableException | IOException e) { @@ -55,7 +58,7 @@ public class SoundManager { } } - private void handleStopSound(AudioEvents.StopAudio event) { + private void handleStopSound(AudioEvents.StopEffect event) { this.stopSound(event.clipId()); } @@ -71,7 +74,6 @@ public class SoundManager { for (MediaPlayer mediaPlayer : this.activeMusic) { mediaPlayer.setVolume(this.volume); } - IO.println("Volume: " + this.volume); } private void handleGetCurrentVolume(AudioEvents.GetCurrentVolume event) { @@ -125,13 +127,15 @@ public class SoundManager { mediaPlayer.setVolume(this.volume); mediaPlayer.play(); activeMusic.add(mediaPlayer); + logger.info("Playing background music: {}", ma.getFile().getName()); } private long playSound(String audioFileName, boolean loop) throws UnsupportedAudioFileException, LineUnavailableException, IOException { SoundEffectAsset asset = audioResources.get(audioFileName); // Return -1 which indicates resource wasn't available - if (asset == null){ + if (asset == null) { + logger.warn("Unable to load audio asset: {}", audioFileName); return -1; } @@ -146,6 +150,8 @@ public class SoundManager { clip.start(); } + logger.info("Playing sound: {}", asset.getFile().getName()); + // Generate id for clip long clipId = idGenerator.nextId(); diff --git a/framework/src/main/java/org/toop/framework/audio/events/AudioEvents.java b/framework/src/main/java/org/toop/framework/audio/events/AudioEvents.java index 08fb67b..5aceb8c 100644 --- a/framework/src/main/java/org/toop/framework/audio/events/AudioEvents.java +++ b/framework/src/main/java/org/toop/framework/audio/events/AudioEvents.java @@ -1,6 +1,5 @@ package org.toop.framework.audio.events; -import org.toop.framework.asset.resources.MusicAsset; import org.toop.framework.eventbus.events.EventWithSnowflake; import org.toop.framework.eventbus.events.EventWithoutSnowflake; import org.toop.framework.eventbus.events.EventsBase; @@ -9,10 +8,10 @@ import java.util.Map; public class AudioEvents extends EventsBase { /** Starts playing a sound. */ - public record PlayAudio(String fileName, boolean loop) + public record PlayEffect(String fileName, boolean loop) implements EventWithoutSnowflake {} - public record StopAudio(long clipId) implements EventWithoutSnowflake {} + public record StopEffect(long clipId) implements EventWithoutSnowflake {} public record StartBackgroundMusic() implements EventWithoutSnowflake {} public record ChangeVolume(double newVolume) implements EventWithoutSnowflake {} @@ -38,5 +37,5 @@ public class AudioEvents extends EventsBase { return snowflakeId; } } - public record playOnClickButton() implements EventWithoutSnowflake {} + public record clickButton() implements EventWithoutSnowflake {} } From 796c3a2bc68d1fe2b89b05b73a0bccf88335a42a Mon Sep 17 00:00:00 2001 From: lieght <49651652+BAFGdeJong@users.noreply.github.com> Date: Fri, 3 Oct 2025 18:31:13 +0200 Subject: [PATCH 2/4] Added forgotten sound effects --- .../assets/audio/fx/harsh-button-click.wav | Bin 0 -> 76280 bytes .../assets/audio/fx/medium-button-click.wav | Bin 0 -> 36590 bytes .../assets/audio/fx/soft-button-click.wav | Bin 0 -> 81724 bytes 3 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 app/src/main/resources/assets/audio/fx/harsh-button-click.wav create mode 100644 app/src/main/resources/assets/audio/fx/medium-button-click.wav create mode 100644 app/src/main/resources/assets/audio/fx/soft-button-click.wav diff --git a/app/src/main/resources/assets/audio/fx/harsh-button-click.wav b/app/src/main/resources/assets/audio/fx/harsh-button-click.wav new file mode 100644 index 0000000000000000000000000000000000000000..1ad2158d586a7240f95b1c949e17137fa077f062 GIT binary patch literal 76280 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 z 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 cOeJa#7*KCu%;M1& literal 0 HcmV?d00001 From 56a1afe1cdc4c3df685c0faf45532da3b8201631 Mon Sep 17 00:00:00 2001 From: lieght <49651652+BAFGdeJong@users.noreply.github.com> Date: Fri, 3 Oct 2025 18:34:48 +0200 Subject: [PATCH 3/4] "Fixed double sound bug" --- app/src/main/java/org/toop/app/menu/OptionsMenu.java | 9 +++------ .../main/java/org/toop/framework/audio/SoundManager.java | 3 ++- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/org/toop/app/menu/OptionsMenu.java b/app/src/main/java/org/toop/app/menu/OptionsMenu.java index a707fe7..7a67422 100644 --- a/app/src/main/java/org/toop/app/menu/OptionsMenu.java +++ b/app/src/main/java/org/toop/app/menu/OptionsMenu.java @@ -143,7 +143,7 @@ public final class OptionsMenu extends Menu { .addPostEvent(AudioEvents.GetCurrentVolume.class) .onResponse(AudioEvents.GetCurrentVolumeReponse.class, event -> { volumeSlider.setValue(event.currentVolume() * 100); - }).asyncPostEvent(); + }, true).asyncPostEvent(); volumeSlider.setShowTickLabels(true); volumeSlider.setShowTickMarks(true); volumeSlider.setMajorTickUnit(25); @@ -160,11 +160,8 @@ public final class OptionsMenu extends Menu { if (now - lastPlayed[0] >= cooldown) { lastPlayed[0] = now; - - int value = newVal.intValue(); - valueLabel.setText(String.valueOf(value)); - - new EventFlow().addPostEvent(new AudioEvents.PlayEffect("soft-button-click.wav", false)).asyncPostEvent(); +// new EventFlow().addPostEvent(new AudioEvents.clickButton()) +// .asyncPostEvent(); // TODO: creates double sound bug, WHYYY???? } valueLabel.setText(String.valueOf(newVal.intValue())); new EventFlow().addPostEvent(new AudioEvents.ChangeVolume(newVal.doubleValue()/100.0)) diff --git a/framework/src/main/java/org/toop/framework/audio/SoundManager.java b/framework/src/main/java/org/toop/framework/audio/SoundManager.java index e65e613..f7fad76 100644 --- a/framework/src/main/java/org/toop/framework/audio/SoundManager.java +++ b/framework/src/main/java/org/toop/framework/audio/SoundManager.java @@ -128,6 +128,7 @@ public class SoundManager { mediaPlayer.play(); activeMusic.add(mediaPlayer); logger.info("Playing background music: {}", ma.getFile().getName()); + logger.info("Background music next in line: {}", backgroundMusicQueue.peek().getFile().getName()); } private long playSound(String audioFileName, boolean loop) throws UnsupportedAudioFileException, LineUnavailableException, IOException { @@ -150,7 +151,7 @@ public class SoundManager { clip.start(); } - logger.info("Playing sound: {}", asset.getFile().getName()); + logger.debug("Playing sound: {}", asset.getFile().getName()); // Generate id for clip long clipId = idGenerator.nextId(); From d9a93f24fba9c40715723e0b7b890a8774c95097 Mon Sep 17 00:00:00 2001 From: michiel Date: Fri, 3 Oct 2025 21:44:06 +0200 Subject: [PATCH 4/4] credits toegevoegd --- .../java/org/toop/app/menu/CreditsMenu.java | 71 ++++++++++++++++++- .../main/resources/assets/style/credits.css | 18 +++++ 2 files changed, 87 insertions(+), 2 deletions(-) create mode 100644 app/src/main/resources/assets/style/credits.css diff --git a/app/src/main/java/org/toop/app/menu/CreditsMenu.java b/app/src/main/java/org/toop/app/menu/CreditsMenu.java index 4b1b81f..31c093a 100644 --- a/app/src/main/java/org/toop/app/menu/CreditsMenu.java +++ b/app/src/main/java/org/toop/app/menu/CreditsMenu.java @@ -1,6 +1,16 @@ package org.toop.app.menu; +import javafx.animation.Interpolator; +import javafx.animation.PauseTransition; +import javafx.animation.TranslateTransition; import javafx.application.Platform; +import javafx.geometry.Pos; +import javafx.scene.control.Button; +import javafx.scene.layout.Region; +import javafx.scene.layout.StackPane; +import javafx.scene.layout.VBox; +import javafx.util.Duration; +import org.toop.app.App; import org.toop.framework.asset.ResourceManager; import org.toop.framework.asset.resources.LocalizationAsset; import org.toop.framework.eventbus.EventFlow; @@ -9,10 +19,46 @@ import org.toop.local.LocalizationEvents; import java.util.Locale; -public final class CreditsMenu extends Menu { +public final class CreditsMenu extends Menu { ; private Locale currentLocale = AppContext.getLocale(); private LocalizationAsset loc = ResourceManager.get("localization_en_us.properties"); + + String[] credits = { + "Scrum Master: Stef", + "Product Owner: Omar", + "Merge Commander: Bas", + "Localization: Ticho", + "AI: Michiel", + "Developers: Michiel, Bas, Stef, Omar, Ticho", + "Moral Support: Wesley (voor 1 week)", + "OpenGL: Omar" + }; + + double scrollDuration = 20.0; + double lineHeight = 40.0; + public CreditsMenu() { + VBox creditsBox = new VBox(lineHeight / 2); + for (int i = credits.length - 1; i >= 0; i--) { + creditsBox.getChildren().add(createText(credits[i])); + creditsBox.setAlignment(Pos.CENTER); + } + + Button exit = new Button("<"); + exit.setStyle( + "-fx-background-color: transparent;" + + "-fx-text-fill: white;" + + "-fx-font-size: 72px;" + + "-fx-padding: 10 20 10 20;" + ); + exit.setOnAction(e -> App.pop()); + + final Region background = createBackground(); + StackPane.setAlignment(exit, Pos.TOP_LEFT); + pane = new StackPane(background, creditsBox, exit); + + Platform.runLater(() -> playCredits(creditsBox, 800)); + try { new EventFlow() .listen(this::handleChangeLanguage); @@ -21,13 +67,34 @@ public final class CreditsMenu extends Menu { System.out.println("Something went wrong while trying to change the language."); throw e; } + } + public void playCredits(VBox creditsBox, double sceneLength) { + double height = (credits.length * lineHeight); + double startY = -sceneLength; + double endY = height; + + creditsBox.setTranslateY(startY); + + TranslateTransition scrollCredits = new TranslateTransition(); + scrollCredits.setNode(creditsBox); + scrollCredits.setFromY(startY); + scrollCredits.setToY(endY / 2 - 200); + scrollCredits.setDuration(Duration.seconds(scrollDuration)); + scrollCredits.setInterpolator(Interpolator.LINEAR); + + scrollCredits.setOnFinished(e -> { + PauseTransition pauseCredits = new PauseTransition(Duration.seconds(5)); + pauseCredits.setOnFinished(a -> playCredits(creditsBox, sceneLength)); + pauseCredits.play(); + }); + + scrollCredits.play(); } private void handleChangeLanguage(LocalizationEvents.LanguageHasChanged event) { Platform.runLater(() -> { currentLocale = AppContext.getLocale(); //credits.setText(loc.getString("credits",currentLocale)); }); - } } \ No newline at end of file diff --git a/app/src/main/resources/assets/style/credits.css b/app/src/main/resources/assets/style/credits.css new file mode 100644 index 0000000..be920fe --- /dev/null +++ b/app/src/main/resources/assets/style/credits.css @@ -0,0 +1,18 @@ +.credit-text { + -fx-fill: #ffffff; + -fx-font-size: 24px; + -fx-font-family: "Arial"; + -fx-font-weight: bold; + -fx-effect: dropshadow(gaussian, rgba(0,0,0,0.7), 4, 0, 2, 2); +} + +.button.exit-button { + -fx-background-color: #3498db; + -fx-text-fill: white; + -fx-font-size: 72px; + -fx-padding: 10 20 10 20; + -fx-background-radius: 5; +} +.button.exit-button:hover { + -fx-background-color: #2980b9; +}