您的位置:首页 > 移动开发 > 微信开发

使用3.0实现微信打飞机——13.添加声音

2014-08-21 15:37 471 查看
一款好的游戏没有声音怎么可以呢,所以一定要为我们的飞机添加上声音,这样玩起来才有玩头嘛!今天试一下3.0的声音引擎,发现播放声音的时候总是有延迟的现象发生,但是在初始化的时候是预先加载了声音的,跟进预先加载背景音乐的函数一看是空的实现,但是音效的预先加载并不是空的实现,在win32上测试的时候虽然预先加载了声音但是播放延迟的问题是没法解决的,最后游戏添加了声音在win32下变的有点卡(在游戏主场景中有点卡)。但是移植到android平台的时候一切正常,背景音乐和音效的播放没有出现延迟的问题,游戏也很流畅,所以,我觉得引擎在win32平台下对声音的处理不是很好,或许是我的方法有错,大家看看代码吧,如果你有什么发现就留言吧。

1
#ifndef _SOUND_H_
2
#define _SOUND_H_
3
#include "cocos2d.h"
4
//声音引擎
5
#include "SimpleAudioEngine.h"
6
7
USING_NS_CC;
8
using
namespace
CocosDenshion;
9
10
//把用到的音乐做为枚举类型
11
enum
MUSIC_TYPE
12
{
13
//游戏的背景音乐 game_music.mp3
14
MUSIC_TYPE_BACKGROUND,
15
//最大的敌机飞行时候的背景音乐 big_spaceship_flying.mp3
16
MUSIC_TYPE_BIG_SPACESHIP_FLYING,
17
};
18
19
//把用到的音乐做为枚举类型
20
enum
EFFECT_TYPE
21
{
22
//单击菜单按钮时候的音效 button.mp3
23
EFFECT_TYPE_BUTTON,
24
//发射子弹时候的音效 bullet.mp3
25
EFFECT_TYPE_BULLET,
26
//敌机炸毁的音效 enemy1_down.mp3 enemy2_down.mp3 enemy3_down.mp3
27
EFFECT_TYPE_ENEMY1_DOWN,
28
EFFECT_TYPE_ENEMY2_DOWN,
29
EFFECT_TYPE_ENEMY3_DOWN,
30
//游戏结束 game_over.mp3
31
EFFECT_TYPE_GAME_OVER,
32
//获得UFO道具 get_double_laser.mp3
33
EFFECT_TYPE_GET_UFO,
34
//道具出来时候的音效 out_porp.mp3
35
EFFECT_TYPE_OUT_PORP
36
};
37
38
//声音处理类
39
class
Sound
40
{
41
public
:
42
static
Sound * getInstance();
43
static
void

freeInstance();
44
private
:
45
static
Sound * m_sound;
46
Sound();
47
//根据不同的音乐和音效类型获得相应平台下的文件
48
char
* getMusic(MUSIC_TYPE type);
49
char
* getEffect(EFFECT_TYPE type);
50
public
:
51
//声音的播放和停止
52
void
playEffect(EFFECT_TYPE type);
53
void
playBgMusic(MUSIC_TYPE type);
54
};
55
56
#endif
1
#include "Sound.h"
2
3
Sound * Sound::m_sound = NULL;
4
5
Sound * Sound::getInstance()
6
{
7
if
(m_sound == NULL)
8
{
9
m_sound =
new

Sound();
10
}
11
12
return
m_sound;
13
}
14
15
void
Sound::freeInstance()
16
{
17
if
(m_sound != NULL)
18
{
19
delete
m_sound;
20
m_sound = NULL;
21
}
22
}
23
24
Sound::Sound()
25
{
26
//预先加载声音,参数是声音文件
27
auto audio = SimpleAudioEngine::getInstance();
28
//预先加载音乐的函数在win32下是空的实现 播放的效果是滞后的 在android上没有问题
29
audio->preloadBackgroundMusic(getMusic(MUSIC_TYPE_BACKGROUND));
30
audio->preloadBackgroundMusic(getMusic(MUSIC_TYPE_BIG_SPACESHIP_FLYING));
31
//加载音效 在win32下加载音效没有什么效果,播放出来是滞后的,但是在android上没有滞后的问题
32
audio->preloadEffect(getEffect(EFFECT_TYPE_BULLET));
33
audio->preloadEffect(getEffect(EFFECT_TYPE_BUTTON));
34
audio->preloadEffect(getEffect(EFFECT_TYPE_ENEMY1_DOWN));
35
audio->preloadEffect(getEffect(EFFECT_TYPE_ENEMY2_DOWN));
36
audio->preloadEffect(getEffect(EFFECT_TYPE_ENEMY3_DOWN));
37
audio->preloadEffect(getEffect(EFFECT_TYPE_GAME_OVER));
38
audio->preloadEffect(getEffect(EFFECT_TYPE_GET_UFO));
39
audio->preloadEffect(getEffect(EFFECT_TYPE_OUT_PORP));
40
//设置声音的大小0.0-1.0 在win32下也是空的实现
41
audio->setBackgroundMusicVolume(0.5f);
42
}
43
44
//获取音效和音乐的文件
45
char
* Sound::getMusic(MUSIC_TYPE type)
46
{
47
switch
(type)
48
{
49
case
MUSIC_TYPE_BACKGROUND:
50
//获取不同平台下的文件
51
#if(CC_TARGET_PLATFORM == CC_PLATFORM_WIN32)
52
return
"sound/game_music.mp3"
;
53
#elif(CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
54
return
"sound/game_music.mp3"
;
55
#endif
56
break
;
57
case
MUSIC_TYPE_BIG_SPACESHIP_FLYING:
58
return
"sound/big_spaceship_flying.mp3"
;
59
break
;
60
}
61
return
NULL;
62
}
63
64
char
* Sound::getEffect(EFFECT_TYPE type)
65
{
66
switch
(type)
67
{
68
case
EFFECT_TYPE_BUTTON:
69
return
"sound/button.mp3"
;
70
break
;
71
case
EFFECT_TYPE_BULLET:
72
return
"sound/bullet.mp3"
;
73
break
;
74
case
EFFECT_TYPE_ENEMY1_DOWN:
75
return
"sound/enemy1_down.mp3"
;
76
break
;
77
case
EFFECT_TYPE_ENEMY2_DOWN:
78
return
"sound/enemy2_down.mp3"
;
79
break
;
80
case
EFFECT_TYPE_ENEMY3_DOWN:
81
return
"sound/enemy3_down.mp3"
;
82
break
;
83
case
EFFECT_TYPE_GAME_OVER:
84
return
"sound/game_over.mp3"
;
85
break
;
86
case
EFFECT_TYPE_GET_UFO:
87
return
"sound/get_double_laser.mp3"
;
88
break
;
89
case
EFFECT_TYPE_OUT_PORP:
90
return
"sound/out_porp.mp3"
;
91
break
;
92
default
:
93
return
NULL;
94
}
95
}
96
97
//播放音乐和音效
98
void
Sound::playEffect(EFFECT_TYPE type)
99
{
100
auto audio = SimpleAudioEngine::getInstance();
101
audio->playEffect(
this
->getEffect(type));
102
}
103
104
void
Sound::playBgMusic(MUSIC_TYPE type)
105
{
106
auto audio = SimpleAudioEngine::getInstance();
107
if
(!audio->isBackgroundMusicPlaying())
108
{
109
audio->playBackgroundMusic(
this
->getMusic(type),
true
);
110
}
111
else
112
{
113
audio->resumeBackgroundMusic();
114
}
115
}
上边就是声音处理的类,在构造函数中先预先加载一些声音文件,通过getEffect和getMusic函数获取不同平台下的声音文件,我都是使用的mp3格式的文件就没有写相关的代码了,获取不同平台下的文件可以参考我getMusic的前几行代码。接下来就是调用了,大家在用到的地方去调用播放声音的函数吧,这里我把暂停处对声音的处理拿出来做一个范例。

1
//对声音的处理 UILayer中暂停按钮按下的时候
2
SimpleAudioEngine::getInstance()->pauseBackgroundMusic();
1
auto sound = Sound::getInstance();
2
auto callback = [& sound](Ref * ref)
3
{
4
sound->playEffect(EFFECT_TYPE_BUTTON);
5
//恢复背景音乐 Pause中恢复场景的时候调用
6
sound->playBgMusic(MUSIC_TYPE_BACKGROUND);
7
//弹出保存的场景
8
Director::getInstance()->popScene();
9
};




版权声明:本文由(
小塔 )原创,转载请保留文章出处!

本文链接:http://www.zaojiahua.com/adding-sound.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