183 lines
5.2 KiB
TypeScript
Raw Normal View History

2025-04-24 17:03:28 +08:00
import SKLocalUtil from "../util/SKLocalUtil";
import SKLogger from "../util/SKLogger";
export default class AudioManager {
static shared: AudioManager = new AudioManager();
static prefix: string = "";
current: number;
private musicVolume: number;
private effectVolume: number;
private voiceVolume: number;
private audioCache: any;
private music: string;
constructor() {
this.current = 0;
this.musicVolume = SKLocalUtil.floatForKey("music_volume", 1);
this.effectVolume = SKLocalUtil.floatForKey("effect_volume", 1);
this.voiceVolume = SKLocalUtil.floatForKey("voice_volume", 1);
this.audioCache = {};
}
static play(clip: cc.AudioClip, loop: boolean): number {
return this.shared.play(clip, loop);
}
static stopPlay(audioID: number) {
cc.audioEngine.stop(audioID);
}
static playMusic(url: string) {
this.shared.playMusic(url);
}
static playAudio(url: string) {
this.shared.playAudio(url);
}
static playLocalAudio(url: string, idBlock: (id: number) => void, endBlock: () => void): boolean {
return this.shared.playLocalAudio(url, idBlock, endBlock);
}
static setMusicVolume(volume: number) {
this.shared.setMusicVolume(volume);
}
static setEffectVolume(volume: number) {
this.shared.setEffectVolume(volume);
}
static setVoiceVolume(volume: number) {
this.shared.setVoiceVolume(volume);
}
static getMusicVolume(): number {
return this.shared.getMusicVolume();
}
static getEffectVolume(): number {
return this.shared.getEffectVolume();
}
static getVoiceVolume(): number {
return this.shared.getVoiceVolume();
}
play(clip: cc.AudioClip, loop: boolean): number {
if (loop) {
cc.audioEngine.stop(this.current);
this.current = cc.audioEngine.play(clip, loop, this.musicVolume);
return this.current;
} else {
let current = cc.audioEngine.play(clip, loop, this.effectVolume);
return current;
}
}
playMusic(url: string) {
// 僅H5與安卓可以播放背景音樂
// if (!cc.sys.isBrowser && cc.sys.os != cc.sys.OS_ANDROID) {
// return;
// }
if (this.music == url) {
return;
}
let audio = this.audioCache[url];
if (audio) {
this.music = url;
SKLogger.debug(`播放音樂:${url}`);
this.play(audio, true);
} else {
let self = this;
cc.loader.loadRes(`${AudioManager.prefix}${url}`, cc.AudioClip, (error, resource) => {
if (error) {
SKLogger.warn(`找不到音樂資源:${url},錯誤:${error}`);
return;
}
self.music = url;
self.audioCache[url] = resource;
SKLogger.debug(`播放音樂:${url}`);
self.play(resource, true);
});
}
}
playAudio(url: string): number {
// 僅H5與安卓可以播放音效
// if (!cc.sys.isBrowser && cc.sys.os != cc.sys.OS_ANDROID) {
// return;
// }
let audio = this.audioCache[url];
if (audio) {
return this.play(audio, false);
} else {
let self = this;
cc.loader.loadRes(`${AudioManager.prefix}${url}`, cc.AudioClip, (error, resource) => {
if (error) {
cc.warn(`找不到音效:${url},錯誤:${error}`);
return;
}
self.music = url;
self.audioCache[url] = resource;
self.play(resource, false);
});
}
}
playLocalAudio(url: string, idBlock: (id: number) => void, endBlock: () => void): boolean {
if (!CC_JSB) {
return false;
}
let self = this;
// cc.audioEngine.uncache(url);
cc.loader.loadRes(url, cc.AudioClip, (error, resource) => {
if (error) {
cc.warn(`找不到本地音效:${url},錯誤:${error}`);
idBlock(-1);
return;
}
let audioID = self.play(resource, false);
if (audioID < 1) {
idBlock(-1);
} else {
idBlock(audioID);
}
jsb.AudioEngine.setFinishCallback(audioID, (id: number, filepath: string) => {
if (endBlock) {
endBlock();
}
});
});
return true;
}
setMusicVolume(volume: number) {
this.musicVolume = volume;
cc.audioEngine.setVolume(this.current, this.musicVolume);
SKLocalUtil.setFloat(this.musicVolume, "music_volume");
}
setEffectVolume(volume: number) {
this.effectVolume = Math.floor(volume * 100) / 100;
SKLocalUtil.setFloat(this.effectVolume, "effect_volume");
}
setVoiceVolume(volume: number) {
this.voiceVolume = Math.floor(volume * 100) / 100;
SKLocalUtil.setFloat(this.voiceVolume, "voice_volume");
}
getMusicVolume(): number {
return this.musicVolume;
}
getEffectVolume(): number {
return this.effectVolume;
}
getVoiceVolume(): number {
return this.voiceVolume;
}
}