在处理游戏背景音乐中遇到的问题,策划对于音乐播放提出新的想法。但由于目前周围没有人尝试过,所以自己摸索的来。
一般同一场景是同一首背景音乐。
现需求在同一场景(时代)内播放不同的音乐,在音乐配表中,同一场景加入新的音乐,每个音乐都带有一个cd字段,这个字段代表这首音乐播放剩余cd秒时,播放下一首音乐。相应的音乐资源会做淡入淡出处理。
解决:做一个一直存在的定时器,用一个变量curAudio存当前音乐的path,用一个变量lastAudio存上一首音乐的path,获取到音乐资源的时长,在定时器内检测是否到达cd时间段,如在play下一首,cd完stop上一首,同时curAudio存当前音乐。
id = cc.audioEngine.play(audio, loop, volume); //参数为:音乐,循环,音量
curAudio = audio;
cc.audioEngine.getDuration(id); //获取音频时长
cc.audioEngine.stop(lastAudio); //参数为:指定音乐
lastAudio = curAudio;
一般在场景切换时上一首音乐立马结束,紧接着播放下一首音乐。
cc.audioEngine.stopAll();
cc.audioEngine.play(audio, loop, volume);
现需求在场景切换时,音乐也需要切换到这个场景对应的音乐,这时候要考虑到切换场景时音乐的衔接。
问题1:两个场景切换时上一个音乐的刚开始播放,下一场景音乐如何出现。
解决:上一场景音乐加入淡出效果(设有一个cd),下一场景音乐紧接着淡入进来(设有一个cd)。
问题2:两个场景切换时上一个音乐的播放到末尾已经资源上淡出再加上淡出,体验上会不会奇怪。
解决:暂时以增加手动淡出时长来维护。
table = this[this.TABLE.AGEBGM];
this[this.TABLE.AGEBGM + this.EXFLAG] = {};
for(i = 0; i < table.length; i++) {
item = table[i];
this[this.TABLE.AGEBGM + this.EXFLAG][item.age] = item;
}
jsonTables.getEpochBgmTable = function (tid ) {
var item = this[this.TABLE.AGEBGM + this.EXFLAG][tid];
var bgm = new Array();
if (item != null) {
bgm[0] = tid;
for (var j = 1; item["bgm_" + j] != null && item["cd_" + j] != null; j++){
var tmp = new Array();
tmp["bgm"] = item["bgm_" + j];
tmp["cd"] = item["cd_" + j];
bgm[j] = tmp;
}
}
if (bgm != null){
return bgm;
}
return "";
};
jsonTables.getEpochBgm = function (tid) {
if (this.epochBgm == null || this.epochBgm[0] !== tid){
this.epochBgm = this.getEpochBgmTable(tid);
}
return this.epochBgm;
};
playBgMusic:function(name,loop){
var audio = this.audios[name];
if(!audio) return;
this.bgAudioID = cc.audioEngine.play(audio, loop, this.bgVolume);
}
initBgm:function(epochId) {
cc.audioEngine.stopAll();
this.bgmTable = jsonTables.getEpochBgm(epochId);
this.lastBgmId = null;
this.lastTime = null;
this.bgmIndex = 1;
this.lastCD = 0;
this.schedule(function () {
this.playBgm()
}, 0.1)
}
playBgm:function() {
if(this.lastBgmId == null){
this.playBgmByIndex();
}else if (this.bgmTable.length > 2) {
var time = cc.audioEngine.getCurrentTime(this.lastBgmId);
if ( this.lastTime - time <= this.lastCD){
this.playBgmByIndex();
}
}
}
playBgmByIndex: function ( ) {
if (this.bgmTable == null){return;}
if(this.bgmIndex >= this.bgmTable.length){
this.bgmIndex = 1;
}
if (this.bgmTable.length === 2) {
this.playBgMusic(this.bgmTable[this.bgmIndex].bgm, true);
}else if (this.bgmTable.length > 2) {
this.playBgMusic(this.bgmTable[this.bgmIndex].bgm, false);
}else{
return;
}
this.lastBgmId = this.bgAudioID;
this.lastCD = this.bgmTable[this.bgmIndex].cd;
this.bgmIndex += 1;
this.lastTime = cc.audioEngine.getDuration(this.lastBgmId);
},
changEpoch: function (epochId) {
this.bgmTable = jsonTables.getEpochBgm(epochId);
var lastBgmIdTmp = this.lastBgmId
var lastVolume = 1;
var curVolume = 0;
this.lastBgmId = null;
this.bgmIndex = 1;
this.schedule(function () {
var lastBgmState = cc.audioEngine.getState(lastBgmIdTmp);
var curBgmState = cc.audioEngine.getState(this.lastBgmId);
if (lastBgmState && lastVolume >= 0) {
lastVolume -= 0.2;
cc.audioEngine.setVolume(lastBgmIdTmp, lastVolume);
}
if(curBgmState && curVolume <= 1){
curVolume += 0.2;
cc.audioEngine.setVolume(this.lastBgmId, curVolume);
}
}, 1, 5, 0.1)
},
最后发现creator audioEngine提供了所需要的基本的API。
点击查看audioEngine API