cocos2dx 关闭音效

2015年02月07日 11:08 0 点赞 0 评论 更新于 2025-11-21 14:01

很多人不知道在 Cocos2d-x 中如何操作关闭音效,下面将通过实例进行详细演示。

1. 使用声音引擎

Cocos2d-x 自带了 CocosDension 库,可用于实现声音引擎。该库提供了简单易用的 SimpleAudioEngine 类,若要使用它,只需引入其头文件:

#include "SimpleAudioEngine.h"
using namespace CocosDenshion;

2. 支持平台与格式

音乐格式支持情况

平台支持的常见文件格式备注
Androidmp3, mid, ogg, wav可以播放 android.media.MediaPlayer 所支持的所有格式
iOSaac, caf, mp3, wav可以播放 AVAudioPlayer 所支持的所有格式
Windowsmid, mp3, wav

音效格式支持情况

平台支持的常见文件格式备注
Androidogg, wav对 wav 的支持不完美
iOScaf, m4a可以播放 Cocos2d-iphone、CocosDesion 所支持的所有格式
Windowsmid, wav

3. 预加载

加载音乐和音效通常是一个耗时的过程,为防止因加载产生的延时导致实际播放与游戏播放不协调,在播放音效和音乐前,需要预加载音乐文件。通常在进入场景前调用以下两个方法来预加载文件:

SimpleAudioEngine::sharedEngine()->preloadBackgroundMusic("audio/start.wav");
SimpleAudioEngine::sharedEngine()->preloadEffect("audio/onclick.wav");

4. 播放与停止、暂停和恢复

播放背景音乐

SimpleAudioEngine::sharedEngine()->playBackgroundMusic("audio/start.wav");

播放音效并控制背景音乐的暂停和恢复

bool T19Music::ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent) {
SimpleAudioEngine::sharedEngine()->playEffect("audio/onclick.wav");
static bool flag = true;
if (flag) {
SimpleAudioEngine::sharedEngine()->pauseBackgroundMusic();
// SimpleAudioEngine::sharedEngine()->stopBackgroundMusic();
} else {
SimpleAudioEngine::sharedEngine()->resumeBackgroundMusic();
// SimpleAudioEngine::sharedEngine()->playBackgroundMusic("audio/start.wav");
}
flag = !flag;
return true;
}

5. 其它成员

音量范围为 [0, 1],可通过以下方法设置和获取背景音乐的音量:

// 设置音量大小
SimpleAudioEngine::sharedEngine()->setBackgroundMusicVolume(0.1f);
// 获得音量的大小
SimpleAudioEngine::sharedEngine()->getBackgroundMusicVolume();

6. 进入后台或从后台进入

当应用进入后台或从后台恢复时,需要对音效进行相应的处理:

void AppDelegate::applicationDidEnterBackground() {
CCDirector::sharedDirector()->stopAnimation();
// if you use SimpleAudioEngine, it must be pause
// SimpleAudioEngine::sharedEngine()->pauseBackgroundMusic();
}

// this function will be called when the app is active again
void AppDelegate::applicationWillEnterForeground() {
CCDirector::sharedDirector()->startAnimation();
// if you use SimpleAudioEngine, it must resume here
// SimpleAudioEngine::sharedEngine()->resumeBackgroundMusic();
}

7. 案例说明

T20Music.h

#ifndef __T20Music_H__
#define __T20Music_H__

#include "cocos2d.h"
#include "TBack.h"
USING_NS_CC;

class T20Music : public TBack {
public:
static CCScene * scene();
CREATE_FUNC(T20Music);
bool init();
virtual bool ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent);
};

#endif

T20Music.cpp

#include "T20Music.h"
#include "AppMacros.h"
#include "SimpleAudioEngine.h"
using namespace CocosDenshion;

CCScene *T20Music::scene() {
CCScene *scene = CCScene::create();
T20Music * layer = T20Music::create();
scene->addChild(layer);
return scene;
}

bool T20Music::init() {
TBack::init();
// 预加载音乐
SimpleAudioEngine::sharedEngine()->preloadBackgroundMusic("audio/start.wav");
SimpleAudioEngine::sharedEngine()->preloadEffect("audio/onclick.wav");
SimpleAudioEngine::sharedEngine()->playBackgroundMusic("audio/start.wav");
// 设置触摸可行
setTouchEnabled(true);
setTouchMode(kCCTouchesOneByOne);
return true;
}

// 通过鼠标事件控制声音的显示和消失
bool T20Music::ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent) {
static bool flag = true;
SimpleAudioEngine::sharedEngine()->playEffect("audio/onclick.wav");
if (flag) {
// SimpleAudioEngine::sharedEngine()->playBackgroundMusic("audio/start.wav");
// 暂停播放音乐
SimpleAudioEngine::sharedEngine()->pauseBackgroundMusic();
} else {
// SimpleAudioEngine::sharedEngine()->stopBackgroundMusic("audio/start.wav");
// 重新恢复播放音乐
SimpleAudioEngine::sharedEngine()->resumeBackgroundMusic();
}
flag = !flag;
// 控制音量
SimpleAudioEngine::sharedEngine()->setBackgroundMusicVolume(0.1f);
SimpleAudioEngine::sharedEngine()->stopAllEffects();
SimpleAudioEngine::sharedEngine()->unloadEffect("audio/start.wav");
return false;
}

运行效果

当进入这个场景之后就会听见音乐,当鼠标点击的时候声音停止。