Cocos2d-x中背景音乐和音效使用实例_C 语言

游戏中的音乐和音效是必不可少的,好的音乐可以给我们留下很深的印象也决定了这个游戏的品质。今天我们来学习一下cocos2d-x中如何使用音乐和音效。这些用到的函数都比较简单,现在直接上代码。

//声音预先处理类的头文件
#ifndef _AUDIO_PRETREAT_H
#define _AUDIO_PRETREAT_H
#include "cocos2d.h"
//使用声音引擎必须包含SimpleAudioEngeim.h头文件
#include "SimpleAudioEngine.h"

using namespace cocos2d;
//声音引擎的命名空间
using namespace CocosDenshion;

//类AudioPretrea采用单例设计模式

//把用到的音乐做为枚举类型
enum MUSIC_TYPE
{
	MUSIC_TYPE_BACKGROUND //背景音乐
};

//把用到的音乐做为枚举类型
enum EFFECT_TYPE
{
	EFFECT_TYPE_EFFECT1
};

class AudioPretreat
{
private:
	static AudioPretreat * m_audioPretreat;
public:
	//单例设计的时候需要用到的俩个函数
	static AudioPretreat * sharedAudioPretreat();
	static void freeAudioPretreat();
	//可以根据不同的平台获取不同的声音文件
	char * getMusic(MUSIC_TYPE type);
	char * getEffect(EFFECT_TYPE type);
	//在init中完成声音的预先加载
	bool init();
};

#endif
//声音预先处理类的实现
#include "AudioPretreat.h"
//单例设计模式采用的惯用方式
AudioPretreat * AudioPretreat::m_audioPretreat = NULL;

AudioPretreat * AudioPretreat::sharedAudioPretreat()
{
	if(NULL == m_audioPretreat)
	{
		m_audioPretreat = new AudioPretreat();
	}
	return m_audioPretreat;
}

//在AppDelegate析构的时候调用这个函数
void AudioPretreat::freeAudioPretreat()
{
	if(m_audioPretreat)
	{
		delete m_audioPretreat;
		m_audioPretreat = NULL;
	}
}

//根据不同的平台获得不同的声音文件
char * AudioPretreat::getMusic(MUSIC_TYPE type)
{
	switch(type)
	{
	case MUSIC_TYPE_BACKGROUND:
		//WIN32,ANDROID,IOS都使用MP3格式的背景音乐
#if(CC_TARGET_PLATFORM == CC_PLATFORM_WIN32)
	return "background-music.mp3";
#else(CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
	return "background-music.mp3";
#endif
	break;
	}
	return NULL;
}

//根据不同的平台获得不同的音效文件
char * AudioPretreat::getEffect(EFFECT_TYPE type)
{
	switch(type)
	{
	case EFFECT_TYPE_EFFECT1:
#if(CC_TARGET_PLATFORM == CC_PLATFORM_WIN32)
		return "pew-pew-lei.wav";
#else(CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
		return "pew-pew-lei.ogg";
#endif
	}
	return NULL;
}

