AudioManager.ts 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247
  1. /**
  2. * 音频模块
  3. * @author 薛鸿潇
  4. */
  5. export default class AudioManager {
  6. /** 音乐开关 */
  7. private _switchMusic: boolean = true;
  8. /** 音效开关 */
  9. private _switchEffect: boolean = true;
  10. /** 音效音量 */
  11. private _effectVolume: number = 1;
  12. /** 音乐音量 */
  13. private _musicVolume: number = 1;
  14. /** 暂时音效开关 */
  15. private _switchTempEffect: boolean = true;
  16. /** 音频map */
  17. private _map_audio: Map<AUDIO_NAME, cc.AudioClip> = new Map();
  18. /** 初始化 */
  19. public init() {
  20. // 获取本地开关设置
  21. let effect = cc.sys.localStorage.getItem("switchEffect");
  22. if (effect) {
  23. if (effect == "true") {
  24. this._switchEffect = true;
  25. } else {
  26. this._switchEffect = false;
  27. }
  28. }
  29. let music = cc.sys.localStorage.getItem("switchMusic");
  30. if (music) {
  31. if (music == "true") {
  32. this._switchMusic = true;
  33. } else {
  34. this._switchMusic = false;
  35. }
  36. }
  37. if (this._switchMusic) {
  38. this.playMusic('bgm', true)
  39. }
  40. }
  41. /**
  42. * 播放音乐文件
  43. * @param audio_name 音频名字
  44. * @param loop 是否循环【默认循环】
  45. */
  46. public async playMusic(audio_name: AUDIO_NAME, loop: boolean = true) {
  47. let asset = this._map_audio.get(audio_name);
  48. if (!asset) {
  49. asset = await mk.loader.load(AUDIO_PATH + audio_name, cc.AudioClip);
  50. this._map_audio.set(audio_name, asset);
  51. }
  52. mk.audio.playMusic(asset, loop);
  53. }
  54. /**
  55. * 播放音效文件
  56. * @param audio_name 音频名字
  57. * @param loop 是否循环【默认不循环】
  58. */
  59. public async playEffect(audio_name: AUDIO_NAME, loop: boolean = false) {
  60. if (this._switchEffect && this._switchTempEffect) {
  61. let asset = this._map_audio.get(audio_name);
  62. if (!asset) {
  63. asset = await mk.loader.load(AUDIO_PATH + audio_name, cc.AudioClip);
  64. this._map_audio.set(audio_name, asset);
  65. }
  66. mk.audio.playEffect(asset, loop);
  67. }
  68. }
  69. /**
  70. * 停止播放音效
  71. * @param audio_id 音频id
  72. */
  73. public stopEffect(audio_id: number) {
  74. mk.audio.stopEffect(audio_id);
  75. }
  76. /**
  77. * 转换音效开关
  78. */
  79. public switchEffectFunc() {
  80. this._switchEffect = !this._switchEffect;
  81. if (!this._switchEffect) {
  82. this.setStopAllEffect();
  83. }
  84. cc.sys.localStorage.setItem("switchEffect", this._switchEffect.toString());
  85. }
  86. /**
  87. * 获取音效开关状态
  88. * @returns {boolean}
  89. */
  90. public getSwitchEffect(): boolean {
  91. return this._switchEffect;
  92. }
  93. /**
  94. * 设置音效声音大小
  95. * value: 0.0 - 1.0
  96. */
  97. public setEffectVolume(value: number) {
  98. this._effectVolume = value;
  99. mk.audio.setEffectVolume(value);
  100. cc.sys.localStorage.setItem("audio", JSON.stringify({ effect: this._effectVolume, music: this._musicVolume }));
  101. }
  102. /**
  103. * 获取音效大小
  104. * @return {number} 0.0 - 1.0
  105. */
  106. public getEffectVolume(): number {
  107. return mk.audio.getEffectVolume();
  108. }
  109. /**
  110. * 恢复当前说暂停的所有音效
  111. */
  112. public setResumeAllEffect() {
  113. if (this._switchEffect) {
  114. mk.audio.resumeAllEffects();
  115. }
  116. }
  117. /**
  118. * 停止播放所有正在播放的音效
  119. */
  120. public setStopAllEffect() {
  121. mk.audio.stopAllEffects();
  122. }
  123. /** 暂时开启关闭音效开关
  124. * @param state true 打开 false 关闭
  125. */
  126. public setTempEffect(state: boolean) {
  127. this._switchTempEffect = state;
  128. }
  129. /**
  130. * 转换音乐按钮开关
  131. */
  132. public switchMusicFunc() {
  133. this._switchMusic = !this._switchMusic;
  134. if (!this._switchMusic) {
  135. this.stopMusic();
  136. } else {
  137. this.playMusic('bgm');
  138. }
  139. cc.sys.localStorage.setItem("switchMusic", this._switchMusic.toString());
  140. }
  141. /**
  142. * 获取音乐开关状态
  143. * @returns {boolean}
  144. */
  145. public getSwitchMusic() {
  146. return this._switchMusic;
  147. }
  148. /**
  149. * 暂停当前播放音乐
  150. */
  151. public setPauseMusic() {
  152. mk.audio.pauseMusic();
  153. }
  154. /**
  155. * 恢复当前被暂停音乐音乐
  156. */
  157. public setResumeMusic() {
  158. if (this._switchMusic) {
  159. mk.audio.resumeMusic();
  160. }
  161. }
  162. /**
  163. * 暂停所有 music
  164. */
  165. public stopMusic() {
  166. mk.audio.stopMusic();
  167. }
  168. /**
  169. * 设置music音量
  170. * @param value 音量
  171. */
  172. public setMusicVolume(value: number) {
  173. this._musicVolume = value;
  174. mk.audio.setMusicVolume(value);
  175. cc.sys.localStorage.setItem("audio", JSON.stringify({ effect: this._effectVolume, music: this._musicVolume }));
  176. }
  177. /**
  178. * 获取当前music音量
  179. * @returns {number} 音量
  180. */
  181. public getMusicVolume() {
  182. return mk.audio.getMusicVolume();
  183. }
  184. /**
  185. * 音乐是否正在播放(验证些方法来实现背景音乐是否播放完成)
  186. * @returns {boolen}
  187. */
  188. public isMusicPlaying() {
  189. return mk.audio.isMusicPlaying();
  190. }
  191. /**
  192. * 释放指定音效资源
  193. * @param audio 音频资源
  194. */
  195. public releaseAudio(audio: cc.AudioClip) {
  196. if (!audio) {
  197. cc.error("【音频】资源" + audio + "不存在, 释放失败")
  198. return;
  199. }
  200. mk.audio.releaseAudio(audio);
  201. }
  202. /** 停止所有音效 */
  203. public stopAllAudio() {
  204. mk.audio.stopAllAudio();
  205. }
  206. /** 卸载所有音频 */
  207. public releaseAllAudio() {
  208. mk.audio.releaseAllAudio();
  209. }
  210. }
  211. /** 音频路径 */
  212. const AUDIO_PATH = 'music/';
  213. /** 声音枚举 */
  214. enum AUDIO_TYPE {
  215. bgm = 'Background_music1', //背景音乐
  216. button = 'Button_click', //按钮点击音效
  217. turntableDraw = 'turntable1', //转盘抽奖结束
  218. turntableDrawEnd = 'turntable_2', //转盘抽奖音效
  219. getGold = 'Get_gold', //获取金币音效
  220. }
  221. /** 外部读取到的类型 */
  222. type AUDIO_NAME = keyof typeof AUDIO_TYPE;