在游戏开发过程中,背景音乐和音效的设置总是绕不过的,今天就来带大家实现一个简单的背景音乐和音效的设置逻辑。
1.首先将音乐资源和图片资源都导入到工程中(公众号后台回复「AudioTest」可获得完整工程,图片和音乐资源来自关东升老师《Cocos2d-x实战》,侵删。):
2.创建 MainScene,添加三个 Button 组件并摆放到合适位置:
3.创建 SettingScene,添加两个 Toggle 组件和一个 Button 组件并摆放到合适位置(背景音乐和音效开关为 Toggle 组件,返回按钮为 Button 组件):
4.场景创建完后就可以编辑脚本了,MainScene.js 和 SettingScene.js 脚本分别如下:
1 // MainScene.js
2
3 cc.Class({
4 extends: cc.Component,
5
6 properties: {
7 music: {
8 default: null,
9 type: cc.AudioClip
10 },
11
12 sound: {
13 default: null,
14 type: cc.AudioClip
15 }
16 },
17
18 // LIFE-CYCLE CALLBACKS:
19
20 onLoad() {
21 this.initAudioState();
22 this.playMusic();
23
24 // 设置按钮回调函数
25 this.node.getChildByName("bt_startGame").on(cc.Node.EventType.TOUCH_START, this.cb_startGame, this);
26 this.node.getChildByName("bt_setting").on(cc.Node.EventType.TOUCH_START, this.cb_setting, this);
27 this.node.getChildByName("bt_help").on(cc.Node.EventType.TOUCH_START, this.cb_help, this);
28 },
29
30 start() {
31
32 },
33
34 // update (dt) {},
35
36 // 开始游戏 CallBack
37 cb_startGame(button) {
38 this.playSound();
39 console.log("startGame");
40 },
41
42 // 帮助 CallBack
43 cb_help() {
44 this.playSound();
45 console.log("help");
46 },
47
48 // 设置 CallBack
49 cb_setting() {
50 this.playSound();
51 cc.director.loadScene("SettingScene");
52 },
53
54 // 初始化音乐、音效状态
55 initAudioState(){
56 if (!(cc.sys.localStorage.getItem("IS_SOUND"))) {
57 cc.sys.localStorage.setItem("IS_SOUND", false);
58 }
59
60 if (!(cc.sys.localStorage.getItem("IS_MUSIC"))) {
61 cc.sys.localStorage.setItem("IS_MUSIC", false);
62 }
63 },
64
65 // 播放音效
66 playSound() {
67 if (cc.sys.localStorage.getItem("IS_SOUND") == "true") {
68 var sound = cc.audioEngine.playEffect(this.sound, false);
69 }
70 },
71
72 // 播放音乐
73 playMusic() {
74 if (cc.sys.localStorage.getItem("IS_MUSIC") == "true") {
75 var music = cc.audioEngine.playMusic(this.music, false);
76 }
77 },
78 });
1 // SettingScene.js
2
3 cc.Class({
4 extends: cc.Component,
5
6 properties: {
7 isPlayMusic: true, // 是否播放音乐
8 isPlaySound: true, // 是否播放音效
9
10 music: {
11 default: null,
12 type: cc.AudioClip
13 },
14
15 sound: {
16 default: null,
17 type: cc.AudioClip
18 }
19 },
20
21 // LIFE-CYCLE CALLBACKS:
22
23 onLoad() {
24 var soundNode = this.node.getChildByName("toggle_sound");
25 var musicNode = this.node.getChildByName("toggle_music");
26 var OKNode = this.node.getChildByName("bt_OK");
27
28 // 设置音乐、音效状态
29 this.isPlaySound = cc.sys.localStorage.getItem("IS_SOUND");
30 this.isPlayMusic = cc.sys.localStorage.getItem("IS_MUSIC");
31
32 soundNode.getComponent(cc.Toggle).isChecked = this.stringToBoolean(this.isPlaySound);
33 musicNode.getComponent(cc.Toggle).isChecked = this.stringToBoolean(this.isPlayMusic);
34
35 // 设置按钮回调函数
36 soundNode.on(\'toggle\', this.cb_sound, this);
37 musicNode.on(\'toggle\', this.cb_music, this);
38 OKNode.on(cc.Node.EventType.TOUCH_START, this.cb_ok, this);
39 },
40
41 start() {
42
43 },
44
45 // 音效 callback
46 cb_sound(toggle) {
47 console.log("cb_sound");
48
49 this.playSound();
50
51 if (toggle.isChecked) {
52 cc.sys.localStorage.setItem("IS_SOUND", true);
53
54 } else {
55 cc.sys.localStorage.setItem("IS_SOUND", false);
56 }
57 },
58
59 // 音乐 callback
60 cb_music(toggle) {
61 console.log("cb_music");
62
63 this.playSound();
64
65 if (toggle.isChecked) {
66 cc.sys.localStorage.setItem("IS_MUSIC", true);
67 var music = cc.audioEngine.playMusic(this.music, false);
68
69 } else {
70 cc.sys.localStorage.setItem("IS_MUSIC", false);
71 cc.audioEngine.stopMusic();
72 }
73 },
74
75
76 // 返回 callback
77 cb_ok() {
78 this.playSound();
79
80 cc.director.loadScene("MainScene");
81 },
82
83 // 播放音效
84 playSound() {
85 if (cc.sys.localStorage.getItem("IS_SOUND") == "true") {
86 var sound = cc.audioEngine.playEffect(this.sound, false);
87 }
88 },
89
90 // 播放音乐
91 playMusic() {
92 if (cc.sys.localStorage.getItem("IS_MUSIC") == "true") {
93 var music = cc.audioEngine.playMusic(this.music, false);
94 }
95 },
96
97 // 将字符长转化为 bool 型
98 stringToBoolean(str) {
99 switch (str.toLowerCase()) {
100 case "true": case "yes": case "1": return true;
101 case "false": case "no": case "0": case null: return false;
102 default: return Boolean(str);
103 }
104 }
105
106 // update (dt) {},
107 });
5.编辑好脚本后,分别将对应脚本挂载到对应场景的 Canvas 节点上,并将对应的音乐资源拖到对应位置:
6.资源挂载好后就可以进行预览了,可以发现通过设置已经可以控制背景音乐和音效的开关了,感兴趣的小伙伴赶快公众号后台回复「AudioTest」获取资源试试吧!
我是「Super于」,立志做一个每天都有正反馈的人!