//init函数中完成一些初始化的操作
bool AudioPretreat::init()
{
	bool bRet = false;
	do
	{
		//预先加载声音,参数是声音文件
		SimpleAudioEngine::sharedEngine()->preloadBackgroundMusic(this->getMusic(MUSIC_TYPE_BACKGROUND));
		//加载音效
		SimpleAudioEngine::sharedEngine()->preloadEffect(this->getEffect(EFFECT_TYPE_EFFECT1));
		//设置声音的大小0.0-1.0
		SimpleAudioEngine::sharedEngine()->setBackgroundMusicVolume(0.1f);
		bRet = true;
	}
	while(0);

	return bRet;
}
// 下面就来看一下如何使用声音引擎
bool HelloWorld::init()
{
  bool bRet = false;
  do
  {

    CC_BREAK_IF(! CCLayer::init());

		CCSize size = CCDirector::sharedDirector()->getVisibleSize();

		AudioPretreat::sharedAudioPretreat()->init();

		//以下是对背景音乐的一些操作

		//设置字符串,并且转码
		std::string str1 = "播放背景音乐";
		std::string str2 = "停止背景音乐";
		std::string str3 = "暂停背景音乐";
		std::string str4 = "恢复背景音乐";
		std::string str5 = "重头播放背景音乐";
		std::string str6 = "背景音乐:加";
		std::string str7 = "背景音乐:减";
		GBKToUTF8(str1,"GB2312","UTF-8");
		GBKToUTF8(str2,"GB2312","UTF-8");
		GBKToUTF8(str3,"GB2312","UTF-8");
		GBKToUTF8(str4,"GB2312","UTF-8");
		GBKToUTF8(str5,"GB2312","UTF-8");
		GBKToUTF8(str6,"GB2312","UTF-8");
		GBKToUTF8(str7,"GB2312","UTF-8");

		CCMenuItemFont::setFontSize(24);
		CCMenuItemFont::setFontName("Arial");
		CCMenuItemFont * menu1 = CCMenuItemFont::create(str1.c_str(),this,menu_selector(HelloWorld::menu));
		menu1->setTag(1);
		CCMenuItemFont * menu2 = CCMenuItemFont::create(str2.c_str(),this,menu_selector(HelloWorld::menu));
		menu2->setTag(2);
		CCMenuItemFont * menu3 = CCMenuItemFont::create(str3.c_str(),this,menu_selector(HelloWorld::menu));
		menu3->setTag(3);
		CCMenuItemFont * menu4 = CCMenuItemFont::create(str4.c_str(),this,menu_selector(HelloWorld::menu));
		menu4->setTag(4);
		CCMenuItemFont * menu5 = CCMenuItemFont::create(str5.c_str(),this,menu_selector(HelloWorld::menu));
		menu5->setTag(5);
		CCMenuItemFont * menu6 = CCMenuItemFont::create(str6.c_str(),this,menu_selector(HelloWorld::menu));
		menu6->setTag(6);
		CCMenuItemFont * menu7 = CCMenuItemFont::create(str7.c_str(),this,menu_selector(HelloWorld::menu));
		menu7->setTag(7);

		CCMenu * leftMenu = CCMenu::create(menu1,menu2,menu3,menu4,menu5,menu6,menu7,NULL);
		leftMenu->alignItemsVerticallyWithPadding(5);
		leftMenu->setPositionX(size.width/4);
		this->addChild(leftMenu);

		//以下是对音效的操作
		std::string str11 = "播放音效";
		std::string str12 = "停止音效";
		std::string str13 = "暂停音效";
		std::string str14 = "恢复音效";
		std::string str15 = "从缓存中移除音效";
		std::string str16 = "音效:加";
		std::string str17 = "音效:减";
		GBKToUTF8(str11,"GB2312","UTF-8");
		GBKToUTF8(str12,"GB2312","UTF-8");
		GBKToUTF8(str13,"GB2312","UTF-8");
		GBKToUTF8(str14,"GB2312","UTF-8");
		GBKToUTF8(str15,"GB2312","UTF-8");
		GBKToUTF8(str16,"GB2312","UTF-8");
		GBKToUTF8(str17,"GB2312","UTF-8");

		CCMenuItemFont * menu11 = CCMenuItemFont::create(str11.c_str(),this,menu_selector(HelloWorld::menu));
		menu11->setTag(11);
		CCMenuItemFont * menu12 = CCMenuItemFont::create(str12.c_str(),this,menu_selector(HelloWorld::menu));
		menu12->setTag(12);
		CCMenuItemFont * menu13 = CCMenuItemFont::create(str13.c_str(),this,menu_selector(HelloWorld::menu));
		menu13->setTag(13);
		CCMenuItemFont * menu14 = CCMenuItemFont::create(str14.c_str(),this,menu_selector(HelloWorld::menu));
		menu14->setTag(14);
		CCMenuItemFont * menu15 = CCMenuItemFont::create(str15.c_str(),this,menu_selector(HelloWorld::menu));
		menu15->setTag(15);
		CCMenuItemFont * menu16 = CCMenuItemFont::create(str16.c_str(),this,menu_selector(HelloWorld::menu));
		menu16->setTag(16);
		CCMenuItemFont * menu17 = CCMenuItemFont::create(str17.c_str(),this,menu_selector(HelloWorld::menu));
		menu17->setTag(17);

		CCMenu * rightMenu = CCMenu::create(menu11,menu12,menu13,menu14,menu15,menu16,menu17,NULL);
		rightMenu->alignItemsVerticallyWithPadding(5);
		rightMenu->setPositionX(size.width*3/4);
		this->addChild(rightMenu);

    bRet = true;
  } while (0);

  return bRet;
}

