Skip to content

add working audio system and weekend and work themes #101

Merged
merged 1 commit into from
May 14, 2026
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 24 additions & 0 deletions src/main/java/edu/ntnu/idi/idatt2003/gruppe42/Audio/Audio.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package edu.ntnu.idi.idatt2003.gruppe42.Audio;

public enum Audio {

// Sound effects
OPEN_APP("/Audio/open_app.wav"),
CLOSE_APP("/Audio/close_app.wav"),
CLOCK("/Audio/clock.wav"),
TRANSACTION("/Audio/transaction.wav"),

// Background music
WORK_THEME("/Audio/work_theme.mp3"),
WEEKEND_THEME("/Audio/weekend_theme.mp3");

private String path;

Audio(String path) {
this.path = path;
}

public String getPath() {
return path;
}
}
Original file line number Diff line number Diff line change
@@ -1,39 +1,60 @@
package edu.ntnu.idi.idatt2003.gruppe42.Audio;

import javafx.scene.media.AudioClip;
import javafx.scene.media.Media;
import javafx.scene.media.MediaPlayer;

import java.util.EnumMap;
import java.util.Map;

public class AudioManager {

private static AudioManager instance = new AudioManager();
private Map<SoundEffect, AudioClip> sounds = new EnumMap<>(SoundEffect.class);
private double volume = 1.0;
private static final AudioManager instance = new AudioManager();
private final Map<Audio, String> urlCache = new EnumMap<>(Audio.class);
private MediaPlayer bgPlayer;

public AudioManager() {
private AudioManager() {
for (Audio audio : Audio.values()) {
var url = getClass().getResource(audio.getPath());
urlCache.put(audio, url.toExternalForm());
}
}

for (SoundEffect effect : SoundEffect.values()) {
public static AudioManager getInstance() { return instance; }

AudioClip clip = new AudioClip(
getClass()
.getResource(effect.getPath())
.toExternalForm()
);
public void playSFX(Audio audio) {
String url = urlCache.get(audio);

sounds.put(effect, clip);
if (url == null) {
return;
}
}

public static AudioManager getInstance() {
return instance;
MediaPlayer sfxPlayer = new MediaPlayer(new Media(url));
sfxPlayer.setOnEndOfMedia(() -> {
sfxPlayer.stop();
sfxPlayer.dispose();
});

sfxPlayer.play();
}

public void play(SoundEffect sound) {
AudioClip audioClip = sounds.get(sound);
public void playBgMusic(Audio audio) {
stopBgMusic();

String url = urlCache.get(audio);
if (url == null) {
return;
}

bgPlayer = new MediaPlayer(new Media(url));
bgPlayer.setVolume(1);
bgPlayer.play();
}

if (audioClip != null) {
audioClip.play(volume);
public void stopBgMusic() {
if (bgPlayer != null) {
bgPlayer.stop();
bgPlayer.dispose();
bgPlayer = null;
}
}
}
}

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package edu.ntnu.idi.idatt2003.gruppe42.Controller.AppControllers;

import edu.ntnu.idi.idatt2003.gruppe42.Audio.AudioManager;
import edu.ntnu.idi.idatt2003.gruppe42.Audio.Audio;
import edu.ntnu.idi.idatt2003.gruppe42.Controller.MarketController;
import edu.ntnu.idi.idatt2003.gruppe42.Model.Player;
import edu.ntnu.idi.idatt2003.gruppe42.Model.Stock;
Expand Down Expand Up @@ -27,6 +29,7 @@ public final class StockAppController implements AppController {
private final StockApp stockApp;
private final Player player;
private Stock currentStock;
private AudioManager audioManager = AudioManager.getInstance();

/**
* Constructs a new StockAppController.
Expand Down Expand Up @@ -65,7 +68,10 @@ public StockAppController(
}
});

stockApp.getConfirmButton().setOnAction(e -> handleTransaction());
stockApp.getConfirmButton().setOnAction(e -> {
audioManager.playSFX(Audio.TRANSACTION);
handleTransaction();
});
}

/**
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package edu.ntnu.idi.idatt2003.gruppe42.Controller;

import edu.ntnu.idi.idatt2003.gruppe42.Audio.Audio;
import edu.ntnu.idi.idatt2003.gruppe42.Audio.AudioManager;
import edu.ntnu.idi.idatt2003.gruppe42.Controller.AppControllers.AppController;
import edu.ntnu.idi.idatt2003.gruppe42.Model.GameState;

Expand All @@ -15,6 +17,9 @@ public final class GameController {
private final List<AppController> appControllers = new ArrayList<>();
private Timer timer;
private GameState gameState;
private AudioManager audioManager = AudioManager.getInstance();
private boolean workMusicPlaying = false;
private boolean weekendMusicPlaying = false;

/**
* Adds an application controller to the list of controllers to be updated.
Expand All @@ -28,6 +33,17 @@ public void addAppController(final AppController appController) {
public void setGameState(GameState gameState) {
this.gameState = gameState;

if (gameState == GameState.WORKDAY && !workMusicPlaying) {
audioManager.playBgMusic(Audio.WORK_THEME);
workMusicPlaying = true;
weekendMusicPlaying = false;
}

if ((gameState == GameState.RENTDAY || gameState == GameState.FREEDAY) && !weekendMusicPlaying) {
audioManager.playBgMusic(Audio.WEEKEND_THEME);
weekendMusicPlaying = true;
workMusicPlaying = false;
}
}

/**
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package edu.ntnu.idi.idatt2003.gruppe42.Controller;

import edu.ntnu.idi.idatt2003.gruppe42.Audio.AudioManager;
import edu.ntnu.idi.idatt2003.gruppe42.Audio.SoundEffect;
import edu.ntnu.idi.idatt2003.gruppe42.Audio.Audio;
import edu.ntnu.idi.idatt2003.gruppe42.Model.App;
import edu.ntnu.idi.idatt2003.gruppe42.View.Popup;
import java.util.List;
Expand Down Expand Up @@ -38,7 +38,7 @@ public boolean show(App type) {
popup.getRoot().autosize();
popup.getRoot().toFront();
});
audioManager.play(SoundEffect.OPEN_APP);
audioManager.playSFX(Audio.OPEN_APP);
return true;
}

Expand All @@ -47,7 +47,7 @@ public boolean hide(Popup popup) {
return false;
}
popup.getRoot().setVisible(false);
audioManager.play(SoundEffect.CLOSE_APP);
audioManager.playSFX(Audio.CLOSE_APP);
return true;
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,13 @@
package edu.ntnu.idi.idatt2003.gruppe42.Controller;

import edu.ntnu.idi.idatt2003.gruppe42.Audio.AudioManager;
import edu.ntnu.idi.idatt2003.gruppe42.Audio.Audio;
import edu.ntnu.idi.idatt2003.gruppe42.Controller.AppControllers.AppController;
import edu.ntnu.idi.idatt2003.gruppe42.Model.Day;
import edu.ntnu.idi.idatt2003.gruppe42.Model.GameState;
import java.util.Random;

import javafx.application.Platform;
import javafx.beans.property.IntegerProperty;
import javafx.beans.property.SimpleIntegerProperty;
import javafx.beans.property.SimpleStringProperty;
Expand All @@ -21,6 +25,7 @@ public class TimeAndWeatherController implements AppController {
private final StringProperty weather = new SimpleStringProperty("Sunny");
private final Random random = new Random();
private final GameController gameController;
private AudioManager audioManager = AudioManager.getInstance();

private static final Day[] DAYS = {Day.SUN, Day.MON, Day.TUE, Day.WED, Day.THU, Day.FRI, Day.SAT};

Expand All @@ -40,6 +45,7 @@ public void nextTick() {
updateGameState();
updateWeather();
hour.set(0);
Platform.runLater(() -> audioManager.playSFX(Audio.CLOCK));
} else {
hour.set(nextHour);
}
Expand Down
Binary file added src/main/resources/Audio/clock.wav
Binary file not shown.
Binary file modified src/main/resources/Audio/close_app.wav
Binary file not shown.
Binary file removed src/main/resources/Audio/mouse_click.wav
Binary file not shown.
Binary file modified src/main/resources/Audio/open_app.wav
Binary file not shown.
Binary file added src/main/resources/Audio/transaction.wav
Binary file not shown.
Binary file added src/main/resources/Audio/weekend_theme.mp3
Binary file not shown.
Binary file added src/main/resources/Audio/work_theme.mp3
Binary file not shown.