cocos creator播放声音

使用AudioSource组件怎么在所有场景中播放同一个声音文件?
现在我的问题是一切换场景,声音就不播放了,要每个场景中都添加一个AudioSource组件吗?

所有内容都放在一个场景的话可以解决这个问题,但是后期维护会很乱,场景节点太多了,加载场景时估计也会很慢,有其他办法可用吗? @panda @jare @zilong

可以使用常驻节点,文档传送门: https://docs.cocos.com/creator/manual/zh/scripting/scene-managing.html?q=

cc.Class({
extends: cc.Component,
properties: {
audioPlayer: {
default: null,
type: cc.AudioSource
},
musicFrame: {
default: null,
type: cc.SpriteAtlas
},
btnPlayAudio: {
default: null,
type: cc.Node
},
audioNode: {
default: null,
type: cc.Node
}
},
// use this for initialization
onLoad: function () {
cc.game.addPersistRootNode(this.audioNode);
this.btnPlayAudio.on(“touchstart”, this.playAudio, this);
this.autoAudioPlay();
},
playAudio: function () {
var btnSprite = this.btnPlayAudio.getComponent(cc.Sprite);
cc.log(this.audioPlayer.isPlaying)
if (this.audioPlayer.isPlaying) {
cc.log(“暂停播放”)
var frameStop = this.musicFrame.getSpriteFrame(‘musicstop’);
btnSprite.spriteFrame = frameStop;
this.audioPlayer.pause();
} else {
cc.log(“继续播放”)
var framePlay = this.musicFrame.getSpriteFrame(‘music’);
btnSprite.spriteFrame = framePlay;
this.audioPlayer.resume();
}
}, autoAudioPlay: function () {
if (!this.audioPlayer.isPlaying) {
this.audioPlayer.play();
cc.log(“开始播放”);
}
}, onDestroy: function () {
this.btnPlayAudio.off(“touchstart”, this.playAudio, this);
}
})
;

常驻节点要求AudioSource节点在根点上,我写的playAudio不能控制继续播放和暂停播放了,请帮忙看看!

@Knox 再帮忙看看是什么问题,谢谢.

你先自己调试一下有没有触发 play 跟 stop 的函数,还有你代码排版写好点,这样看起来真的很怪

例如这样:如果是代码用 ···js + ···

cc.Class({
    extends: cc.Component,
    properties: {
        audioPlayer: {
            default: null,
            type: cc.AudioSource
        },
        musicFrame: {
            default: null,
            type: cc.SpriteAtlas
        },
        btnPlayAudio: {
            default: null,
            type: cc.Node
        },
        audioNode: {
            default: null,
            type: cc.Node
        }
    },
    // use this for initialization
    onLoad: function () {
        cc.game.addPersistRootNode(this.audioNode);
        this.btnPlayAudio.on("touchstart", this.playAudio, this);
        this.autoAudioPlay();
    },
    playAudio: function () {
        var btnSprite = this.btnPlayAudio.getComponent(cc.Sprite);
        cc.log(this.audioPlayer.isPlaying)
        if (this.audioPlayer.isPlaying) {
            cc.log("暂停播放")
            var frameStop = this.musicFrame.getSpriteFrame('musicstop');
            btnSprite.spriteFrame = frameStop;
            this.audioPlayer.pause();
        }
        else {
            cc.log("继续播放")
            var framePlay = this.musicFrame.getSpriteFrame('music');
            btnSprite.spriteFrame = framePlay;
            this.audioPlayer.resume();
        }
    },
    autoAudioPlay: function () {
        if (!this.audioPlayer.isPlaying) {
            this.audioPlayer.play();
            cc.log("开始播放");
        }
    },
    onDestroy: function () {
        this.btnPlayAudio.off("touchstart", this.playAudio, this);
    }
});

我还是上图吧,这样看起来舒服些;
我再描述一下问,目前节点可以常驻成功,新场景也可以听到背景音乐,但是playAudio这个方法里this.audioPlayer.isPlaying的值一直为false,autoAudioPlay方法已经正常播放声音了,为什么isPlaying还是为false呢?
现在的问题是我不能暂停背景音乐,playAudio方法是可以触发的
@Knox

我测试了一下 isPlaying 是正常的

未播放时:

播放中:

AudioSource 和AudioEngine 哪一个适合用来做背景音乐?
这份代码我是调不好了,心累,有人说AudioEngine 这个来做背景音乐,不用常驻节点也可以?

1赞

可以结贴了,我用AudioEngine 做好了

if (GM.soundClickUrl == null){
cc.loader.loadRes(“audio/Common_Panel_Dialog_Pop_Sound”, cc.AudioClip, function (err, clip) {
cc.audioEngine.playEffect(clip, false);
GM.soundClickUrl = clip
});
} else {
cc.audioEngine.playEffect(GM.soundClickUrl, false);
}

为什么文档传送门点进去直接是官网首页?