void HelloWorld::menu(CCObject * sender)
{
	CCNode * node = (CCNode *)sender;
	int tag = node->getTag();
	switch(tag)
	{
	case 1:
		//播放声音,第二个参数代表是否循环播放
		SimpleAudioEngine::sharedEngine()->playBackgroundMusic(
			AudioPretreat::sharedAudioPretreat()->getMusic(MUSIC_TYPE_BACKGROUND),true);
		break;
	case 2:
		SimpleAudioEngine::sharedEngine()->stopBackgroundMusic();
		break;
	case 3:
		//pause和resume成对使用
		SimpleAudioEngine::sharedEngine()->pauseBackgroundMusic();
		break;
	case 4:
		SimpleAudioEngine::sharedEngine()->resumeBackgroundMusic();
		break;
	case 5:
		SimpleAudioEngine::sharedEngine()->rewindBackgroundMusic();
		break;
	case 6:
		//这个函数在win32上没法改变声音的大小,大家用f12跟进函数的时候里边是空,但是在android平台上有实现
		SimpleAudioEngine::sharedEngine()->setBackgroundMusicVolume(
			SimpleAudioEngine::sharedEngine()->getBackgroundMusicVolume()+0.1f);
		break;
	case 7:
		//这个函数在win32上没法改变声音的大小,大家用f12跟进函数的时候里边是空,但是在android平台上有实现
		SimpleAudioEngine::sharedEngine()->setBackgroundMusicVolume(
			SimpleAudioEngine::sharedEngine()->getBackgroundMusicVolume()-0.1f);
		break;
	case 11:
		//第二个参数设为true的话则循环播放,soundID是在HelloWorld的头文件中定义的
		//音效函数不同于背景音乐的是会返回一个ID
		soundID = SimpleAudioEngine::sharedEngine()->playEffect(
			AudioPretreat::sharedAudioPretreat()->getEffect(EFFECT_TYPE_EFFECT1),true);
		break;
	case 12:
		//音效函数大多会传入一个ID,因为游戏中的音效不止一个
		SimpleAudioEngine::sharedEngine()->stopEffect(soundID);
		break;
	case 13:
		SimpleAudioEngine::sharedEngine()->pauseEffect(soundID);
		break;
	case 14:
		SimpleAudioEngine::sharedEngine()->resumeEffect(soundID);
	case 15:
		//从缓存中移除音效,需要传入移除的音效的名字
		SimpleAudioEngine::sharedEngine()->unloadEffect(
			AudioPretreat::sharedAudioPretreat()->getEffect(EFFECT_TYPE_EFFECT1));
	case 16:
		SimpleAudioEngine::sharedEngine()->setEffectsVolume(
			SimpleAudioEngine::sharedEngine()->getEffectsVolume()+0.1);
		break;
	case 17:
		SimpleAudioEngine::sharedEngine()->setEffectsVolume(
			SimpleAudioEngine::sharedEngine()->getEffectsVolume()-0.1);
		break;
	}
}
//编码格式转化函数
int GBKToUTF8(std::string & gbkStr, const char* toCode, const char* fromCode)
{
	iconv_t iconvH;
	iconvH = iconv_open(fromCode, toCode);

	if (iconvH == 0)

	{
		return -1;
	}

	const char* strChar = gbkStr.c_str();
	const char** pin = &strChar;
	size_t strLength = gbkStr.length();
	char* outbuf = (char*) malloc(strLength*4);
	char* pBuff = outbuf;

	memset( outbuf, 0, strLength*4);
	size_t outLength = strLength*4;

	if (-1 == iconv(iconvH, pin, &strLength, &outbuf, &outLength))
	{
		iconv_close(iconvH);
		return -1;
	}

	gbkStr = pBuff;
	iconv_close(iconvH);

	return 0;
}

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索cocos2d-x
, 背景音乐
音效
cocos2dx 音乐音效、cocos2dx 音效播不完、cocos2dx 音效消失、cocos2dx 预加载音效、cocos2dx 播放音效,以便于您获取更多的相关知识。

时间: 2024-08-07 03:08:54

Cocos2d-x中背景音乐和音效使用实例_C 语言的相关文章

C++中stringstream的用法和实例_C 语言

之前在leetcode中进行string和int的转化时使用过istringstream,现在大致总结一下用法和测试用例. 介绍:C++引入了ostringstream.istringstream.stringstream这三个类,要使用他们创建对象就必须包含sstream.h头文件. istringstream类用于执行C++风格的串流的输入操作. ostringstream类用于执行C风格的串流的输出操作. stringstream类同时可以支持C风格的串流的输入输出操作. 下图详细描述了几

vc中SendMessage自定义消息函数用法实例_C 语言

