最新文章
Cocos2d-x游戏开发实例详解7:对象释放时机
03-25 13:59
Cocos2d-x游戏开发实例详解6:自动释放池
03-25 13:55
Cocos2d-x游戏开发实例详解5:神奇的自动释放
03-25 13:49
Cocos2d-x游戏开发实例详解4:游戏主循环
03-25 13:44
Cocos2d-x游戏开发实例详解3:无限滚动地图
03-25 13:37
Cocos2d-x游戏开发实例详解2:开始菜单续
03-25 13:32
cocos2dx 关闭音效
很多人不知道在 Cocos2d-x 中如何操作关闭音效,下面将通过实例进行详细演示。
1. 使用声音引擎
Cocos2d-x 自带了 CocosDension 库,可用于实现声音引擎。该库提供了简单易用的 SimpleAudioEngine 类,若要使用它,只需引入其头文件:
#include "SimpleAudioEngine.h"
using namespace CocosDenshion;
2. 支持平台与格式
音乐格式支持情况
| 平台 | 支持的常见文件格式 | 备注 |
|---|---|---|
| Android | mp3, mid, ogg, wav | 可以播放 android.media.MediaPlayer 所支持的所有格式 |
| iOS | aac, caf, mp3, wav | 可以播放 AVAudioPlayer 所支持的所有格式 |
| Windows | mid, mp3, wav | 无 |
音效格式支持情况
| 平台 | 支持的常见文件格式 | 备注 |
|---|---|---|
| Android | ogg, wav | 对 wav 的支持不完美 |
| iOS | caf, m4a | 可以播放 Cocos2d-iphone、CocosDesion 所支持的所有格式 |
| Windows | mid, 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;
}
运行效果
当进入这个场景之后就会听见音乐,当鼠标点击的时候声音停止。