AudioSystem.ts 6.3 KB

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