本文实例讲述了vc中SendMessage自定义消息函数用法,分享给大家供大家参考.具体如下: SendMessage的基本结构如下: 复制代码 代码如下: SendMessage(     HWND hWnd,  //消息传递的目标窗口或线程的句柄.     UINT Msg, //消息类别(这里可以是一些系统消息,也可以是自己定义,下文具体介绍,)     WPARAM wParam, //参数1 (WPARAM 其实是与UINT是同种类型的,   //在vc编译器中右键有个"转到WPARA

C++中Semaphore内核对象用法实例_C 语言

本文实例讲述了C++中Semaphore内核对象的用法,分享给大家供大家参考.具体方法如下: 复制代码 代码如下: // Semaphore.cpp : 定义控制台应用程序的入口点.  //    #include "stdafx.h"  #include <Windows.h>  #include <process.h>     HANDLE g_hSemaphore;  DWORD g_nConut1 = 0;  DWORD g_nConut2 = 0; 

讲解C语言编程中指针赋值的入门实例_C 语言

从const int i 说起 你知道我们声明一个变量时象这样int i :这个i是可能在它处重新变赋值的.如下: int i = 0; /* . . . */ i = 20; /*这里重新赋值了*/ 不过有一天我的程序可能需要这样一个变量(暂且称它变量),在声明时就赋一个初始值.之后我的程序在其它任何处都不会再去重新对它赋值.那我又应该怎么办呢?用const . /* . . . */ const int ic =20; /* . . . */ ic = 40; /*这样是不可以的,编译时是无

C语言输出旋转后数组中的最小数元素的算法原理与实例_C 语言

  问题描述:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个排好序的数组的一个旋转,输出旋转数组的最小元素.例如数组{3, 4, 5, 1, 2}为{1, 2, 3, 4, 5}的一个旋转,该数组的最小值为1.      思路:这道题最直观的解法并不难.从头到尾遍历数组一次,就能找出最小的元素,时间复杂度显然是O(n).但这个思路没有利用输入数组的特性.既然有时间复杂度更小的算法,我们容易想到二分查找,因为它的时间复杂度为O(logn).这个问题是否可以运用二分查找呢

C++归并算法实例_C 语言

本文实例讲述了C++归并算法.分享给大家供大家参考.具体如下: /* 归并算法:把两个或两个以上的线性表合并在一起,形成一个新的线性表 函数模版的基本使用 程序意图:将两个相同类型的线性表元素排好序,然后将他们组合成一个排好的线性表 */ #include <iostream> using namespace std; const int n = 5; //5个元素 //输出数据元素 template <class T1> void OutPut(T1 out[(2*n)]) {

简单讲解C语言中宏的定义与使用_C 语言

宏定义是预编译功能的一种, 预编译又称为预处理, 是为编译做的预备工作的阶段.处理#开头的指令, 比如拷贝 #include 包含的文件代码,#define宏定义的替换,条件编译等. 使用宏定义的好处:使用宏定义的好处:可提高程序的通用性和易读性,减少不一致性,减少输入错误和便于修改.例如 π 这个常量,我们有时候会在程序的多个地方使用,如果每次使用都重新定义,一来比较麻烦,二来容易出错,所以我们可以把 π 做成宏定义来使用.   语法说明: (1)宏名一般用大写 (2)使用宏可提高程序的通用性

C语言中static的作用及C语言中使用静态函数有何好处_C 语言

想了解Java中static关键字的作用和用法详细介绍,请点击此处了解详情. 在C语言中,static的字面意思很容易把我们导入歧途,其实它的作用有三条,分别是: 一是隐藏功能,对于static修饰的函数和全局变量而言 二是保持持久性功能,对于static修饰的局部变量而言. 三是因为存放在静态区,全局和局部的static修饰的变量,都默认初始化为0 下面我逐一给大家介绍: (1)先来介绍它的第一条也是最重要的一条:隐藏. 当我们同时编译多个文件时,所有未加static前缀的全局变量和函数都具有

C基础 mariadb处理的简单实例_C 语言

引言 MariaDB 是一款灰常不错开源数据库. 这里直接用它来解决业务问题. 业务需求: 现在数据库中表示按照天分表的. 突然我们需要按照月来处理数据. 例如输入一个玩家id, 查找这个玩家这个月内看了一件事几次. 我们先搭建一个环境. 操作系统: Linux version 4.4.0-22-generic (buildd@lgw01-41) (gcc version 5.3.1 20160413 (Ubuntu 5.3.1-14ubuntu2) ) #40-Ubuntu SMP Thu M