一款好的游戏没有声音怎么可以呢,所以一定要为我们的飞机添加上声音,这样玩起来才有玩头嘛!今天试一下3.0的声音引擎,发现播放声音的时候总是有延迟的现象发生,但是在初始化的时候是预先加载了声音的,跟进预先加载背景音乐的函数一看是空的实现,但是音效的预先加载并不是空的实现,在win32上测试的时候虽然预先加载了声音但是播放延迟的问题是没法解决的,最后游戏添加了声音在win32下变的有点卡(在游戏主场景中有点卡)。但是移植到android平台的时候一切正常,背景音乐和音效的播放没有出现延迟的问题,游戏也很流畅,所以,我觉得引擎在win32平台下对声音的处理不是很好,或许是我的方法有错,大家看看代码吧,如果你有什么发现就留言吧。

#ifndef _SOUND_H_
#define _SOUND_H_
#include "cocos2d.h"
//声音引擎
#include "SimpleAudioEngine.h"

USING_NS_CC;
using namespace CocosDenshion;

//把用到的音乐做为枚举类型
enum MUSIC_TYPE
{
	//游戏的背景音乐 game_music.mp3
	MUSIC_TYPE_BACKGROUND,
	//最大的敌机飞行时候的背景音乐 big_spaceship_flying.mp3
	MUSIC_TYPE_BIG_SPACESHIP_FLYING,
};

//把用到的音乐做为枚举类型
enum EFFECT_TYPE
{
	//单击菜单按钮时候的音效 button.mp3
	EFFECT_TYPE_BUTTON,
	//发射子弹时候的音效 bullet.mp3
	EFFECT_TYPE_BULLET,
	//敌机炸毁的音效 enemy1_down.mp3 enemy2_down.mp3 enemy3_down.mp3
	EFFECT_TYPE_ENEMY1_DOWN,
	EFFECT_TYPE_ENEMY2_DOWN,
	EFFECT_TYPE_ENEMY3_DOWN,
	//游戏结束 game_over.mp3
	EFFECT_TYPE_GAME_OVER,
	//获得UFO道具 get_double_laser.mp3
	EFFECT_TYPE_GET_UFO,
	//道具出来时候的音效 out_porp.mp3
	EFFECT_TYPE_OUT_PORP
};

//声音处理类
class Sound
{
public:
	static Sound * getInstance();
	static void freeInstance();
private:
	static Sound * m_sound;
	Sound();
	//根据不同的音乐和音效类型获得相应平台下的文件
	char * getMusic(MUSIC_TYPE type);
	char * getEffect(EFFECT_TYPE type);
public:
	//声音的播放和停止
	void playEffect(EFFECT_TYPE type);
	void playBgMusic(MUSIC_TYPE type);
};

#endif
#include "Sound.h"

Sound * Sound::m_sound = NULL;

Sound * Sound::getInstance()
{
	if(m_sound == NULL)
	{
		m_sound = new Sound();
	}

	return m_sound;
}

void Sound::freeInstance()
{
	if(m_sound != NULL)
	{
		delete m_sound;
		m_sound = NULL;
	}
}

Sound::Sound()
{
	//预先加载声音,参数是声音文件
	auto audio = SimpleAudioEngine::getInstance();
	//预先加载音乐的函数在win32下是空的实现 播放的效果是滞后的 在android上没有问题
	audio->preloadBackgroundMusic(getMusic(MUSIC_TYPE_BACKGROUND));
	audio->preloadBackgroundMusic(getMusic(MUSIC_TYPE_BIG_SPACESHIP_FLYING));
	//加载音效 在win32下加载音效没有什么效果,播放出来是滞后的,但是在android上没有滞后的问题
	audio->preloadEffect(getEffect(EFFECT_TYPE_BULLET));
	audio->preloadEffect(getEffect(EFFECT_TYPE_BUTTON));
	audio->preloadEffect(getEffect(EFFECT_TYPE_ENEMY1_DOWN));
	audio->preloadEffect(getEffect(EFFECT_TYPE_ENEMY2_DOWN));
	audio->preloadEffect(getEffect(EFFECT_TYPE_ENEMY3_DOWN));
	audio->preloadEffect(getEffect(EFFECT_TYPE_GAME_OVER));
	audio->preloadEffect(getEffect(EFFECT_TYPE_GET_UFO));
	audio->preloadEffect(getEffect(EFFECT_TYPE_OUT_PORP));
	//设置声音的大小0.0-1.0 在win32下也是空的实现
	audio->setBackgroundMusicVolume(0.5f);
}

//获取音效和音乐的文件
char * Sound::getMusic(MUSIC_TYPE type)
{
	switch(type)
	{
	case MUSIC_TYPE_BACKGROUND:
		//获取不同平台下的文件
#if(CC_TARGET_PLATFORM == CC_PLATFORM_WIN32)
		return "sound/game_music.mp3";
#elif(CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
		return "sound/game_music.mp3";
#endif
		break;
	case MUSIC_TYPE_BIG_SPACESHIP_FLYING:
		return "sound/big_spaceship_flying.mp3";
		break;
	}
	return NULL;
}

char * Sound::getEffect(EFFECT_TYPE type)
{
	switch(type)
	{
	case EFFECT_TYPE_BUTTON:
		return "sound/button.mp3";
		break;
	case EFFECT_TYPE_BULLET:
		return "sound/bullet.mp3";
		break;
	case EFFECT_TYPE_ENEMY1_DOWN:
		return "sound/enemy1_down.mp3";
		break;
	case EFFECT_TYPE_ENEMY2_DOWN:
		return "sound/enemy2_down.mp3";
		break;
	case EFFECT_TYPE_ENEMY3_DOWN:
		return "sound/enemy3_down.mp3";
		break;
	case EFFECT_TYPE_GAME_OVER:
		return "sound/game_over.mp3";
		break;
	case	EFFECT_TYPE_GET_UFO:
		return "sound/get_double_laser.mp3";
		break;
	case EFFECT_TYPE_OUT_PORP:
		return "sound/out_porp.mp3";
		break;
	default:
		return NULL;
	}
}

//播放音乐和音效
void Sound::playEffect(EFFECT_TYPE type)
{
	auto audio = SimpleAudioEngine::getInstance();
	audio->playEffect(this->getEffect(type));
}

void Sound::playBgMusic(MUSIC_TYPE type)
{
	auto audio = SimpleAudioEngine::getInstance();
	if(!audio->isBackgroundMusicPlaying())
	{
		audio->playBackgroundMusic(this->getMusic(type),true);
	}
	else
	{
		audio->resumeBackgroundMusic();
	}
}

上边就是声音处理的类,在构造函数中先预先加载一些声音文件,通过getEffect和getMusic函数获取不同平台下的声音文件,我都是使用的mp3格式的文件就没有写相关的代码了,获取不同平台下的文件可以参考我getMusic的前几行代码。接下来就是调用了,大家在用到的地方去调用播放声音的函数吧,这里我把暂停处对声音的处理拿出来做一个范例。

//对声音的处理 UILayer中暂停按钮按下的时候
		SimpleAudioEngine::getInstance()->pauseBackgroundMusic();
auto sound = Sound::getInstance();
	auto callback = [& sound](Ref * ref)
	{
		sound->playEffect(EFFECT_TYPE_BUTTON);
		//恢复背景音乐 Pause中恢复场景的时候调用
		sound->playBgMusic(MUSIC_TYPE_BACKGROUND);
		//弹出保存的场景
		Director::getInstance()->popScene();
	};

用3.0实现飞机大战——添加声音