cocos2dx3.0声音的使用
下面将详细介绍如何在 Cocos2d-x 3.0 中使用声音。
1. 新建工程
首先,新建一个 Cocos2d-x 工程。若不清楚如何创建工程,可自行查找相关的创建教程。
2. 包含头文件与命名空间
Cocos2d-x 为音乐、音效等单独创建了一个类,使用时直接包含头文件 SimpleAudioEngine.h 即可。不过,仅添加该头文件还不够,在调用相关函数时,需要添加 CocosDenshion 命名空间。有两种方式可以实现:
方式一:使用 using 语句
using namespace CocosDenshion;
方式二:在每个 SimpleAudioEngine 前面添加命名空间
CocosDenshion::SimpleAudioEngine::sharedEngine()->...
3. SimpleAudioEngine 类的成员函数
3.1 背景音乐相关函数
以下是一些常用的背景音乐操作函数:
// 预加载背景音乐
SimpleAudioEngine::sharedEngine()->preloadBackgroundMusic("music/xxxx.mp3");
// 开始播放背景音乐,true 表示循环播放
SimpleAudioEngine::sharedEngine()->playBackgroundMusic("music/xxxx.mp3", true);
// 停止背景音乐,这是一个缺省参数函数,传参表示是否释放音乐文件
SimpleAudioEngine::sharedEngine()->stopBackgroundMusic();
// 暂停背景音乐
SimpleAudioEngine::sharedEngine()->pauseBackgroundMusic();
// 从头播放背景音乐
SimpleAudioEngine::sharedEngine()->rewindBackgroundMusic();
// 返回布尔型参数,表示是否正在播放背景音乐
bool isPlaying = SimpleAudioEngine::sharedEngine()->isBackgroundMusicPlaying();
// 设置音量,范围为 0.0 - 1.0
SimpleAudioEngine::sharedEngine()->setBackgroundMusicVolume(0.5);
3.2 音效相关函数
以下是一些常用的音效操作函数:
// 预加载音效
SimpleAudioEngine::sharedEngine()->preloadEffect("music/xxxx.mp3");
// 开始播放音效,false 表示不循环
unsigned int soundId = SimpleAudioEngine::sharedEngine()->playEffect("music/xxxx.mp3", false);
// 停止指定音效,这个值是由 playEffect 返回的
SimpleAudioEngine::sharedEngine()->stopEffect(soundId);
// 停止全部音效
SimpleAudioEngine::sharedEngine()->stopAllEffects();
// 暂停单个音效
SimpleAudioEngine::sharedEngine()->pauseEffect(soundId);
// 重新开始单个音效
SimpleAudioEngine::sharedEngine()->resumeEffect(soundId);
// 暂停全部音效
SimpleAudioEngine::sharedEngine()->pauseAllEffects();
// 重新开始全部音效
SimpleAudioEngine::sharedEngine()->resumeAllEffects();
// 设置音效音量,范围为 0.0 - 1.0
SimpleAudioEngine::sharedEngine()->setEffectsVolume(0.5);
// 卸载音效
SimpleAudioEngine::sharedEngine()->unloadEffect("music/xxxx.mp3");
如果想了解更多详细信息,可以查看相关的 API 文档。
4. 添加按钮控制声音
4.1 开关按钮
添加一个开关按钮用于控制背景音乐的开关。以下是开关按钮的定义代码:
// 添加声音的开关按钮
MenuItemImage *_turnOn, *_turnOff;
_turnOn = MenuItemImage::create(
"button_voi_on.png",
"button_voi_on.png");
_turnOff = MenuItemImage::create(
"button_voi_off.png",
"button_voi_off.png");
MenuItemToggle *toggleItem = MenuItemToggle::createWithCallback(CC_CALLBACK_1(HelloWorld::menuMusicCallback, this), _turnOn, _turnOff, NULL);
toggleItem->setScale(0.3f);
toggleItem->setPosition(Point(visibleSize.width / 3, visibleSize.height / 2));
这里定义了两个按钮,分别对应常规显示和点击时的显示。由于是开关按钮,使用 MenuItemToggle 进行关联。同时,别忘了在 .h 文件中声明回调函数。
4.2 音效按钮
添加一个小蘑菇按钮用于播放音效,这里选择经典的超级玛丽音乐作为背景音乐,吃生命蘑菇的音效作为音效,按钮图片使用大绿蘑菇。以下是添加小蘑菇按钮的代码:
// 添加小蘑菇按钮
auto moguItem = MenuItemImage::create(
"mogu_1.png",
"mogu_2.png",
CC_CALLBACK_1(HelloWorld::menuMoguCallback, this));
moguItem->setPosition(Point(visibleSize.width * 2 / 3, visibleSize.height / 2));
5. 预加载与初始化
在使用声音之前,建议预加载背景音乐和音效,以避免后续出现卡顿或加载缓慢的问题。不过,如果内容较少,也可以不进行预加载。
// 预加载背景音乐和音效
SimpleAudioEngine::sharedEngine()->preloadBackgroundMusic("music/back_music.mp3");
SimpleAudioEngine::sharedEngine()->preloadEffect("music/eat_mogu.mp3");
在 init 函数中,先默认播放背景音乐,并定义一个 bool 类型的变量 isPause 用于判断背景音乐是否暂停:
// 先默认播放背景音乐
SimpleAudioEngine::sharedEngine()->playBackgroundMusic("music/back_music.mp3", true);
// bool 类型,判断背景音乐是否暂停
bool isPause = false;
这里的 isPause 变量需要在头文件中进行定义。
6. 回调函数实现
以下是两个按钮的回调函数实现:
void HelloWorld::menuMusicCallback(cocos2d::Ref* pSender) {
if (isPause == false) {
SimpleAudioEngine::sharedEngine()->pauseBackgroundMusic();
isPause = true;
} else {
SimpleAudioEngine::sharedEngine()->resumeBackgroundMusic();
isPause = false;
}
}
void HelloWorld::menuMoguCallback(cocos2d::Ref* pSender) {
SimpleAudioEngine::sharedEngine()->playEffect("music/eat_mogu.mp3");
}
7. 关于 isBackgroundMusicPlaying 函数
SimpleAudioEngine 类中提供了 isBackgroundMusicPlaying 函数用于判断当前背景音乐是否正在播放:
bool isPlaying = SimpleAudioEngine::sharedEngine()->isBackgroundMusicPlaying();
可能有人会疑惑为什么还要设置一个变量(如 isPause)来管理。这是因为在实际开发中,可能会遇到一些特殊情况,直接使用 isBackgroundMusicPlaying 函数可能无法满足某些需求。例如,在某些复杂的逻辑中,我们需要更灵活地控制音乐的状态,设置一个变量可以更方便地进行状态管理。
本博文使用的素材及代码,会在文章末尾给出。
需要注意的是,在使用上述代码时,要确保相关的图片和音频文件路径正确,并且图片和音频文件确实存在于相应的目录中。