AudioManager.ts 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254
  1. import bundleManager from "../../manager/bundleManager";
  2. import utils from "../utils/utils";
  3. /**
  4. * 音乐类
  5. */
  6. function getVolume(key, value) {
  7. // var val = Utils.getLocalStorageItem(key);
  8. // if (val === null) {
  9. // return value;
  10. // }
  11. // val = Number(val);
  12. // if (isNaN(val)) {
  13. // return value;
  14. // }
  15. return 0.7;
  16. }
  17. export default class AudioManager {
  18. // 背景音乐音量
  19. static get BGMVolume() {
  20. return getVolume('BGMVolume', 1);
  21. }
  22. static set BGMVolume(val) {
  23. utils.setLocalStorageItem('BGMVolume', this.BGMVolume);
  24. this.setGroupVolume('BGMVolume', this.BGMVolume);
  25. }
  26. // 音乐音量
  27. static get volume() {
  28. return getVolume('volume', 1);
  29. }
  30. static set volume(val) {
  31. utils.setLocalStorageItem('volume', val);
  32. this.setGroupVolume('default', val);
  33. };
  34. static music = {}; // 存储音乐
  35. static music_ID = {}; // 存储音乐实例或id
  36. static musicGroup = { // 音乐分组
  37. default: {} // 默认存在一个分组
  38. };
  39. /**
  40. * 播放音乐
  41. * @param name 音乐的名字
  42. * @param volume 音量,没有则跟随全局音量
  43. * @param loop 是否循环播放
  44. * @param group 音乐分组,没有则默认default分组
  45. */
  46. static play(name: string, volume?: number, loop?: boolean, group?: string) {
  47. volume = volume ? volume : 1;
  48. if (this.music[name] == null) {
  49. return this.loadMusic(name, volume, loop, group);
  50. }
  51. //this.pause(name); //防止出错持续播放
  52. this.addMusic(name, group); //把音乐添加到分组
  53. this.music_ID[name] = cc.audioEngine.play(this.music[name], loop, volume); //播放音乐
  54. return this.music_ID[name];
  55. }
  56. /**
  57. * 添加音乐
  58. */
  59. static addMusic(name, group) {
  60. var group_obj = this.isGroup(group);
  61. group_obj[name] = this.music[name];
  62. }
  63. /**
  64. * 是否存在分组,没有则创建一个分组
  65. * @param group 分组名字
  66. */
  67. static isGroup(group) {
  68. group = group || 'default';
  69. if (!this.musicGroup[group]) {
  70. this.musicGroup[group] = {};
  71. }
  72. return this.musicGroup[group];
  73. }
  74. /**
  75. * 关闭音乐
  76. * @param name 音乐的名字
  77. */
  78. static stop(name) {
  79. if (this.music_ID[name] == null) {
  80. return;
  81. }
  82. cc.audioEngine.stop(this.music_ID[name]);
  83. }
  84. /**
  85. * 停止一个分组所有音乐
  86. * @param group 分组
  87. */
  88. static stopGroupMusic(group) {
  89. var obj = this.musicGroup[group];
  90. if (!obj) {
  91. return;
  92. }
  93. for (let i in obj) {
  94. this.stop(i);
  95. }
  96. }
  97. /**
  98. * 停止所有音乐
  99. */
  100. static stopAllMusic() {
  101. cc.audioEngine.stopAll();
  102. }
  103. /**
  104. * 暂停音乐
  105. * @param name 名字
  106. */
  107. static pause(name) {
  108. cc.audioEngine.pause(this.music_ID[name]);
  109. }
  110. /**
  111. * 暂停一个分组的音乐
  112. * @param group 分组名称
  113. */
  114. static pauseGroupMusic(group) {
  115. var obj = this.musicGroup[group];
  116. if (!obj) {
  117. return;
  118. }
  119. for (let i in obj) {
  120. this.pause(i);
  121. }
  122. }
  123. /**
  124. * 暂停所有音乐
  125. */
  126. static pauseAllMusic() {
  127. cc.audioEngine.pauseAll();
  128. }
  129. /**
  130. * 恢复音乐
  131. * @param name 名字
  132. */
  133. static resume(name) {
  134. cc.audioEngine.resume(this.music_ID[name]);
  135. }
  136. /**
  137. * 恢复一个分组的音乐
  138. * @param group 分组名称
  139. */
  140. static resumeGroupMusic(group) {
  141. var obj = this.musicGroup[group];
  142. if (!obj) {
  143. return;
  144. }
  145. for (let i in obj) {
  146. this.resume(i);
  147. }
  148. }
  149. /**
  150. * 恢复所有音乐
  151. */
  152. static resumeAllMusic() {
  153. cc.audioEngine.resumeAll();
  154. }
  155. /**
  156. * 调节单个音乐的音量
  157. * @param name 音乐名字
  158. * @param volume 音量
  159. */
  160. static setVolume(name, volume) {
  161. cc.audioEngine.setVolume(this.music_ID[name], volume);
  162. }
  163. /**
  164. * 设置分组音量
  165. * @param group 分组名称
  166. * @param volume 音量
  167. */
  168. static setGroupVolume(group, volume) {
  169. var obj = this.musicGroup[group];
  170. if (!obj) {
  171. return;
  172. }
  173. for (let i in obj) {
  174. this.setVolume(i, volume);
  175. }
  176. }
  177. /**
  178. * 调节全部音乐的音量
  179. * @param volume 音量
  180. */
  181. static setAllVolume(volume) {
  182. this.volume = volume = parseInt(volume);
  183. var obj = this.music_ID;
  184. for (let i in obj) {
  185. this.setVolume(i, volume);
  186. }
  187. }
  188. /**
  189. * 加载音乐
  190. * @param path 音乐名字
  191. * @param volume 音量
  192. * @param loop 是否循环
  193. * @param group 分组
  194. */
  195. static loadMusic(path, volume, loop, group) {
  196. let musicBunle = bundleManager.getBundleByName('music');
  197. musicBunle.load(path, cc.AudioClip, (err, audio) => {
  198. if (err) {
  199. console.error('播放' + path + '失败', err);
  200. return;
  201. }
  202. this.music[path] = audio;
  203. this.play(path, volume, loop, group);
  204. });
  205. }
  206. /**
  207. * 释放音乐
  208. * @param name 音乐名字
  209. */
  210. static releaseMusic(name) {
  211. if (!this.music[name] || typeof this.music[name] === 'string') {
  212. return this.music[name] = null;
  213. }
  214. // AssetsManager.release(this.music[name], true);
  215. this.music[name] = null;
  216. }
  217. static getState(name) {
  218. if (this.music_ID[name] == null) {
  219. return;
  220. }
  221. return cc.audioEngine.getState(this.music_ID[name]);
  222. }
  223. }