From 13705cc75189d163e6a5c75fa0096df227a38d18 Mon Sep 17 00:00:00 2001 From: stiti Date: Wed, 6 Nov 2024 19:24:55 +0100 Subject: [PATCH] Ajout d'effet sonnore dans le menu principal) --- TestV2/ressources/sounds/SFX/1.mp3 | Bin 9919 -> 0 bytes TestV2/ressources/sounds/SFX/1.wav | Bin 0 -> 32590 bytes .../src/fr/monkhanny/dorfromantik/Main.java | 3 +- .../fr/monkhanny/dorfromantik/Options.java | 16 +++- .../ButtonHoverAnimationListener.java | 43 ++++++++++ .../controller/ButtonHoverListener.java | 29 +++++++ .../controller/MainMenuMouseController.java | 81 ++---------------- .../controller/MainMenuResizeController.java | 18 +--- .../controller/MainMenuResizeHandler.java | 26 ++++++ .../monkhanny/dorfromantik/enums/Sounds.java | 4 +- .../dorfromantik/gui/ButtonHoverAnimator.java | 33 +++++++ .../dorfromantik/gui/ButtonPanel.java | 8 +- .../dorfromantik/utils/MusicLoader.java | 23 ----- .../dorfromantik/utils/MusicPlayer.java | 65 ++++++++++---- .../dorfromantik/utils/SoundLoader.java | 4 +- 15 files changed, 214 insertions(+), 139 deletions(-) delete mode 100644 TestV2/ressources/sounds/SFX/1.mp3 create mode 100644 TestV2/ressources/sounds/SFX/1.wav create mode 100644 TestV2/src/fr/monkhanny/dorfromantik/controller/ButtonHoverAnimationListener.java create mode 100644 TestV2/src/fr/monkhanny/dorfromantik/controller/ButtonHoverListener.java create mode 100644 TestV2/src/fr/monkhanny/dorfromantik/controller/MainMenuResizeHandler.java create mode 100644 TestV2/src/fr/monkhanny/dorfromantik/gui/ButtonHoverAnimator.java delete mode 100644 TestV2/src/fr/monkhanny/dorfromantik/utils/MusicLoader.java diff --git a/TestV2/ressources/sounds/SFX/1.mp3 b/TestV2/ressources/sounds/SFX/1.mp3 deleted file mode 100644 index 6ae633917a4ebf7552c9fcc90b457579da967212..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9919 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 N#L*qxm>nSEKL7^6y=edd diff --git a/TestV2/ressources/sounds/SFX/1.wav b/TestV2/ressources/sounds/SFX/1.wav new file mode 100644 index 0000000000000000000000000000000000000000..b27c35379666311787b3c829197096d45573551b GIT binary patch literal 32590 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 literal 0 HcmV?d00001 diff --git a/TestV2/src/fr/monkhanny/dorfromantik/Main.java b/TestV2/src/fr/monkhanny/dorfromantik/Main.java index 91faeba..5de15b2 100644 --- a/TestV2/src/fr/monkhanny/dorfromantik/Main.java +++ b/TestV2/src/fr/monkhanny/dorfromantik/Main.java @@ -19,7 +19,8 @@ public class Main { * @param args Tableau de String contenant les arguments passé en paramètre au programme */ public static void main(String[] args) { - MusicPlayer.play(); + MusicPlayer.loadMusic(Musics.MAIN_MENU_MUSIC); + MusicPlayer.playMusic(); MainMenu mainMenu = new MainMenu(); MainMenuResizeController MainMenuResizeController = new MainMenuResizeController(mainMenu); MainMenuButtonController MainMenuButtonController = new MainMenuButtonController(mainMenu); diff --git a/TestV2/src/fr/monkhanny/dorfromantik/Options.java b/TestV2/src/fr/monkhanny/dorfromantik/Options.java index a69a690..2055c0b 100644 --- a/TestV2/src/fr/monkhanny/dorfromantik/Options.java +++ b/TestV2/src/fr/monkhanny/dorfromantik/Options.java @@ -1,16 +1,18 @@ package fr.monkhanny.dorfromantik; +import java.awt.Color; + public class Options { /** * Taille de police de base pour les titres du menu principal */ - public static final float BASE_TITLE_FONT_SIZE = 90f; + public static final float BASE_TITLE_FONT_SIZE = 80f; /** * Taille de police de base pour les boutons du menu principal */ - public static final float BASE_BUTTON_FONT_SIZE = 50f; + public static final float BASE_BUTTON_FONT_SIZE = 45f; /** * Niveau de volume par défaut @@ -26,4 +28,14 @@ public class Options { * Sons en sourdine ou non */ public static final boolean SOUNDS_MUTED = false; + + /** + * Couleur de subrillance des boutons + */ + public static final Color BUTTON_HOVER_COLOR = new Color(70, 130, 180); + + + public static final float HOVER_FONT_SCALE = 1.1f; + public static final int ANIMATION_STEPS = 10; + public static final int ANIMATION_DELAY = 15; } diff --git a/TestV2/src/fr/monkhanny/dorfromantik/controller/ButtonHoverAnimationListener.java b/TestV2/src/fr/monkhanny/dorfromantik/controller/ButtonHoverAnimationListener.java new file mode 100644 index 0000000..59a4a18 --- /dev/null +++ b/TestV2/src/fr/monkhanny/dorfromantik/controller/ButtonHoverAnimationListener.java @@ -0,0 +1,43 @@ +package fr.monkhanny.dorfromantik.gui; + +import fr.monkhanny.dorfromantik.Options; + +import javax.swing.*; +import java.awt.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; + +public class ButtonHoverAnimationListener implements ActionListener { + + private int step = 0; + private final float scaleIncrement; + private final boolean entering; + private final JButton button; + private final Color originalColor; + private final Font originalFont; + private float currentScale = 1.0f; + + public ButtonHoverAnimationListener(boolean entering, JButton button, Color originalColor, Font originalFont) { + this.entering = entering; + this.button = button; + this.originalColor = originalColor; + this.originalFont = originalFont; + this.scaleIncrement = (Options.HOVER_FONT_SCALE - 1.0f) / Options.ANIMATION_STEPS; + } + + @Override + public void actionPerformed(ActionEvent e) { + currentScale = entering ? (1.0f + step * scaleIncrement) : (Options.HOVER_FONT_SCALE - step * scaleIncrement); + + button.setForeground(entering ? Options.BUTTON_HOVER_COLOR : originalColor); + button.setFont(originalFont.deriveFont(originalFont.getSize2D() * currentScale)); + + step++; + if (step >= Options.ANIMATION_STEPS) { + ((Timer) e.getSource()).stop(); + if (!entering) { + button.setFont(originalFont); // Restore the original font + } + } + } +} diff --git a/TestV2/src/fr/monkhanny/dorfromantik/controller/ButtonHoverListener.java b/TestV2/src/fr/monkhanny/dorfromantik/controller/ButtonHoverListener.java new file mode 100644 index 0000000..fdce4fe --- /dev/null +++ b/TestV2/src/fr/monkhanny/dorfromantik/controller/ButtonHoverListener.java @@ -0,0 +1,29 @@ +package fr.monkhanny.dorfromantik.controller; + +import fr.monkhanny.dorfromantik.gui.ButtonHoverAnimator; +import fr.monkhanny.dorfromantik.utils.MusicPlayer; +import fr.monkhanny.dorfromantik.enums.Sounds; + +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; + +public class ButtonHoverListener extends MouseAdapter { + + private final ButtonHoverAnimator animator; + + public ButtonHoverListener(ButtonHoverAnimator animator) { + this.animator = animator; + } + + @Override + public void mouseEntered(MouseEvent e) { + animator.startAnimation(true); + MusicPlayer.loadSound(Sounds.SOUNDS1); // Charge le son + MusicPlayer.playSound(); // Joue le son + } + + @Override + public void mouseExited(MouseEvent e) { + animator.startAnimation(false); + } +} diff --git a/TestV2/src/fr/monkhanny/dorfromantik/controller/MainMenuMouseController.java b/TestV2/src/fr/monkhanny/dorfromantik/controller/MainMenuMouseController.java index d79fa3a..1046af9 100644 --- a/TestV2/src/fr/monkhanny/dorfromantik/controller/MainMenuMouseController.java +++ b/TestV2/src/fr/monkhanny/dorfromantik/controller/MainMenuMouseController.java @@ -1,11 +1,9 @@ package fr.monkhanny.dorfromantik.controller; import fr.monkhanny.dorfromantik.gui.ButtonPanel; +import fr.monkhanny.dorfromantik.gui.ButtonHoverAnimator; import javax.swing.*; -import java.awt.*; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; @@ -13,82 +11,21 @@ public class MainMenuMouseController { private final ButtonPanel buttonPanel; - // Couleur et échelle au survol - private static final Color BUTTON_HOVER_COLOR = new Color(70, 130, 180); - private static final float HOVER_FONT_SCALE = 1.1f; - private static final int ANIMATION_STEPS = 10; - private static final int ANIMATION_DELAY = 15; // Délai entre chaque étape en ms - public MainMenuMouseController(ButtonPanel buttonPanel) { this.buttonPanel = buttonPanel; initMouseListeners(); } private void initMouseListeners() { - buttonPanel.getNewGameButton().addMouseListener(new ButtonHoverListener(buttonPanel.getNewGameButton())); - buttonPanel.getContinueGameButton().addMouseListener(new ButtonHoverListener(buttonPanel.getContinueGameButton())); - buttonPanel.getHowToPlayButton().addMouseListener(new ButtonHoverListener(buttonPanel.getHowToPlayButton())); - buttonPanel.getSettingsButton().addMouseListener(new ButtonHoverListener(buttonPanel.getSettingsButton())); - buttonPanel.getExitButton().addMouseListener(new ButtonHoverListener(buttonPanel.getExitButton())); + addButtonHoverListener(buttonPanel.getNewGameButton()); + addButtonHoverListener(buttonPanel.getContinueGameButton()); + addButtonHoverListener(buttonPanel.getHowToPlayButton()); + addButtonHoverListener(buttonPanel.getSettingsButton()); + addButtonHoverListener(buttonPanel.getExitButton()); } - // Classe interne pour la gestion des événements de survol de la souris avec animation - private static class ButtonHoverListener extends MouseAdapter { - private final JButton button; - private final Color originalColor; - private final Font originalFont; - private Timer animationTimer; - private boolean isHovered = false; - private float currentScale = 1.0f; - - public ButtonHoverListener(JButton button) { - this.button = button; - this.originalColor = button.getForeground(); - this.originalFont = button.getFont(); - } - - @Override - public void mouseEntered(MouseEvent e) { - isHovered = true; - startAnimation(true); - } - - @Override - public void mouseExited(MouseEvent e) { - isHovered = false; - startAnimation(false); - } - - private void startAnimation(boolean entering) { - if (animationTimer != null && animationTimer.isRunning()) { - animationTimer.stop(); - } - - animationTimer = new Timer(ANIMATION_DELAY, new ActionListener() { - int step = 0; - final float scaleIncrement = (HOVER_FONT_SCALE - 1.0f) / ANIMATION_STEPS; - - @Override - public void actionPerformed(ActionEvent e) { - // Calculer la nouvelle échelle du texte - currentScale = entering ? (1.0f + step * scaleIncrement) : (HOVER_FONT_SCALE - step * scaleIncrement); - - // Mettre à jour la couleur et la police - button.setForeground(entering ? BUTTON_HOVER_COLOR : originalColor); - button.setFont(originalFont.deriveFont(originalFont.getSize2D() * currentScale)); - - // Augmenter le compteur d'étapes - step++; - if (step >= ANIMATION_STEPS) { - animationTimer.stop(); - if (!entering) { - // Restaurer la police d'origine après l'animation de sortie - button.setFont(originalFont); - } - } - } - }); - animationTimer.start(); - } + private void addButtonHoverListener(JButton button) { + ButtonHoverAnimator animator = new ButtonHoverAnimator(button); + button.addMouseListener(new ButtonHoverListener(animator)); } } diff --git a/TestV2/src/fr/monkhanny/dorfromantik/controller/MainMenuResizeController.java b/TestV2/src/fr/monkhanny/dorfromantik/controller/MainMenuResizeController.java index ecf820f..f9219ce 100644 --- a/TestV2/src/fr/monkhanny/dorfromantik/controller/MainMenuResizeController.java +++ b/TestV2/src/fr/monkhanny/dorfromantik/controller/MainMenuResizeController.java @@ -1,31 +1,19 @@ package fr.monkhanny.dorfromantik.controller; import fr.monkhanny.dorfromantik.gui.MainMenu; -import fr.monkhanny.dorfromantik.Options; - -import java.awt.event.ComponentAdapter; -import java.awt.event.ComponentEvent; public class MainMenuResizeController { private MainMenu mainMenu; + private MainMenuResizeHandler resizeHandler; public MainMenuResizeController(MainMenu mainMenu) { this.mainMenu = mainMenu; + this.resizeHandler = new MainMenuResizeHandler(mainMenu); addComponentListener(); } private void addComponentListener() { - mainMenu.addComponentListener(new ComponentAdapter() { - @Override - public void componentResized(ComponentEvent e) { - // Ajuster la taille de la police du titre en fonction de la taille de la fenêtre - float newFontSize = Options.BASE_TITLE_FONT_SIZE * (mainMenu.getWidth() / 900f); - mainMenu.getTitleLabel().updateTitleFont(newFontSize); - - // Mettre à jour les polices des boutons - mainMenu.getButtonPanel().updateButtonFonts(mainMenu.getWidth()); - } - }); + mainMenu.addComponentListener(resizeHandler); } } diff --git a/TestV2/src/fr/monkhanny/dorfromantik/controller/MainMenuResizeHandler.java b/TestV2/src/fr/monkhanny/dorfromantik/controller/MainMenuResizeHandler.java new file mode 100644 index 0000000..ad75606 --- /dev/null +++ b/TestV2/src/fr/monkhanny/dorfromantik/controller/MainMenuResizeHandler.java @@ -0,0 +1,26 @@ +package fr.monkhanny.dorfromantik.controller; + +import fr.monkhanny.dorfromantik.gui.MainMenu; +import fr.monkhanny.dorfromantik.Options; + +import java.awt.event.ComponentAdapter; +import java.awt.event.ComponentEvent; + +public class MainMenuResizeHandler extends ComponentAdapter { + + private MainMenu mainMenu; + + public MainMenuResizeHandler(MainMenu mainMenu) { + this.mainMenu = mainMenu; + } + + @Override + public void componentResized(ComponentEvent e) { + // Ajuster la taille de la police du titre en fonction de la taille de la fenêtre + float newFontSize = Options.BASE_TITLE_FONT_SIZE * (mainMenu.getWidth() / 900f); + mainMenu.getTitleLabel().updateTitleFont(newFontSize); + + // Mettre à jour les polices des boutons + mainMenu.getButtonPanel().updateButtonFonts(mainMenu.getWidth()); + } +} diff --git a/TestV2/src/fr/monkhanny/dorfromantik/enums/Sounds.java b/TestV2/src/fr/monkhanny/dorfromantik/enums/Sounds.java index a94115d..772dac4 100644 --- a/TestV2/src/fr/monkhanny/dorfromantik/enums/Sounds.java +++ b/TestV2/src/fr/monkhanny/dorfromantik/enums/Sounds.java @@ -6,9 +6,9 @@ public enum Sounds { public String getSoundsPath() { switch (this) { case SOUNDS1: - return "./ressources/sounds/SFX/1.mp3"; + return "./ressources/sounds/SFX/1.wav"; case SOUNDS2: - return "./ressources/sounds/SFX/2.mp3"; + return "./ressources/sounds/SFX/2.wav"; default: throw new IllegalArgumentException("Unexpected value: " + this); } diff --git a/TestV2/src/fr/monkhanny/dorfromantik/gui/ButtonHoverAnimator.java b/TestV2/src/fr/monkhanny/dorfromantik/gui/ButtonHoverAnimator.java new file mode 100644 index 0000000..8abc76d --- /dev/null +++ b/TestV2/src/fr/monkhanny/dorfromantik/gui/ButtonHoverAnimator.java @@ -0,0 +1,33 @@ +package fr.monkhanny.dorfromantik.gui; + +import fr.monkhanny.dorfromantik.Options; + +import javax.swing.*; +import java.awt.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; + +public class ButtonHoverAnimator { + + private final JButton button; + private final Color originalColor; + private final Font originalFont; + private Timer animationTimer; + private float currentScale = 1.0f; + + public ButtonHoverAnimator(JButton button) { + this.button = button; + this.originalColor = button.getForeground(); + this.originalFont = button.getFont(); + } + + public void startAnimation(boolean entering) { + if (animationTimer != null && animationTimer.isRunning()) { + animationTimer.stop(); + } + + // Create a new ActionListener instance + animationTimer = new Timer(Options.ANIMATION_DELAY, new ButtonHoverAnimationListener(entering, button, originalColor, originalFont)); + animationTimer.start(); + } +} diff --git a/TestV2/src/fr/monkhanny/dorfromantik/gui/ButtonPanel.java b/TestV2/src/fr/monkhanny/dorfromantik/gui/ButtonPanel.java index bb0890c..47f7754 100644 --- a/TestV2/src/fr/monkhanny/dorfromantik/gui/ButtonPanel.java +++ b/TestV2/src/fr/monkhanny/dorfromantik/gui/ButtonPanel.java @@ -33,13 +33,13 @@ public class ButtonPanel extends JPanel { // Ajouter les boutons au panneau this.add(newGameButton); - this.add(Box.createVerticalStrut(20)); // Espace entre les boutons + this.add(Box.createVerticalStrut(10)); // Espace entre les boutons this.add(continueGameButton); - this.add(Box.createVerticalStrut(20)); + this.add(Box.createVerticalStrut(10)); this.add(howToPlayButton); - this.add(Box.createVerticalStrut(20)); + this.add(Box.createVerticalStrut(10)); this.add(settingsButton); - this.add(Box.createVerticalStrut(20)); + this.add(Box.createVerticalStrut(25)); this.add(exitButton); // Espacement extensible pour maintenir les icônes en bas diff --git a/TestV2/src/fr/monkhanny/dorfromantik/utils/MusicLoader.java b/TestV2/src/fr/monkhanny/dorfromantik/utils/MusicLoader.java deleted file mode 100644 index 0216894..0000000 --- a/TestV2/src/fr/monkhanny/dorfromantik/utils/MusicLoader.java +++ /dev/null @@ -1,23 +0,0 @@ -package fr.monkhanny.dorfromantik.utils; - -import javax.sound.sampled.*; -import java.io.File; -import java.io.IOException; - -public class MusicLoader { - - public static Clip loadMusic(String filePath) { - try { - File musicFile = new File(filePath); - AudioInputStream audioStream = AudioSystem.getAudioInputStream(musicFile); - Clip clip = AudioSystem.getClip(); - clip.open(audioStream); - return clip; - } catch (UnsupportedAudioFileException | IOException | LineUnavailableException e) { - e.printStackTrace(); - System.err.println("Failed to load music at path: " + filePath); - return null; - } - } - -} \ No newline at end of file diff --git a/TestV2/src/fr/monkhanny/dorfromantik/utils/MusicPlayer.java b/TestV2/src/fr/monkhanny/dorfromantik/utils/MusicPlayer.java index e29cafd..6270661 100644 --- a/TestV2/src/fr/monkhanny/dorfromantik/utils/MusicPlayer.java +++ b/TestV2/src/fr/monkhanny/dorfromantik/utils/MusicPlayer.java @@ -1,57 +1,86 @@ package fr.monkhanny.dorfromantik.utils; import fr.monkhanny.dorfromantik.enums.Musics; +import fr.monkhanny.dorfromantik.enums.Sounds; import fr.monkhanny.dorfromantik.Options; import javax.sound.sampled.Clip; +import javax.sound.sampled.LineEvent; import javax.sound.sampled.FloatControl; public class MusicPlayer { private static Clip musicClip; - private static boolean isPlaying = false; + private static Clip soundClip; // Clip séparé pour les bruitages + private static boolean isPlayingMusic = false; + private static boolean isPlayingSound = false; public static void loadMusic(Musics music) { if (music == Musics.MAIN_MENU_MUSIC) { - musicClip = MusicLoader.loadMusic(Musics.MAIN_MENU_MUSIC.getSoundsPath()); + musicClip = SoundLoader.loadMusic(Musics.MAIN_MENU_MUSIC.getSoundsPath()); if (musicClip != null) { - setVolume(Options.DEFAULT_VOLUME); + setVolume(musicClip, Options.DEFAULT_VOLUME); } } } - public static void play() { - loadMusic(Musics.MAIN_MENU_MUSIC); - if (musicClip != null && !isPlaying) { + public static void loadSound(Sounds sound) { + if (sound == Sounds.SOUNDS1) { + soundClip = SoundLoader.loadMusic(Sounds.SOUNDS1.getSoundsPath()); // Utilise soundClip pour les bruitages + if (soundClip != null) { + setVolume(soundClip, Options.DEFAULT_VOLUME); + } + } + } + + public static void playMusic() { + if (musicClip != null && !isPlayingMusic) { musicClip.start(); - isPlaying = true; + isPlayingMusic = true; } } - public static void pause() { - if (musicClip != null && isPlaying) { + public static void playSound() { + if (soundClip != null && !isPlayingSound) { + soundClip.start(); + isPlayingSound = true; + soundClip.addLineListener(event -> { // Réinitialiser isPlayingSound à la fin du son + if (event.getType() == LineEvent.Type.STOP) { + soundClip.setFramePosition(0); // Retour au début du son pour rejouer si nécessaire + isPlayingSound = false; + } + }); + } + } + + public static void pauseMusic() { + if (musicClip != null && isPlayingMusic) { musicClip.stop(); - isPlaying = false; + isPlayingMusic = false; } } - public static void stop() { + public static void stopMusic() { if (musicClip != null) { musicClip.stop(); musicClip.setFramePosition(0); - isPlaying = false; + isPlayingMusic = false; } } - public static void setVolume(int volume) { - if (musicClip != null) { - FloatControl volumeControl = (FloatControl) musicClip.getControl(FloatControl.Type.MASTER_GAIN); + public static void setVolume(Clip clip, int volume) { + if (clip != null) { + FloatControl volumeControl = (FloatControl) clip.getControl(FloatControl.Type.MASTER_GAIN); float range = volumeControl.getMaximum() - volumeControl.getMinimum(); float gain = (range * volume / 100f) + volumeControl.getMinimum(); volumeControl.setValue(gain); } } - public static boolean isPlaying() { - return isPlaying; + public static boolean isPlayingMusic() { + return isPlayingMusic; } -} \ No newline at end of file + + public static boolean isPlayingSound() { + return isPlayingSound; + } +} diff --git a/TestV2/src/fr/monkhanny/dorfromantik/utils/SoundLoader.java b/TestV2/src/fr/monkhanny/dorfromantik/utils/SoundLoader.java index 153bb3e..a28d30b 100644 --- a/TestV2/src/fr/monkhanny/dorfromantik/utils/SoundLoader.java +++ b/TestV2/src/fr/monkhanny/dorfromantik/utils/SoundLoader.java @@ -8,8 +8,8 @@ public class SoundLoader { public static Clip loadMusic(String filePath) { try { - File musicFile = new File(filePath); - AudioInputStream audioStream = AudioSystem.getAudioInputStream(musicFile); + File soundFile = new File(filePath); + AudioInputStream audioStream = AudioSystem.getAudioInputStream(soundFile); Clip clip = AudioSystem.getClip(); clip.open(audioStream); return clip;