Cocos2d音频系统主要用于播放游戏中的声音文件,由于声音文件的大小可分为音乐和音效两种。其中,音乐一般为游戏中的背景音乐,一般比较长,而音效一般是短暂的声音,比如爆炸的声音等,根据不同的大小,我们使用不同的方法加载音效,以提高运行效率。

直接上代码,新建HelloAudio项目:

HelloAudio.h:

#ifndef __HELLOAUdio_H__
#define __HELLOAUdio_H__

#include "cocos2d.h"
#include "SimpleAudioEngine.h"
#include "Box2D\Box2D.h"

using namespace cocos2d;
using namespace CocosDenshion;

class HelloAudio : public cocos2d::Layer
{
private:
	// 菜单
	Menu* _menu;
	// 菜单项数
	int m_count;
	// 鼠标点击时的坐标
	CCPoint m_BeginPos;
	// 声音ID
	int sound_Id;

public:
	static cocos2d::Scene* createMusicScene();

	virtual bool init();

	void menuMusicCallBack(Ref* pSender);

	CREATE_FUNC(HelloAudio);

	void ontouchesBegan(const std::vector<cocos2d::Touch*>& touches,cocos2d::Event* event);
	void ontouchesMoved(const std::vector<cocos2d::Touch*>& touches,cocos2d::Event* event);

	virtual void onExit();
};

#endif // !__HELLOAUdio_H__

HelloAudio.cpp:

#include "HelloAudio.h"

USING_NS_CC;

// 定义Label的行间隔
#define Linesize 35

Scene* HelloAudio::createMusicScene()
{
	auto musicScene = Scene::create();
	auto musicLayer = HelloAudio::create();
	musicScene->addChild(musicLayer);

	return musicScene;
}

bool HelloAudio::init()
{
	if (!Layer::init())
	{
		return false;
	}

	// 设置标签数组
	std::string selectItem[] = {
		"play background music","stop background music","pause background music","resume background music","rewind background music","is background music playing","play effect","play effect repeatly","stop effect","unload effect","add background music volume","sub background music volume","add effect volume","sub effect volume","pause effect","resume effect","pause all effect","stop all effect","resume all effect"
	};

	_menu = Menu::create();
	// 获得标签数
	m_count = sizeof(selectItem) / sizeof(selectItem[0]);

	// 创建并为每个标签设置内容
	for (int i = 0; i < m_count; i++)
	{
		auto ttf = LabelTTF::create(selectItem[i].c_str(),"arial.ttf",25);
		// 添加标签到菜单项,并调用回调函数
		auto menuItemLabel = MenuItemLabel::create(ttf,this,menu_selector(HelloAudio::menuMusicCallBack));

		// 将菜单项和索引添加到菜单
		_menu->addChild(menuItemLabel,i + 10000);
		// 设置菜单项在菜单中的位置
		menuItemLabel->setPosition(240,320 - (i + 1) * Linesize);
	}
	// 设置菜单的大小范围
	_menu->setContentSize(CCSizeMake(480,(m_count + 1) * Linesize));
	_menu->setPosition(0,0);
	this->addChild(_menu);

	// 设置是否接受触碰
	setTouchEnabled(true);

	// 预先加载背景音乐和音效
	SimpleAudioEngine::getInstance()->preloadBackgroundMusic(
		FileUtils::getInstance()->fullPathForFilename("/music/ZARD.mp3").c_str());
	SimpleAudioEngine::getInstance()->preloadEffect(
		FileUtils::getInstance()->fullPathForFilename("/music/CANNON3.WAV").c_str());

	// 预先设置背景音乐和音效的音量
	SimpleAudioEngine::getInstance()->setBackgroundMusicVolume(0.5f);
	SimpleAudioEngine::getInstance()->setEffectsVolume(0.5f);

	return true;
}

