123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280 |
- import { Lodash } from './lodash';
- import { _decorator, assetManager, AudioClip } from "cc";
- import { StorageManager } from "./storageManager";
- import { ResourceUtil } from "./resourceUtil";
- import { gameManager } from '../gameManager';
- const { ccclass, property } = _decorator;
- @ccclass("AudioManager")
- export class AudioManager {
- public dictWeaponSoundIndex: any = {};
- public musicVolume: number = 0.8;
- public soundVolume: number = 1;
- public audios: any = {};
- public arrSound: any = [];
- public static _instance: AudioManager;
- public static get instance () {
- if (this._instance) {
- return this._instance;
- }
- this._instance = new AudioManager();
- this._instance.init();
- return this._instance;
- }
- public init () {
- this.musicVolume = this.getAudioSetting(true) ? 0.8: 0;
- this.soundVolume = this.getAudioSetting(false) ? 1 : 0;
- }
- public onAppShow () {
- for (let name in this.audios) {
- let audio = this.audios[name];
- if (audio.loop) {
- //属于无限循环的,则需要在wx环境下自己开启播放
- audio.clip.play();
- }
- }
- }
- public getAudioSetting (isMusic: boolean) {
- let state;
- if (isMusic) {
- state = StorageManager.instance.getGlobalData('music');
- } else {
- state = StorageManager.instance.getGlobalData('sound');
- }
- // console.log('Config for [' + (isMusic ? 'Music' : 'Sound') + '] is ' + state);
- return !state || state === 'true' ? true : false;
- }
- /**
- * 播放音乐
- * @param {String} name 音乐名称可通过constants.AUDIO_MUSIC 获取
- * @param {Boolean} loop 是否循环播放
- */
- public playMusic (name:string, loop: boolean) {
- // let path = 'audio/music/' + name;
- let path = ''+ name;
- //微信特殊处理,除一开场的音乐,其余的放在子包里头
- // if (name !== 'click') {
- // path = path; //微信特殊处理,除一开场的音乐,其余的放在子包里头
- // }
-
- // ResourceUtil.loadRes(path, AudioClip, (err: any, clip: any)=> {
- // let tmp = {} as any;
- // tmp.clip = clip;
- // tmp.loop = loop;
- // tmp.isMusic = true;
- // this.audios[name] = tmp;
- // this.playClip(name, true);
- // });
- let call_back = (err: any, clip: AudioClip)=> {
- let tmp = {} as any;
- tmp.clip = clip;
- tmp.loop = loop;
- tmp.isMusic = true;
- this.audios[name] = tmp;
- this.playClip(name, true);
- }
- if(gameManager.mp3_cache.get(path)){
- let clip = gameManager.mp3_cache.get(path);
- call_back(null,clip)
- }else{
- assetManager.loadRemote(name, call_back );
- }
-
- }
- /**
- * 播放音效
- * @param {String} name 音效名称可通过constants.AUDIO_SOUND 获取
- * @param {Boolean} loop 是否循环播放
- */
- public playSound (name:string, loop:boolean = false) {
- if (!this.soundVolume) {
- return;
- }
- //音效一般是多个的,不会只有一个
- // let path = 'audio/sound/';
- let path = '';
- // if (name !== 'click') {
- // path = path; //微信特殊处理,除一开场的音乐,其余的放在子包里头
- // }
- // ResourceUtil.loadRes(path + name, AudioClip, (err: any, clip: any)=> {
- // let tmp = {} as any;
- // tmp.clip = clip;
- // tmp.loop = loop;
- // tmp.isMusic = false;
- // this.arrSound.push(tmp);
- // if (loop) {
- // this.audios[name] = tmp;
- // clip.setLoop(loop);
- // }
- // clip.setVolume(this.soundVolume);
-
- // clip.playOneShot();
- // clip.once('ended', ()=>{
- // Lodash.remove(this.arrSound, (obj: any)=>{
- // return obj.clip === tmp.clip;
- // });
- // })
- // });
- let call_back = (err: any, clip: any)=> {
- let tmp = {} as any;
- tmp.clip = clip;
- tmp.loop = loop;
- tmp.isMusic = false;
- this.arrSound.push(tmp);
- if (loop) {
- this.audios[name] = tmp;
- clip.setLoop(loop);
- }
- clip.setVolume(this.soundVolume);
-
- clip.playOneShot();
- clip.once('ended', ()=>{
- Lodash.remove(this.arrSound, (obj: any)=>{
- return obj.clip === tmp.clip;
- });
- })
- }
- if(gameManager.mp3_cache.get(path)){
- let clip = gameManager.mp3_cache.get(path);
- call_back(null,clip)
- }else{
- assetManager.loadRemote(name, call_back );
- }
- }
- public playClip (name: string, isMusic?: boolean) {
- // console.log('playClip: ' + JSON.stringify(this.audios));
- this.stopAll()
- let audio = this.audios[name];
- // if (typeof audio.audioId === "number") {
- // let state = cc.audioEngine.getState(audio.audioId);
- // if (state === cc.audioEngine.AudioState.PLAYING && audio.loop) return;
- // }
- let volume = this.musicVolume;
- if (!isMusic) {
- volume = this.soundVolume;
- }
- let clip = audio.clip as AudioClip;
- clip.setVolume(volume);
- clip.setLoop(audio.loop);
- clip.play();
- // let audioId = cc.audioEngine.play(audio.clip, audio.loop, volume);
- // audio.audioId = audioId;
- }
- public stop (name: any) {
- if (this.audios.hasOwnProperty(name)) {
- let audio = this.audios[name];
- audio.clip.stop();
- }
- }
- public stopAll () {
- for (const i in this.audios) {
- if (this.audios.hasOwnProperty(i)) {
- let audio = this.audios[i];
- audio.clip.stop();
- }
- }
- }
- public setMusic (flag: any) {
- if (typeof flag !== "number") {
- flag = flag ? 1 : 0;
- }
- this.musicVolume = flag;
- for (let item in this.audios) {
- if (this.audios.hasOwnProperty(item) && this.audios[item].isMusic) {
- // this.changeState(item, flag);
- let audio = this.audios[item];
- audio.clip.setVolume(this.musicVolume);
- }
- }
- }
- //看广告时先将音乐暂停
- public pauseAll () {
- console.log("pause all music!!!");
- for (let item in this.audios) {
- if (this.audios.hasOwnProperty(item)) {
- let audio = this.audios[item];
- audio.clip.pause();
- }
- }
- }
- public resumeAll () {
- for (let item in this.audios) {
- if (this.audios.hasOwnProperty(item)) {
- let audio = this.audios[item];
- audio.clip.play();
- }
- }
- }
- public openMusic () {
- this.setMusic(0.8);
- StorageManager.instance.setGlobalData('music', 'true');
- }
- public closeMusic () {
- this.setMusic(0);
- StorageManager.instance.setGlobalData('music', 'false');
- }
- public openSound () {
- this.setSound(1);
- StorageManager.instance.setGlobalData('sound', 'true');
- }
- public closeSound () {
- this.setSound(0);
- StorageManager.instance.setGlobalData('sound', 'false');
- }
- public setSound (flag: any) {
- this.soundVolume = flag;
- for (let item in this.audios) {
- if (this.audios.hasOwnProperty(item) && !this.audios[item].isMusic) {
- // this.changeState(item, flag);
- let audio = this.audios[item];
- audio.clip.setVolume(this.soundVolume);
- }
- }
- for (let idx = 0; idx < this.arrSound.length; idx++) {
- let audio = this.arrSound[idx];
- audio.clip.setVolume(this.soundVolume);
- }
- }
- public stopSingleSound (name: string) {
- if (this.audios.hasOwnProperty(name) && !this.audios[name].isMusic) {
- let audio = this.audios[name];
- audio.clip.stop();
- }
- }
- }
|