183 lines
5.2 KiB
TypeScript
183 lines
5.2 KiB
TypeScript
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;
|
|
}
|
|
} |