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

View File

@ -129,6 +129,7 @@ public class Assets {
// "Load" unsupported file types as FileHandle // "Load" unsupported file types as FileHandle
loadingThread = new Thread(() -> { loadingThread = new Thread(() -> {
loadAny("videos/main_menu_background.webm"); loadAny("videos/main_menu_background.webm");
loadAny("audio/I Once Praised the Day.mp3");
}); });
loadingThread.start(); 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.Game;
import org.vibecoders.moongazer.State; import org.vibecoders.moongazer.State;
import org.vibecoders.moongazer.managers.Assets; import org.vibecoders.moongazer.managers.Assets;
import org.vibecoders.moongazer.managers.Audio;
import com.badlogic.gdx.Gdx; import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.Color; import com.badlogic.gdx.graphics.Color;
@ -29,6 +30,8 @@ public class Intro extends Scene {
logo = Assets.getAsset("icons/logo.png", Texture.class); logo = Assets.getAsset("icons/logo.png", Texture.class);
log.info("Starting to load all remaining assets..."); log.info("Starting to load all remaining assets...");
Assets.loadAll(); Assets.loadAll();
Audio.init();
Audio.musicSetVolume();
// Create scenes // Create scenes
game.mainMenuScene = new MainMenu(game); game.mainMenuScene = new MainMenu(game);
game.settingsScene = new SettingsScene(game); game.settingsScene = new SettingsScene(game);
@ -38,6 +41,7 @@ public class Intro extends Scene {
/** /**
* Renders the intro scene. * Renders the intro scene.
*
* @param batch The SpriteBatch to draw with. * @param batch The SpriteBatch to draw with.
*/ */
@Override @Override
@ -54,7 +58,8 @@ public class Intro extends Scene {
return; return;
} }
ScreenUtils.clear(Color.BLACK); 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; var currentOpacity = totalTime;
if (currentOpacity > 1) { if (currentOpacity > 1) {
if (!end) { if (!end) {

View File

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

View File

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