一款好玩的游戏怎么能够缺少声音呢,那么我们就来给我们的1024添加上声音吧!有关声音的操作用到了声音引擎SimpleAudioEngine,有对背景音乐的处理,有对音效的处理,函数比较简单,也好理解,下面就来实现一下吧!在1024中没有涉及到背景音乐,只有对音效的处理,其中比较关键的一点是对声音文件的获取,要根据不同的声音类型,不同的平台获取不同的声音文件,所以可以将音效的类型定义成枚举,对声音文件的获取单独封装在一个函数中。

#ifndef _AUDIO_PRETREAT_H_
#define _AUDIO_PRETREAT_H_
#include "cocos2d.h"
//使用声音必须包含声音引擎的头文件
#include "SimpleAudioEngine.h"

USING_NS_CC;
//使用声音引擎的命名空间
using namespace CocosDenshion;

//将用到的音效做如下的枚举定义
enum EFFECT_TYPE
{
	//滑动屏幕的声音
	EFFECT_TYPE_SWEEP = 0,
	//不同卡片消除发出的声音
	EFFECT_TYPE_1,
	EFFECT_TYPE_2,
	EFFECT_TYPE_3,
	EFFECT_TYPE_4,
	EFFECT_TYPE_5,
	EFFECT_TYPE_6,
	EFFECT_TYPE_7,
	EFFECT_TYPE_8,
	EFFECT_TYPE_9,
	EFFECT_TYPE_10,
};

class AudioPretreat : public CCObject
{
public:
	//初始化函数中完成加载声音的工作
	bool init();
	CREATE_FUNC(AudioPretreat);
	//根据不同的音效枚举返回不同的音效文件
	char * getEffect(EFFECT_TYPE type);
};

#endif
#include "AudioPretreat.h"

bool AudioPretreat::init()
{
	//预先加载用到的声音文件
	for(int i=0;i<11;i++)
	{
		SimpleAudioEngine::sharedEngine()->preloadEffect(this->getEffect((EFFECT_TYPE)i));
	}

	return true;
}

char * AudioPretreat::getEffect(EFFECT_TYPE type)
{
	//根据不同的音效类型,返回不同的声音文件,在case中也可以判断一下平台的类型,然后返回不同的声音文件
	switch(type)
	{
	case 0:
		return "sound/sfx_sweep.mp3";
		break;
	case 1:
		return "sound/sfx_sing_1.mp3";
		break;
	case 2:
		return "sound/sfx_sing_2.mp3";
		break;
	case 3:
		return "sound/sfx_sing_3.mp3";
		break;
	case 4:
		return "sound/sfx_sing_4.mp3";
		break;
	case 5:
		return "sound/sfx_sing_5.mp3";
		break;
	case 6:
		return "sound/sfx_sing_6.mp3";
		break;
	case 7:
		return "sound/sfx_sing_7.mp3";
		break;
	case 8:
		return "sound/sfx_sing_8.mp3";
		break;
	case 9:
		return "sound/sfx_sing_9.mp3";
		break;
	case 10:
		return "sound/sfx_sing_10.mp3";
		break;
	}

	return NULL;
}

好了,以上就是对声音处理的类,函数也比较简单,下面看看如何使用吧。我们需要在俩个地方播放音效,一个是手指滑动屏幕的时候,一个是卡片消除的时候,这俩个时机都是在Chess中来完成的,所以我们就在chess的头文件中添加私有成员变量m_audio,在init函数中进行一下初始化,这样系统会加载声音文件。然后分别在chess的以下俩个函数的适当位置添加播放音效的函数。

bool Chess::ccTouchBegan(CCTouch * touch,CCEvent * evt)
{
	//如果卡片正在移动,则不再进行移动,防止用户点击屏幕过快,导致坐标错误
	if(this->m_cubeManager->getCubeRun() == true)
	{
		return false;
	}

	CCPoint clickPoint = touch->getLocation();
	CCRect rect = this->m_chess->boundingBox();
	//判断点击点是否在棋盘上
	if(rect.containsPoint(clickPoint))
	{
		//将刚开始的触摸点保存下来,过会进行手势的判断
		this->m_firstPoint = clickPoint;

		//播放触摸屏幕的声音
		SimpleAudioEngine::sharedEngine()->playEffect(m_audio->getEffect((EFFECT_TYPE)0));
		return true;
	}

	return false;
}
//事件监听的调用函数
void Chess::addCube(CCObject * obj)
{
	CCSprite * sprite = (CCSprite *)obj;
	this->m_chess->addChild(sprite);

	//添加卡片消除的声音
	int tag = sprite->getTag();
	//计算以2为底的对数,然后根据类型播放声音
	int type = (int)(log((float)tag)/log((float)2));
	SimpleAudioEngine::sharedEngine()->playEffect(m_audio->getEffect((EFFECT_TYPE)(type-1)));

	//注释掉的这一段等同于上边的,上边的采用了一种比较简单的实现方式
	/*switch(tag)
	{
	case 4:
		SimpleAudioEngine::sharedEngine()->playEffect(m_audio->getEffect((EFFECT_TYPE)1));
		break;
	case 8:
		SimpleAudioEngine::sharedEngine()->playEffect(m_audio->getEffect((EFFECT_TYPE)2));
		break;
	case 16:
		SimpleAudioEngine::sharedEngine()->playEffect(m_audio->getEffect((EFFECT_TYPE)3));
		break;
	case 32:
		SimpleAudioEngine::sharedEngine()->playEffect(m_audio->getEffect((EFFECT_TYPE)4));
		break;
	case 64:
		SimpleAudioEngine::sharedEngine()->playEffect(m_audio->getEffect((EFFECT_TYPE)5));
		break;
	case 128:
		SimpleAudioEngine::sharedEngine()->playEffect(m_audio->getEffect((EFFECT_TYPE)6));
		break;
	case 256:
		SimpleAudioEngine::sharedEngine()->playEffect(m_audio->getEffect((EFFECT_TYPE)7));
		break;
	case 512:
		SimpleAudioEngine::sharedEngine()->playEffect(m_audio->getEffect((EFFECT_TYPE)8));
		break;
	case 1024:
		SimpleAudioEngine::sharedEngine()->playEffect(m_audio->getEffect((EFFECT_TYPE)9));
		break;
	case 2048:
		SimpleAudioEngine::sharedEngine()->playEffect(m_audio->getEffect((EFFECT_TYPE)10));
		break;
	}*/

	//添加抖动的效果
	CCJumpTo * jump = CCJumpTo::create(0.2f,sprite->getPosition(),30.0f,1);
	sprite->runAction(jump);
}

好了,到这里我们的1024基本就快大功告成了,最后我们来整体的看一遍1024的演示吧!

小塔1024——添加声音