feat(audio): implement audio & main menu music

This commit is contained in:
2025-10-03 08:29:17 +07:00
parent 88dbbb4be7
commit 2c77f665cb
7 changed files with 70 additions and 2 deletions

View File

@ -12,6 +12,7 @@ import java.util.ArrayList;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.vibecoders.moongazer.managers.Assets;
import org.vibecoders.moongazer.managers.Audio;
import org.vibecoders.moongazer.scenes.*;
public class Game extends ApplicationAdapter {
@ -96,10 +97,13 @@ public class Game extends ApplicationAdapter {
public void dispose() {
// Save settings
Settings.saveSettings();
// Dispose resources
// Dispose scenes
introScene.dispose();
mainMenuScene.dispose();
// Dispose resources
Audio.dispose();
Assets.dispose();
// Dispose batch and stage
batch.dispose();
stage.dispose();
log.debug("Resources disposed");

View File

@ -129,6 +129,7 @@ public class Assets {
// "Load" unsupported file types as FileHandle
loadingThread = new Thread(() -> {
loadAny("videos/main_menu_background.webm");
loadAny("audio/I Once Praised the Day.mp3");
});
loadingThread.start();
}

View File

@ -0,0 +1,53 @@
package org.vibecoders.moongazer.managers;
import org.slf4j.Logger;
import org.vibecoders.moongazer.Settings;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.audio.Music;
import com.badlogic.gdx.files.FileHandle;
public class Audio {
private static final Logger log = org.slf4j.LoggerFactory.getLogger(Audio.class);
private static boolean initialized = false;
private static Music menuMusic = null;
public static void init() {
if (initialized) {
return;
}
initialized = true;
menuMusic = Gdx.audio.newMusic(Assets.getAsset("audio/I Once Praised the Day.mp3", FileHandle.class));
log.info("Audio manager initialized");
}
public static void menuMusicSetVolume() {
menuMusic.setVolume(Settings.getMusicVolume() * Settings.getMasterVolume());
}
public static void musicSetVolume() {
menuMusicSetVolume();
}
public static void menuMusicPlay() {
if (!menuMusic.isPlaying()) {
menuMusic.setLooping(true);
menuMusic.play();
}
}
public static void menuMusicStop() {
if (menuMusic.isPlaying()) {
menuMusic.stop();
}
}
public static void dispose() {
if (menuMusic != null) {
menuMusic.dispose();
menuMusic = null;
}
initialized = false;
log.info("Audio manager disposed");
}
}

View File

@ -5,6 +5,7 @@ import static org.vibecoders.moongazer.Constants.*;
import org.vibecoders.moongazer.Game;
import org.vibecoders.moongazer.State;
import org.vibecoders.moongazer.managers.Assets;
import org.vibecoders.moongazer.managers.Audio;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.Color;
@ -29,6 +30,8 @@ public class Intro extends Scene {
logo = Assets.getAsset("icons/logo.png", Texture.class);
log.info("Starting to load all remaining assets...");
Assets.loadAll();
Audio.init();
Audio.musicSetVolume();
// Create scenes
game.mainMenuScene = new MainMenu(game);
game.settingsScene = new SettingsScene(game);
@ -38,6 +41,7 @@ public class Intro extends Scene {
/**
* Renders the intro scene.
*
* @param batch The SpriteBatch to draw with.
*/
@Override
@ -54,7 +58,8 @@ public class Intro extends Scene {
return;
}
ScreenUtils.clear(Color.BLACK);
// log.debug("Rendering logo at position: ({}, {})", WINDOW_WIDTH / 2 - logo.getWidth() / 4, WINDOW_HEIGHT / 2 - logo.getHeight() / 4);
// log.debug("Rendering logo at position: ({}, {})", WINDOW_WIDTH / 2 -
// logo.getWidth() / 4, WINDOW_HEIGHT / 2 - logo.getHeight() / 4);
var currentOpacity = totalTime;
if (currentOpacity > 1) {
if (!end) {

View File

@ -9,6 +9,7 @@ import java.util.Map;
import org.vibecoders.moongazer.Game;
import org.vibecoders.moongazer.State;
import org.vibecoders.moongazer.managers.Assets;
import org.vibecoders.moongazer.managers.Audio;
import org.vibecoders.moongazer.ui.UITextButton;
import com.badlogic.gdx.Gdx;
@ -163,6 +164,7 @@ public class MainMenu extends Scene {
return;
videoPlayer.setLooping(true);
videoPlayer.play();
Audio.menuMusicPlay();
videoPrepared = true;
}

View File

@ -16,6 +16,7 @@ import org.vibecoders.moongazer.Game;
import org.vibecoders.moongazer.State;
import org.vibecoders.moongazer.Settings;
import org.vibecoders.moongazer.managers.Assets;
import org.vibecoders.moongazer.managers.Audio;
import org.vibecoders.moongazer.ui.UICloseButton;
import org.vibecoders.moongazer.ui.UITextButton;
import org.vibecoders.moongazer.ui.UISlider;
@ -64,12 +65,14 @@ public class SettingsScene extends Scene {
masterVolSlider = new UISlider();
masterVolSlider.onChanged(() -> {
Settings.setMasterVolume(masterVolSlider.getValue());
Audio.musicSetVolume();
});
row.add(masterVolSlider.slider).width(300).right().padRight(40);
} else if (volume.equals("Music Volume")) {
musicSlider = new UISlider();
musicSlider.onChanged(() -> {
Settings.setMusicVolume(musicSlider.getValue());
Audio.musicSetVolume();
});
row.add(musicSlider.slider).width(300).right().padRight(40);
} else if (volume.equals("SFX Volume")) {