Files
Untitled-Maze-Game/src/game/sfx.js
2026-05-10 17:26:54 +09:00

59 lines
1.4 KiB
JavaScript

const soundFiles = {
chestClose: "/sfx/sfx_chest_close.wav",
chestOpen: "/sfx/sfx_chest_open.wav",
click: "/sfx/sfx_click.wav",
clock: "/sfx/sfx_clock.wav",
key: "/sfx/sfx_key.wav",
lose: "/sfx/sfx_lose.wav",
step: "/sfx/sfx_step.wav",
win: "/sfx/sfx_win.wav",
};
const sounds = {};
for (const [name, filePath] of Object.entries(soundFiles)) {
const audio = new Audio(filePath);
audio.preload = "auto";
sounds[name] = audio;
}
let audioPrimed = false;
function playAudio(audio, volume = 1) {
const instance = audio.cloneNode();
instance.volume = volume;
instance.currentTime = 0;
const promise = instance.play();
if (promise && typeof promise.catch === "function") {
promise.catch(() => {});
}
}
export function primeSfx() {
if (audioPrimed) {
return;
}
audioPrimed = true;
for (const audio of Object.values(sounds)) {
const probe = audio.cloneNode();
probe.volume = 0;
const promise = probe.play();
if (promise && typeof promise.then === "function") {
promise
.then(() => {
probe.pause();
probe.currentTime = 0;
})
.catch(() => {});
}
}
}
export function playSfx(name, volume = 1) {
const audio = sounds[name];
if (!audio) {
return;
}
playAudio(audio, volume);
}