0%

CVP认证学习笔记--(何小成)025--音乐和音效

概念

本节课内容是cocos中音乐和音效的使用,游戏中经常会有游戏音乐和游戏音效,并且好的音乐音效也是一款游戏的一个卖点,在cocos中,对音乐和音效做了良好的封装,使用起来只需一两句代码就能实现,本节课介绍了cocos中音乐音效的开始暂停。

API

cocos中的音乐音效处理被封装在了audioEngine中,通过使用audioEngine就可以调用相应的音乐音效API,API文档地址是:http://www.cocos.com/doc/jsdoc/symbols/cc.audioEngine.html

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
// 结束音乐和音效
cc.audioEngine.end()
// 音效音量最大是1.0,最小是0.0
cc.audioEngine.getEffectsVolume()
// 音乐的最大音量是1.0,最小音量是0.0
cc.audioEngine.getMusicVolume()
// 判断音乐是否在播放
cc.audioEngine.isMusicPlaying()
// 暂停播放所有音效
cc.audioEngine.pauseAllEffects()
// 暂停播放音效
cc.audioEngine.pauseEffect()
// 暂停播放音乐
cc.audioEngine.pauseMusic()
// 播放音效
cc.audioEngine.playEffect(url, loop)
// 播放音乐
cc.audioEngine.playMusic(url, loop)
// 重新播放所有音效
cc.audioEngine.resumeAllEffects()
// 重新播放音效
cc.audioEngine.resumeEffect()
// 重新播放音乐
cc.audioEngine.resumeMusic()
// 回放播放的音乐
cc.audioEngine.rewindMusic()
// 设置音效的音量
cc.audioEngine.setEffectsVolume(volume)
// 设置音乐的音量
cc.audioEngine.setMusicVolume(volume)
// 停止播放所有音效
cc.audioEngine.stopAllEffects()
// 停止播放音效
cc.audioEngine.stopEffect()
// 停止播放音乐
cc.audioEngine.stopMusic(releaseData)
// 从内部缓冲区释放预加载的音效
cc.audioEngine.unloadEffect(url)
// 标示背景音乐是否可以播放
cc.audioEngine.willPlayMusic()

作业

