Browse Source

Hintergrund Musik, Sounds beim Drücken von Tiles und Buttons

Jan 5 months ago
parent
commit
f43c9196c5

+ 6 - 2
src/main/java/controller/GameController.java

@@ -19,6 +19,8 @@ import model.tiles.InteractiveTileModel;
 import model.tiles.InteractiveTileType;
 import util.GAMESTATE;
 import view.GamePanel;
+import view.sound.SoundManager;
+
 import java.io.Serializable;
 import java.util.ArrayList;
 
@@ -199,6 +201,7 @@ public class GameController implements Runnable, Serializable {
      * @param y screen y-coordinate of click
      */
     public void handleInventoryClick(int x, int y) {
+        SoundManager.getInstance().playSound(SoundManager.SOUNDS.CLICK);
         int slot = view.getInventoryView().getClickedInventorySlot(x, y);
         getModel().getInventory().select(slot);
     }
@@ -211,6 +214,7 @@ public class GameController implements Runnable, Serializable {
      */
     public void handleShopClick(int x, int y) {
         InteractiveTileController controller = view.getShopView().getClickedOffer(x, y);
+        if(controller != null) SoundManager.getInstance().loopSound(SoundManager.SOUNDS.MOVING_BUSH);
         shopController.setDraggingOffer(controller);
     }
 
@@ -412,8 +416,8 @@ public class GameController implements Runnable, Serializable {
      * Called from GameMouseListener.mouseReleased when ending a drag.
      * Snaps the tile to grid, validates position, reverts if invalid.
      */
-    public void handleTileRelease(int mouseX, int mouseY) {
-        getView().tileManager.handleTileRelease(mouseX, mouseY);
+    public void handleTileRelease() {
+        getView().tileManager.handleTileRelease();
 
     }
 

+ 2 - 0
src/main/java/controller/entity/EntityController.java

@@ -7,6 +7,7 @@ import util.GAMESTATE;
 import view.Camera;
 import view.entity.EntityView;
 import view.popUpMenu.PopupMenu;
+import view.sound.SoundManager;
 import view.tile.ONCLICKTYPE;
 
 import java.awt.*;
@@ -68,6 +69,7 @@ public abstract class EntityController implements InteractiveController {
     }
 
     public void click(int screenX, int screenY) {
+        SoundManager.getInstance().playSound(SoundManager.SOUNDS.VILLAGER);
         if(onclicktype == ONCLICKTYPE.RUNNABLE){
             view.runOnClick();
         }else{

+ 10 - 2
src/main/java/controller/input/GameMouseListener.java

@@ -1,9 +1,11 @@
 package controller.input;
 
 import controller.GameController;
+import controller.tiles.interactive.InteractiveTileController;
 import util.GAMESTATE;
 import view.Camera;
 import view.GamePanel;
+import view.sound.SoundManager;
 import view.tile.TileManager;
 
 import javax.swing.*;
@@ -71,7 +73,13 @@ public class GameMouseListener implements MouseListener, MouseMotionListener {
 
             int worldX = tm.screenToWorldX(e.getX());
             int worldY = tm.screenToWorldY(e.getY());
-            tm.setDraggingTile(tm.getTileAt(worldX, worldY));
+            InteractiveTileController controller = tm.getTileAt(worldX, worldY);
+
+            if(controller != null){
+                SoundManager.getInstance().loopSound(SoundManager.SOUNDS.MOVING_BUSH);
+            }
+
+            tm.setDraggingTile(controller);
         }
 
         if (gamePanel.gameState == GAMESTATE.SHOP && SwingUtilities.isRightMouseButton(e)) {
@@ -85,7 +93,7 @@ public class GameMouseListener implements MouseListener, MouseMotionListener {
     @Override
     public void mouseReleased(MouseEvent e) {
         if (SwingUtilities.isRightMouseButton(e)) {
-            controller.handleTileRelease(e.getX(), e.getY());
+            controller.handleTileRelease();
         }
     }
 

+ 2 - 1
src/main/java/controller/tiles/interactive/InteractiveTileController.java

@@ -5,6 +5,7 @@ import controller.InteractiveController;
 import model.tiles.InteractiveTileModel;
 import view.Camera;
 import view.popUpMenu.PopupMenu;
+import view.sound.SoundManager;
 import view.tile.ONCLICKTYPE;
 import view.tile.interactive.InteractiveTileView;
 
@@ -58,10 +59,10 @@ public abstract class InteractiveTileController implements InteractiveController
     }
 
     public void click(int screenX, int screenY) {
+        SoundManager.getInstance().playSound(SoundManager.SOUNDS.CLICK);
         if(onclicktype == ONCLICKTYPE.RUNNABLE){
             view.runOnClick();
         }else{
-
             screenXClick = screenX;
             screenYClick = screenY;
             clicked = true;

+ 5 - 0
src/main/java/main/Main.java

@@ -5,6 +5,8 @@ import model.GameSaver;
 import util.Translator;
 import util.economy.EconomyInfo;
 import view.GamePanel;
+import view.sound.MusicManager;
+import view.sound.SoundManager;
 
 import javax.swing.*;
 import java.io.IOException;
@@ -15,6 +17,9 @@ public class Main {
 
         Translator.load("lang/de_de.json");
         EconomyInfo.load();
+        SoundManager.getInstance().loadAllSounds();
+        MusicManager mm = MusicManager.getInstance();
+        mm.playBackgroundMusic("sound/background/background.wav", true);
 
         GameController gameController = GameSaver.loadGame();
 

+ 3 - 0
src/main/java/view/components/Button.java

@@ -1,5 +1,7 @@
 package view.components;
 
+import view.sound.SoundManager;
+
 import java.awt.*;
 import java.io.Serializable;
 
@@ -28,6 +30,7 @@ public class Button implements Serializable {
     }
 
     public void click(){
+        SoundManager.getInstance().playSound(SoundManager.SOUNDS.CLICK);
         runnable.run();
     }
     public void setOffset(int x, int y){

+ 58 - 0
src/main/java/view/sound/MusicManager.java

@@ -0,0 +1,58 @@
+package view.sound;
+
+import javax.sound.sampled.AudioInputStream;
+import javax.sound.sampled.AudioSystem;
+import javax.sound.sampled.Clip;
+import java.net.URL;
+import java.util.EnumMap;
+
+public class MusicManager {
+    private static MusicManager instance;
+    private Clip musicClip;
+
+
+    private MusicManager() {
+    }
+
+    public static MusicManager getInstance() {
+        if (instance == null) {
+            instance = new MusicManager();
+        }
+        return instance;
+    }
+
+    public void playBackgroundMusic(String resourcePath, boolean loop) {
+        stop();
+        if(loop){
+            getBackgroundMusic(resourcePath).loop(Clip.LOOP_CONTINUOUSLY);
+        }else{
+            getBackgroundMusic(resourcePath).start();
+        }
+    }
+
+    private Clip getBackgroundMusic(String resourcePath){
+        try {
+            URL musicURL = getClass().getClassLoader().getResource(resourcePath);
+            if (musicURL == null) {
+                System.err.println("Music file not found: " + resourcePath);
+                return null;
+            }
+
+            AudioInputStream audioStream = AudioSystem.getAudioInputStream(musicURL);
+            musicClip = AudioSystem.getClip();
+            musicClip.open(audioStream);
+            return musicClip;
+
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+
+    public void stop() {
+        if (musicClip != null) {
+            musicClip.stop();
+            musicClip.close();
+        }
+    }
+}

+ 89 - 0
src/main/java/view/sound/SoundManager.java

@@ -0,0 +1,89 @@
+package view.sound;
+
+import javax.sound.sampled.*;
+import java.io.IOException;
+import java.net.URL;
+import java.util.EnumMap;
+
+public class SoundManager{
+    private static SoundManager instance;
+    private EnumMap<SOUNDS, Clip> soundMap;
+
+    public void stopLoopSound(SOUNDS sound) {
+        soundMap.get(sound).stop();
+    }
+
+    public enum SOUNDS {
+        CLICK,
+        MOVING_BUSH,
+        VILLAGER
+    }
+
+
+    private SoundManager() {
+        soundMap = new EnumMap<>(SOUNDS.class);
+    }
+
+    public void loadAllSounds(){
+        SoundManager.getInstance().loadSound(SoundManager.SOUNDS.CLICK, "sound/click.wav");
+        SoundManager.getInstance().loadSound(SoundManager.SOUNDS.VILLAGER, "sound/villager.wav");
+        SoundManager.getInstance().loadSound(SoundManager.SOUNDS.MOVING_BUSH, "sound/moving_bush.wav");
+    }
+
+    public void loopSound(SOUNDS sound){
+        Clip clip = soundMap.get(sound);
+        if(clip != null){
+            if(clip.isRunning()){
+                clip.stop();
+            }else{
+                clip.loop(Clip.LOOP_CONTINUOUSLY);
+            }
+        }
+
+    }
+
+    public static SoundManager getInstance() {
+        if (instance == null) {
+            instance = new SoundManager();
+        }
+        return instance;
+    }
+
+    public void loadSound(SOUNDS sound, String resourcePath) {
+        try {
+            URL soundURL = getClass().getClassLoader().getResource(resourcePath);
+            if (soundURL == null) {
+                System.err.println("Resource not found: " + resourcePath);
+                return;
+            }
+
+            AudioInputStream audioStream = AudioSystem.getAudioInputStream(soundURL);
+            Clip clip = AudioSystem.getClip();
+            clip.open(audioStream);
+            soundMap.put(sound, clip);
+        } catch (UnsupportedAudioFileException | IOException | LineUnavailableException e) {
+            System.err.println("Failed to load sound " + sound + ": " + e.getMessage());
+        }
+    }
+
+    public void playSound(SOUNDS sound) {
+
+        Clip clip = soundMap.get(sound);
+        if (clip != null) {
+            if (clip.isRunning()) {
+                clip.stop();
+            }
+            clip.setFramePosition(0);
+            clip.start();
+        } else {
+            System.err.println("Sound " + sound + " wurde nicht geladen.");
+        }
+    }
+
+    public void unloadAllSounds() {
+        for (Clip clip : soundMap.values()) {
+            clip.close();
+        }
+        soundMap.clear();
+    }
+}

+ 5 - 1
src/main/java/view/tile/TileManager.java

@@ -6,6 +6,7 @@ import model.tiles.BackgroundTile;
 import model.tiles.InteractiveTileModel;
 import util.WorldGenerator;
 import view.GamePanel;
+import view.sound.SoundManager;
 import view.tile.interactive.InteractiveTileView;
 import view.util.RenderingManager;
 
@@ -105,6 +106,7 @@ public class TileManager implements RenderingManager {
      * dx, dy are screen pixel deltas.
      */
     public void handleTileShift(int dx, int dy) {
+
         if (draggingTile == null) {
             return;
         }
@@ -187,7 +189,9 @@ public class TileManager implements RenderingManager {
         }
     }
 
-    public void handleTileRelease(int mouseX, int mouseY) {
+    public void handleTileRelease() {
+        SoundManager.getInstance().stopLoopSound(SoundManager.SOUNDS.MOVING_BUSH);
+
         if (draggingTile == null) {
             return;
         }

BIN
src/main/resources/sound/background/background.wav


BIN
src/main/resources/sound/click.wav


BIN
src/main/resources/sound/moving_bush.wav


BIN
src/main/resources/sound/villager.wav