关于音效播放与停止的问题,有些奇怪望解答

var PlayEffect=function(effect){
cc.audioEngine.stopAllEffects();
cc.audioEngine.playEffect(effect);
};
单独创建了一个播放音效的函数,通过传入地址播放音效,在播放前先将所有音效都停止。
但这样使用后发现——当前音效正在播放时触发此函数,会执行stopAllEffects()停止所有音效,但并未执行playEffect()播放新音效,第二次再次点击后才会播放新音效。但如果是之前音效播放完毕的情况下会正常执行。
之后修改为使用变量接收音效并指定停止,依然会发生这种情况:
var onlyoneeffect=null;
var PlayEffect=function(effect){
if(onlyoneeffect){
cc.audioEngine.stopEffects(onlyoneeffect);
onlyoneeffect=null;
}
onlyoneeffect=cc.audioEngine.playEffect(effect);
};
这样写依然无法解决问题
该如何解决呢?

stop跟play之间加个几毫秒的延迟试试?

我该如何加呢?用callfunc把两步包起来中间加delaytime再sequence?

我使用getRunningScene得到场景来运行sequence,成功了
但是不太明白这种错误的原因?是因为stop并非即时停止而是需要在每一帧完成后执行吗?而事实上新的音频实际已经播放但是stop在帧结束执行时同时结束了老的音效和新的音效?

具体啥原理我也不知道= =反正一看到这个问题我脑中突然就蹦出了这个猜测……

另外,提一句不重要的,延时也可以直接用node的scheduleOnce()方法,参数里有个延迟时间。

好的非常感谢!

弱弱的问题下,你是在 IOS 上尝试 web 平台么?

IOS 上音频如果没有预加载,第一次点击会触发加载,但是,这时候音频是不可用的状态,所以播放不了,第二次点击屏幕的时候才能狗播放。

为什么要等到第二次点击屏幕呢,这是因为 IOS 上不允许代码绕过用户直接播放音频,也就是说,用户只要没有操做,代码是播不出声音的,只有用户点击触发事件,在这个事件里面才能播放声音~~