import { _decorator, Node, AudioClip, AudioSource, game, find } from "cc";
import { Dictionary } from "../core/Dictionary";
const { ccclass, property } = _decorator;
/**最多有几个音效播放器*/
const MAX_SOUNDS: number = 8
/**
* 音效管理器
*/
@ccclass("AudioMgr")
export class AudioMgr {
static _instance: AudioMgr;
static get ins() {
if (this._instance) {
return this._instance;
}
this._instance = new AudioMgr();
return this._instance;
}
/**音效的常驻节点*/
private _persistRootNode: Node = null;
//bgm音效全局唯一一个
private _music: AudioSource = null
//sound音效可以有多个
private _sounds: AudioSource[] = null
/**bgm静音 0没静音 1静音*/
private _music_muted: number = 0
/**sound静音 0没静音 1静音*/
private _sound_muted: number = 0
/**bgm音量*/
private _music_volume: number = 1
/**sound音量*/
private _sound_volume: number = 1
/**当前播放的音效索引用以控制使用不同的AudioSource*/
private _now_soundid: number = 0
/**当前播放的bgm音效名字*/
private _cur_music_name: string = ""
//存储所有的音效片段
private music_clips: Dictionary<string, AudioClip>
init() {
if (this._persistRootNode) return; //避免切换场景初始化报错
this._persistRootNode = find("Canvas")
game.addPersistRootNode(this._persistRootNode)
this._sounds = []
this.music_clips = new Dictionary<string, AudioClip>()
/**
* 读取本地存储的数据
*
*/
this._music = this._persistRootNode.addComponent(AudioSource)
//获取bgm的音量
this._music.volume = this._music_volume
//获取bgm是否存储静音
this._music.volume = this._music_muted == 1 ? 0 : this._music_volume
//获取sounds列表
for (let i = 0; i < MAX_SOUNDS; i++) {
this._sounds[i] = this._persistRootNode.addComponent(AudioSource)
this._sounds[i].volume = this._sound_volume
this._sounds[i].volume = this._sound_muted == 1 ? 0 : this._sound_volume
}
}
/**
* @param audioName 音效名字
* @param isLoop 是否循环播放
* @protected 播放音效
*/
playMusic(audioName: string, isLoop: boolean = true) {
if (this._cur_music_name == audioName) {
return
}
let call = (clip) => {
this._music.clip = null
this._music.clip = clip
this._music.loop = isLoop
this._music.play()
if (!this.music_clips.containsKey(audioName)) {
this.music_clips.add(audioName, clip)
}
}
if (this.music_clips.containsKey(audioName)) {
call(this.music_clips.getValue(audioName))
} else {
let bundleName = "base.audio"
let path = bundleName + "/" + audioName
assetManager.loadBundle(bundleName,(err, bundle) => {
bundle.load(path,AudioClip,(err: any, clip: any)=>{
if (err) {
console.error("loadAudioClip" + err);
}else{
call(clip)
}
});
})
}
}
/**
* @param audioName 音效名字
* @param isLoop 是否循环播放
* @protected 播放音效
*/
playSound(audioName: string, isLoop: boolean = false) {
let call = (clip) => {
this._sounds[this._now_soundid].clip = null
this._sounds[this._now_soundid].clip = clip
this._sounds[this._now_soundid].loop = isLoop
this._sounds[this._now_soundid].play()
if (!this.music_clips.containsKey(audioName)) {
this.music_clips.add(audioName, clip)
}
this._now_soundid = this._now_soundid + 1 >= this._sounds.length ? 0 : this._now_soundid + 1
}
if (this.music_clips.containsKey(audioName)) {
call(this.music_clips.getValue(audioName))
} else {
let bundleName = "base.audio"
let path = bundleName + "/" + audioName
assetManager.loadBundle(bundleName,(err, bundle) => {
bundle.load(path,AudioClip,(err: any, clip: any)=>{
if (err) {
console.error("loadAudioClip" + err);
}else{
call(clip)
}
});
})
}
}
/**
* 停止播放bgm
*/
stopMusic() {
this._music.stop()
this._music.clip = null
}
/**
* 停止播放所有的sound
*/
stopAllSound() {
for (let i = 0; i < this._sounds.length; i++) {
this._sounds[i].stop()
this._sounds[i].clip = null
}
this._now_soundid = 0
}
/**
*
* @param mute 是否静音music
*/
setMusicMute(mute: boolean) {
if (mute == (this._music_muted == 1)) {
return
}
this._music_muted = mute ? 1 : 0
this._music.volume = mute ? this._music_volume : 0
//存储music静音 this._music_muted
}
/**
*
* @param mute 是否静音sound
*/
setSoundMute(mute: boolean) {
if (mute == (this._sound_muted == 1)) {
return
}
this._sound_muted = mute ? 1 : 0
for (let i = 0; i < this._sounds.length; i++) {
this._sounds[i].volume = mute ? this._sound_volume : 0
}
//存储sound静音 this._sound_muted
}
/**
*
* @param value 设置音乐声音大小
*/
setMusicVolume(value: number) {
this._music.volume = value
this._music_volume = value
//存储music音量大小 this._music_volume
}
/**
*
* @param value 设置sound声音大小
*/
setSoundVolume(value: number) {
this._sound_volume = value
for (let i = 0; i < this._sounds.length; i++) {
this._sounds[i].volume = value
}
//存储sound音量大小 this._sound_volume
}
/**
*
* @returns 返回bgm静音状态
*/
getMusicMute() {
return this._music_muted
}
/**
*
* @returns 返回sound音效静音状态
*/
getSoundMute() {
return this._sound_muted
}
/**
*
* @returns 返回bgm声音大小
*/
getMusicVolume() {
return this._music_volume
}
/**
*
* @returns 返回sound音效声音大小
*/
getSoundVolume() {
return this._sound_volume
}
}
Dictionary请查看另外一篇文章CocosCreator Dictionary_小张不爱写代码的博客-CSDN博客
原文地址:https://blog.csdn.net/qq_41973169/article/details/130195615
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.7code.cn/show_35660.html
如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除!
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。