void HelloAudio::menuMusicCallBack(Ref* pSender)
{
	// 获取菜单项,并通过索引获取Id
	auto menuItem = (MenuItem*)pSender;
	int Id = menuItem->getZOrder() - 10000;

	switch (Id)
	{
	case 0:
		// 播放背景音乐
		SimpleAudioEngine::getInstance()->playBackgroundMusic(
			FileUtils::getInstance()->fullPathForFilename("/music/ZARD.mp3").c_str(),true);
		break;
	case 1:
		// 停止背景音乐
		SimpleAudioEngine::getInstance()->stopBackgroundMusic();
		break;
	case 2:
		// 暂停背景音乐
		SimpleAudioEngine::getInstance()->pauseBackgroundMusic();
		break;
	case 3:
		// 继续播放背景音乐
		SimpleAudioEngine::getInstance()->resumeBackgroundMusic();
		break;
	case 4:
		// 重新播放背景音乐
		SimpleAudioEngine::getInstance()->rewindBackgroundMusic();
		break;
	case 5:
		// 判断是否正在播放背景音乐
		if (SimpleAudioEngine::getInstance()->isBackgroundMusicPlaying())
		{
			log("backgroup music is playing");
		} 
		else
		{
			log("backgroup music is not playing");
		}
		break;
	case 6:
		sound_Id = SimpleAudioEngine::getInstance()->playEffect(
			FileUtils::getInstance()->fullPathForFilename("/music/CANNON3.WAV").c_str(),false);
		break;
	case 7:
		sound_Id = SimpleAudioEngine::getInstance()->playEffect(
			FileUtils::getInstance()->fullPathForFilename("/music/CANNON3.WAV").c_str(),true);
		break;
	case 8:
		SimpleAudioEngine::getInstance()->stopEffect(sound_Id);
		break;
	case 9:
		// 卸载音效
		SimpleAudioEngine::getInstance()->unloadEffect(
			FileUtils::getInstance()->fullPathForFilename("/music/CANNON3.WAV").c_str());
		break;
	case 10:
		// 增大背景音乐音量
		SimpleAudioEngine::getInstance()->setBackgroundMusicVolume(
			SimpleAudioEngine::getInstance()->getBackgroundMusicVolume() + 0.1f);
		break;
	case 11:
		// 降低背景音乐音量
		SimpleAudioEngine::getInstance()->setBackgroundMusicVolume(
			SimpleAudioEngine::getInstance()->getBackgroundMusicVolume() - 0.1f);
		break;
	case 12:
		SimpleAudioEngine::getInstance()->setEffectsVolume(
			SimpleAudioEngine::getInstance()->getEffectsVolume() + 0.1f);
		break;
	case 13:
		SimpleAudioEngine::getInstance()->setEffectsVolume(
			SimpleAudioEngine::getInstance()->getEffectsVolume() - 0.1f);
		break;
	case 14:
		SimpleAudioEngine::getInstance()->pauseEffect(sound_Id);
		break;
	case 15:
		SimpleAudioEngine::getInstance()->resumeEffect(sound_Id);
		break;
	case 16:
		// 暂停所有音效
		SimpleAudioEngine::getInstance()->pauseAllEffects();
		break;
	case 17:
		SimpleAudioEngine::getInstance()->stopAllEffects();
		break;
	case 18:
		SimpleAudioEngine::getInstance()->resumeAllEffects();
		break;
	}
}

void HelloAudio::ontouchesBegan(const std::vector<cocos2d::Touch*>& touches,cocos2d::Event* event)
{
	// 由于win32不存在多点触控,所以取第一次点击,并获取第一次点击的位置
	auto touch = touches[0];
	m_BeginPos = touch->getLocation();
}

void HelloAudio::ontouchesMoved(const std::vector<cocos2d::Touch*>& touches,cocos2d::Event* event)
{
	auto touch = touches[0];

	// 获得移动后的位置
	auto touchLocal = touch->getLocation();
	// 获得移动后与移动前的Y轴位置变化
	float moveY = touchLocal.y - m_BeginPos.y;

	// 获得菜单的当前坐标
	auto curPos = _menu->getPosition();
	// 设置获得移动后菜单的坐标
	auto nextPos = Vec2(curPos.x,curPos.y + moveY);

	// 设置菜单的顶部和底部
	if (nextPos.y < 0.0f)
	{
		_menu->setPosition(0,0);
		return;
	}
	if (nextPos.y > ((m_count + 1)*Linesize - 320))
	{
		_menu->setPosition(0,(m_count + 1)*Linesize - 320);
		return;
	}

	_menu->setPosition(nextPos);

	// 将移动后的位置设置为开始位置
	m_BeginPos = touchLocal;
}

void HelloAudio::onExit()
{
	// 退出图层
	Layer::onExit();
	// 停止音乐的播放
	SimpleAudioEngine::getInstance()->end();
}

