242 lines
5.2 KiB
JavaScript
242 lines
5.2 KiB
JavaScript
/******************************************************************
|
|
* Copyright(C) 2019 - 2020 Nx Studio
|
|
*
|
|
* NX UI插件 -- 背景音乐
|
|
*
|
|
* 2018.05.18
|
|
******************************************************************/
|
|
|
|
cc.Class( {
|
|
|
|
extends: cc.Component,
|
|
|
|
properties: {
|
|
|
|
bgmRK: {
|
|
default: "",
|
|
displayName: "资源键"
|
|
},
|
|
|
|
isFadeIn: {
|
|
default: true,
|
|
displayName: "渐入"
|
|
},
|
|
|
|
isFadeOut: {
|
|
default: true,
|
|
displayName: "渐出"
|
|
},
|
|
|
|
fadeSecs: {
|
|
default: 0.5,
|
|
displayName: "出入耗时"
|
|
},
|
|
|
|
isMainBGM: {
|
|
default: false,
|
|
displayName: "主组件"
|
|
},
|
|
|
|
restoreLastBGM: {
|
|
default: true,
|
|
displayName: "关闭恢复上次音效"
|
|
},
|
|
|
|
},
|
|
|
|
// 编辑器特性
|
|
editor: {
|
|
|
|
// 允许当前组件在编辑器模式下运行
|
|
executeInEditMode: false,
|
|
|
|
// requireComponent 参数用来指定当前组件的依赖组件
|
|
requireComponent: null,
|
|
|
|
// 当本组件添加到节点上后,禁止同类型(含子类)的组件再添加到同一个节点,防止逻辑发生冲突
|
|
disallowMultiple: true,
|
|
|
|
// menu 用来将当前组件添加到组件菜单中,方便用户查找
|
|
menu: "扩充/audio.bgm 背景音乐",
|
|
|
|
},
|
|
|
|
// 初始化
|
|
onEnable: function() {
|
|
|
|
// 重置
|
|
this.reset();
|
|
|
|
// 激活
|
|
this.reActive();
|
|
|
|
// 关闭所有当前音效
|
|
nx.audio.stopSFXAll();
|
|
|
|
// 主组件
|
|
if( this.isMainBGM ) {
|
|
nx.bridge.cbgms = nx.bridge.cbgms || [];
|
|
nx.bridge.cbgms.push( this );
|
|
}
|
|
|
|
},
|
|
|
|
// 隐藏
|
|
onDisable: function() {
|
|
|
|
// 重置
|
|
this.reset();
|
|
|
|
// 主组件
|
|
if( this.isMainBGM ) {
|
|
nx.dt.arrDelete( nx.bridge.cbgms, ( _tm ) => {
|
|
return _tm == this;
|
|
} );
|
|
}
|
|
|
|
// 恢复
|
|
if( this.restoreLastBGM ) {
|
|
if( nx.dt.arrNEmpty( nx.bridge.cbgms ) ) {
|
|
let bgm = nx.bridge.cbgms[ nx.bridge.cbgms.length - 1 ];
|
|
if( bgm ) {
|
|
bgm.reActive();
|
|
}
|
|
} else {
|
|
nx.audio.stopBGM();
|
|
}
|
|
}
|
|
|
|
},
|
|
|
|
// 重置
|
|
reset: function() {
|
|
this.loading = false;
|
|
this.fading = 0;
|
|
this.bgmKey = "";
|
|
},
|
|
|
|
// 激活
|
|
reActive: function() {
|
|
|
|
// 无效
|
|
if( nx.dt.strEmpty( this.bgmRK ) ) {
|
|
return;
|
|
}
|
|
|
|
// 进行中
|
|
if( this.loading || this.fading != 0 ) {
|
|
nx.error( "[BGM]激活失败,进行中!" );
|
|
return;
|
|
}
|
|
|
|
this.loading = true;
|
|
this.fading = 0;
|
|
|
|
// 预载入音乐
|
|
let self = this;
|
|
nx.res.loadAudio( this.bgmRK, ( _error, _params ) => {
|
|
|
|
self.loading = false;
|
|
|
|
// 淡出
|
|
if( !_error ) {
|
|
self.musicClip = _params;
|
|
self.fadeOut();
|
|
}
|
|
|
|
} );
|
|
|
|
},
|
|
|
|
// 淡出原有音乐
|
|
fadeOut: function() {
|
|
|
|
let vol = nx.audio.getBGMVolume();
|
|
this.rawVol = vol;
|
|
this.curVol = vol;
|
|
this.vps = 1 / this.fadeSecs;
|
|
// this.bgmKey = this.musicClip;
|
|
|
|
//没有当前数据
|
|
if( !this.musicClip ) {
|
|
nx.error( "[BGM]播放失败,没有相关音频!", this.bgmRK );
|
|
}
|
|
|
|
// 没有当前音乐
|
|
if( nx.dt.strEmpty( nx.audio.bgmRes ) ) {
|
|
this.fadeIn();
|
|
return;
|
|
}
|
|
|
|
// 未开启/当前音量为0
|
|
if( !this.isFadeOut || vol <= 0 ) {
|
|
this.fadeIn();
|
|
return;
|
|
}
|
|
|
|
// 淡出
|
|
this.fading = 1;
|
|
|
|
},
|
|
|
|
// 淡入新音乐
|
|
fadeIn: function() {
|
|
|
|
// 关闭当前
|
|
nx.audio.stopBGM();
|
|
|
|
// 播放新的
|
|
this.bgmKey = nx.audio.playBGM( this.musicClip );
|
|
|
|
// 未开启/目前音量为0
|
|
if( !this.isFadeOut || this.rawVol <= 0 ) {
|
|
this.fading = 0;
|
|
nx.audio.setBGMVolume( this.rawVol, true );
|
|
return;
|
|
}
|
|
|
|
// 淡入
|
|
this.fading = 2;
|
|
this.curVol = 0;
|
|
|
|
},
|
|
|
|
// 更新
|
|
update: function( _dt ) {
|
|
|
|
// 未开启
|
|
if( this.fading != 1 &&
|
|
this.fading != 2 ) {
|
|
return;
|
|
}
|
|
|
|
// 音乐已改变
|
|
// if( this.bgmKey != this.lastBgmKey ) {
|
|
// this.reset();
|
|
// return;
|
|
// }
|
|
|
|
// 淡出
|
|
if( this.fading == 1 ) {
|
|
this.curVol = Math.max( 0, this.curVol - ( this.vps * _dt ) );
|
|
nx.audio.setBGMVolume( this.curVol, true );
|
|
if( this.curVol <= 0 ) {
|
|
this.fadeIn();
|
|
return;
|
|
}
|
|
}
|
|
|
|
// 淡入
|
|
if( this.fading == 2 ) {
|
|
this.curVol = Math.min( this.rawVol, this.curVol + ( this.vps * _dt ) );
|
|
nx.audio.setBGMVolume( this.curVol, true );
|
|
if( this.curVol >= this.rawVol ) {
|
|
this.fading = 0;
|
|
return;
|
|
}
|
|
}
|
|
|
|
},
|
|
|
|
} );
|