本节作业:
本节课作业要求实现点击屏幕播放音效,我进行了扩展,综合前面所学,做了一个打飞机的小demo,由于不是一个完整demo,所有有很多bug也没去处理,其中也实现了游戏中的音乐音效播放。
作业代码实现如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
var soundID=0;
var HelloWorldLayer = cc.Layer.extend({
sprite:null,
music:1,// 0停止,1播放
state:0,//0静止,1攻击
npcs:[],// 敌机数组
bullets:[],// 子弹数组
game:0,// 0进行中,1lose
score:null,// 分数控件
ctor:function () {
//////////////////////////////
// 1. super init first
this._super();
var itemstartbg=new cc.MenuItemFont("🚫",this.callback,this);
itemstartbg.setTag(10);
itemstartbg.setPositionY(cc.winSize.height-itemstartbg.height/2);
itemstartbg.setPositionX(itemstartbg.width/2+20);
var menu=new cc.Menu(itemstartbg);
menu.setPosition(0,0);
this.addChild(menu);

var plane = new cc.Sprite("res/HelloWorld.png");
plane.setPosition(cc.winSize.width/2,80);
plane.setScale(0.5);
this.addChild(plane);
plane.setTag(1);

this.schedule(this.createBullet,0.2);
this.schedule(this.createNpc,0.5);
this.schedule(this.collision);
return true;
},
callback:function(obj)
{// 背景音乐按钮
if(this.music==0){
cc.log("playMusic");
this.music=1;
cc.audioEngine.playMusic("res/bg.mp3",true);//循环播放
obj.setString("🚫");
}else{
cc.log("stopMusic");
this.music=0;
cc.audioEngine.stopMusic();//停止音乐
obj.setString("🎵");
}
},
// 游戏逻辑判断
collision:function(){
if(this.game==1){
cc.audioEngine.stopMusic();
cc.director.runScene(new OverScene());
return;
}
for(var j in this.npcs){
var npc = this.npcs[j];
// 判断游戏是否结束
var plane = this.getChildByTag(1);
if(cc.rectIntersectsRect(npc.getBoundingBox(),plane.getBoundingBox())){
cc.log("over");
this.game=1;
return;
}
for(var i in this.bullets){
var bullet = this.bullets[i];
// 判断是否击中敌机,通过rectIntersectsRect进行矩形碰撞判断
if(cc.rectIntersectsRect(bullet.getBoundingBox(),npc.getBoundingBox())){
cc.log("crash");
bullet.removeFromParent();
this.npcs.splice(j,1);
this.bullets.splice(i,1);
npc.runAction(
cc.sequence(
cc.scaleTo(0.2,0.5),
cc.spawn(
cc.rotateBy(0.5,720),
cc.scaleTo(0.5,0)
),
cc.callFunc(function(npc){
npc.removeFromParent();
},npc)
)
);
return;
}
}
}
},
createNpc:function(){
var plane = new cc.Sprite("res/HelloWorld.png");
var x = Math.round(Math.random()*cc.winSize.width);
plane.setPosition(x,cc.winSize.height+plane.height/2);
plane.setScale(0.2);
this.addChild(plane);
var time = Math.round(Math.sqrt(Math.pow(x-x,2)+Math.pow(0-plane.height/2-cc.winSize.height+plane.height/2,2)))/100;
plane.runAction(
cc.sequence(
cc.moveTo(time,x,0-plane.height/2),
cc.callFunc(function(plane){
plane.removeFromParent();
},plane)
)
);
this.npcs.push(plane);
},
createBullet:function(){
if(this.state==1){
var sp = new cc.Sprite("res/logo.png");
cc.audioEngine.playEffect("res/click.wav");
var x = this.getChildByTag(1).getPositionX();
var y = this.getChildByTag(1).getPositionY()+this.getChildByTag(1).height/2;
sp.setPosition(x,y);
this.addChild(sp);
sp.setScale(0.3);
var time = Math.round(Math.sqrt(Math.pow(x-x,2)+Math.pow(cc.winSize.height+sp.height/2-y,2)))/100;
sp.runAction(
cc.spawn(
cc.rotateBy(time,720).repeatForever(),
cc.sequence(
cc.moveTo(time,x,cc.winSize.height+sp.height/2),
cc.callFunc(function(sp){
sp.removeFromParent();
},sp)
)
)
);
this.bullets.push(sp);
}
},
onEnter:function(){
this._super();
cc.eventManager.addListener({
event:cc.EventListener.TOUCH_ONE_BY_ONE,
swallowTouches:true,
onTouchBegan:this.touchbegan,
onTouchMoved:this.touchMoved,
onTouchEnded:this.touchEnded
},this);
cc.audioEngine.playMusic("res/bg.mp3",true);
return true;
},
touchbegan:function(touch,event){
event.getCurrentTarget().state=1;
var x = touch.getLocationX();
var y = touch.getLocationY();
var plane = event.getCurrentTarget().getChildByTag(1);
var time = Math.round(Math.sqrt(Math.pow(x-plane.getPositionX(),2)+Math.pow(y-plane.getPositionY(),2)))/1000;
plane.stopAllActions();
plane.runAction(cc.moveTo(time,cc.p(x,y)));
return true;
},
touchMoved:function(touch,event){
var x = touch.getLocationX();
var y = touch.getLocationY();
var plane = event.getCurrentTarget().getChildByTag(1);
plane.stopAllActions();
plane.setPosition(x,y);
return true;
},
touchEnded:function(touch,event){
event.getCurrentTarget().state=0;
return true;
}
});

var OverScene = cc.Scene.extend({
onEnter:function () {
this._super();
var overTxt = new cc.LabelTTF("Game Over","",100);
overTxt.setPosition(cc.winSize.width/2,cc.winSize.height/2);
this.addChild(overTxt);
overTxt.runAction(
cc.sequence(cc.scaleTo(0.2,1.2),cc.scaleTo(0.2,0.9),cc.scaleTo(0.2,1))
);
var backMenu = new cc.MenuItemFont("再来一次",function(){
cc.director.runScene(new HelloWorldScene());
},this);
backMenu.setPosition(overTxt.getPositionX(),overTxt.getPositionY()-50-backMenu.height/2);
var menu = new cc.Menu(backMenu);
menu.setPosition(0,0);
this.addChild(menu);
}
});

var HelloWorldScene = cc.Scene.extend({
onEnter:function () {
this._super();
var layer = new HelloWorldLayer();
this.addChild(layer);
}
});

最终效果

http://www.cocoscvp.com/usercode/2016_05_03/066a65bf1bf65dcd589d18a33ad67990822843c1/

大爷赏点儿呗.

欢迎关注我的其它发布渠道