1#ifndef _SOUND_H_
2#define _SOUND_H_
3#include "cocos2d.h"
4//声音引擎
5#include "SimpleAudioEngine.h"
6 
7USING_NS_CC;
8using namespace CocosDenshion;
9 
10//把用到的音乐做为枚举类型
11enum 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//把用到的音乐做为枚举类型
20enum 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//声音处理类
39class Sound
40{
41public:
42    staticSound * getInstance();
43    staticvoidfreeInstance();
44private:
45    staticSound * m_sound;
46    Sound();
47    //根据不同的音乐和音效类型获得相应平台下的文件
48    char* getMusic(MUSIC_TYPE type);
49    char* getEffect(EFFECT_TYPE type);
50public:
51    //声音的播放和停止
52    voidplayEffect(EFFECT_TYPE type);
53    voidplayBgMusic(MUSIC_TYPE type);
54};
55 
56#endif
1#include "Sound.h"
2 
3Sound * Sound::m_sound = NULL;
4 
5Sound * Sound::getInstance()
6{
7    if(m_sound == NULL)
8    {
9        m_sound =newSound();
10    }
11 
12    returnm_sound;
13}
14 
15void Sound::freeInstance()
16{
17    if(m_sound != NULL)
18    {
19        deletem_sound;
20        m_sound = NULL;
21    }
22}
23 
24Sound::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//获取音效和音乐的文件
45char * Sound::getMusic(MUSIC_TYPE type)
46{
47    switch(type)
48    {
49    caseMUSIC_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    caseMUSIC_TYPE_BIG_SPACESHIP_FLYING:
58        return"sound/big_spaceship_flying.mp3";
59        break;
60    }
61    returnNULL;
62}
63 
64char * Sound::getEffect(EFFECT_TYPE type)
65{
66    switch(type)
67    {
68    caseEFFECT_TYPE_BUTTON:
69        return"sound/button.mp3";
70        break;
71    caseEFFECT_TYPE_BULLET:
72        return"sound/bullet.mp3";
73        break;
74    caseEFFECT_TYPE_ENEMY1_DOWN:
75        return"sound/enemy1_down.mp3";
76        break;
77    caseEFFECT_TYPE_ENEMY2_DOWN:
78        return"sound/enemy2_down.mp3";
79        break;
80    caseEFFECT_TYPE_ENEMY3_DOWN:
81        return"sound/enemy3_down.mp3";
82        break;
83    caseEFFECT_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    caseEFFECT_TYPE_OUT_PORP:
90        return"sound/out_porp.mp3";
91        break;
92    default:
93        returnNULL;
94    }
95}
96 
97//播放音乐和音效
98void Sound::playEffect(EFFECT_TYPE type)
99{
100    auto audio = SimpleAudioEngine::getInstance();
101    audio->playEffect(this->getEffect(type));
102}
103 
104void 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();
1auto 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    };

用3.0实现飞机大战——添加声音