由于项目文件过大,这里只上传代码文件: http://download.csdn.net/detail/u013707014/9009295

Cocos2d-x学习笔记十—— 音频系统SimpleAudioEngine的更多相关文章

  1. 当使用AVPLayer播放视频时,它会停止背景音乐ios

    我正在使用AVPlayer播放视频,它会阻止iPhone的背景音乐.请帮我解决解决方法我的电影是为了动画;他们没有声音.为了让其他声音继续播放,在Swift:感谢marcusAdams的原始答案.

  2. 如何在ios中恢复音频?

    我正在使用Audioplayer播放5-10秒的音频文件.我的应用程序允许其他应用程序的背景音乐.在播放我的音频时,我正在停用其他音乐完成我的音频后,我想播放停用的音乐.在AVAudioPlayer&AVAudioSession?还是哪个框架支持这个恢复功能?解决方法播放声音后,请取消激活您的AVAudioSession

  3. ios模拟器 – 是否可以在模拟器上测试iOS4多任务/背景音乐?

    我已经在Info.plist中添加了uibackgroundmodes属性以具有“audio”的数组条目,并添加了调用以设置音频会话:[sessionsetCategory:AVAudioSessionCategoryPlaybackerror:&error];.但是,我唯一的测试设备是不支持多任务的iPodTouch2G.我尝试过模拟器,但当我切换到Safari时,音乐停止播放.但是当我切换回我

  4. ios – MPMediaItemPropertyAssetURL仅为iPhone 5返回null

    我一直在使用以下代码从MPMediaItemPickerController返回的MPMediaItem对象中提取资源url,以便我可以将用户的iPhoneitunes音乐库中的音乐文件复制到文档文件夹进行处理,但在iPhone5上,我总是得到一个null来自MPMediaItemPropertyAssetURL的值,但是当我在iPhone4或iPhone5上运行相同的代码时,它应该返回正确的UR

  5. ios – 调节SKAction的音量播放文件名称:

    有没有办法通过SKActionplaySoundFileNamed:waitForCompletion:来调节播放的音量.我想实现一个简单的音乐&音效滑块在我的游戏.我可以轻松地控制背景音乐,因为我通过AVAudioPlayer播放,但所有的声音效果都是通过SKAction播放的.解决方法不幸的是,您无法使用SKAction修改卷,因此您必须使用AVAudioPlayer作为您的效果.你可以实现一

  6. ios – 允许用户在swift 2.0中播放背景音乐

    我正在寻找一些代码,允许用户在使用我的应用程序的同时从手机播放音乐.以前在swift2.0之前,我会把它放在应用程序委托中,它会很好的工作:有谁知道如何在swift2.0中实现?解决方法以下将是Swift2在AVSession上调用setCategory和setActive的语法:要么

  7. 早期Swift中Cocos2D初始化代码的重构

    但是遗憾的是Swift2.2中还是不支持Type的class属性关键字,只能用static,我们期待Swift3的改进吧!

  8. 手把手教你swift项目添加cocos2dx-lua

    去倒杯水吧,这个过程会很久。。。至此,工程已经全部配置完毕,你已经解决一个大Boss了;今天就到这里吧,之后我们再续如何用swift调用lua手把手教你swift项目添加cocos2dx-lua

  9. 手把手教你swift项目集成cocos2dx-js模块

    前几天在swift项目中集成了Lua模块,使得在swift工程中用Lua写游戏逻辑成为了可能,具体工程及配置见手把手教你swift项目添加cocos2dx-lua,由于公司最近要把js做的小游戏集成到iOS原生应用中,于是我们将解锁另外一个场景,好了,下面开始;同样的,首先你得有一个swift项目我们从头开始,建立一个swift项目;我们默认你已经可以自己创建一个全新的swift项目了,这很简单,不是么?

  10. 如何降低swift音乐的音量?

    我正在创建一个带有背景音乐循环的SpriteKit游戏.问题是音乐太大了.如何降低音量?这是我用来设置音乐的代码你试过这个吗?

随机推荐

  1. 【cocos2d-x 3.x 学习笔记】对象内存管理

    Cocos2d-x的内存管理cocos2d-x中使用的是上面的引用计数来管理内存,但是又增加了一些自己的特色。cocos2d-x中通过Ref类来实现引用计数,所有需要实现内存自动回收的类都应该继承自Ref类。下面是Ref类的定义:在cocos2d-x中创建对象通常有两种方式:这两中方式的差异可以参见我另一篇博文“对象创建方式讨论”。在cocos2d-x中提倡使用第二种方式,为了避免误用第一种方式,一般将构造函数设为protected或private。参考资料:[1]cocos2d-x高级开发教程2.3节[

  2. 利用cocos2dx 3.2开发消灭星星六如何在cocos2dx中显示中文

    由于编码的不同,在cocos2dx中的Label控件中如果放入中文字,往往会出现乱码。为了方便使用,我把这个从文档中获取中文字的方法放在一个头文件里面Chinese.h这里的tex_vec是cocos2dx提供的一个保存文档内容的一个容器。这里给出ChineseWords,xml的格式再看看ChineseWord的实现Chinese.cpp就这样,以后在需要用到中文字的地方,就先include这个头文件然后调用ChineseWord函数,获取一串中文字符串。

  3. 利用cocos2dx 3.2开发消灭星星七关于星星的算法

    在前面,我们已经在GameLayer中利用随机数初始化了一个StarMatrix,如果还不知道怎么创建星星矩阵请回去看看而且我们也讲了整个游戏的触摸事件的派发了。

  4. cocos2dx3.x 新手打包APK注意事项!

    这个在编译的时候就可以发现了比较好弄这只是我遇到的,其他的以后遇到再补充吧。。。以前被这两个问题坑了好久

  5. 利用cocos2dx 3.2开发消灭星星八游戏的结束判断与数据控制

    如果你看完之前的,那么你基本已经拥有一个消灭星星游戏的雏形。开始把剩下的两两互不相连的星星消去。那么如何判断是GameOver还是进入下一关呢。。其实游戏数据贯穿整个游戏,包括星星消除的时候要加到获得分数上,消去剩下两两不相连的星星的时候的加分政策等,因此如果前面没有做这一块的,最好回去搞一搞。

  6. 利用cocos2dx 3.2开发消灭星星九为游戏添加一些特效

    needClear是一个flag,当游戏判断不能再继续后,这个flag变为true,开始消除剩下的星星clearSumTime是一个累加器ONE_CLEAR_TIME就是每颗星星消除的时间2.连击加分信息一般消除一次星星都会有连击信息和加多少分的信息。其实这些combo标签就是一张图片,也是通过控制其属性或者runAction来实现。源码ComboEffect.hComboEffect.cpp4.消除星星粒子效果消除星星时,为了实现星星爆裂散落的效果,使用了cocos2d提供的粒子特效引擎对于粒子特效不了

  7. 02 Cocos2D-x引擎win7环境搭建及创建项目

    官网有搭建的文章,直接转载记录。环境搭建:本文介绍如何搭建Cocos2d-x3.2版本的开发环境。项目创建:一、通过命令创建项目前面搭建好环境后,怎样创建自己的Cocos2d-x项目呢?先来看看Cocos2d-x3.2的目录吧这就是Cocos2d-x3.2的目录。输入cocosnew项目名–p包名–lcpp–d路径回车就创建成功了例如:成功后,找到这个项目打开proj.win32目录下的Hello.slnF5成功了。

  8. 利用cocos2dx 3.2开发消灭星星十为游戏添加音效项目源码分享

    一个游戏,声音也是非常的重要,其实cocos2dx里面的简单音效引擎的使用是非常简单的。我这里只不过是用一个类对所有的音效进行管理罢了。Audio.hAudio.cpp好了,本系列教程到此结束,第一次写教程如有不对请见谅或指教,谢谢大家。最后附上整个项目的源代码点击打开链接

  9. 03 Helloworld

    程序都有一个入口点,在C++就是main函数了,打开main.cpp,代码如下:123456789101112131415161718#include"main.h"#include"AppDelegate.h"#include"cocos2d.h"USING_NS_CC;intAPIENTRY_tWinMain{UNREFERENCED_ParaMETER;UNREFERENCED_ParaMETER;//createtheapplicationinstanceAppDelegateapp;return

  10. MenuItemImage*图标菜单创建注意事项

    学习cocos2dx,看的是cocos2d-x3.x手游开发实例详解,这本书错误一大把,本着探索求知勇于发现错误改正错误的精神,我跟着书上的例子一起调试,当学习到场景切换这个小节的时候,出了个错误,卡了我好几个小时。

返回
顶部