一、Cocos2d-x中的声音
Cocos2d-iphone中包含CocosDenshion库,从低到高提供三层接口:CDSoundEngine、CDAudioManager和SimpleAudioEngine,但整个库完全依赖于OpenAL来实现。由于在其他平台上无法提供CocosDenshiono的底层支持,所以只采用了最上层的SimpleAudioEngine类来实现跨平台的声音引擎,在使用上是十分简便的。
查看SimpleAudioEngine这个文件就可以知道其中的播放背景音乐和音效的API了。(文件位置如下图:)
注:在Cocos2dx引擎文件夹中的samples/Cpp/TestCpp/proj.ios 文件目录下有一个附带的例子,里面包含了绝大部分的例子介绍,很详细,是学习Cocos2dx的一个好demo集锦。
关于在Cocos2dx中SimpleAudioEngine声音引擎的使用例子----CocosDenshionTest
(1)关于声音文件的预加载,可以使得程序在游戏中的执行效率提高,但是不可以避免的也会增加内存的占用。
// preload background music and effect SimpleAudioEngine::sharedEngine()->preloadBackgroundMusic( MUSIC_FILE ); SimpleAudioEngine::sharedEngine()->preloadEffect( EFFECT_FILE );
void SimpleAudioEngine::preloadBackgroundMusic(const char* pszFilePath) { // Changing file path to full path std::string fullPath = CCFileUtils::sharedFileUtils()->fullPathForFilename(pszFilePath); static_preloadBackgroundMusic(fullPath.c_str()); } void SimpleAudioEngine::playBackgroundMusic(const char* pszFilePath, bool bLoop) { // Changing file path to full path std::string fullPath = CCFileUtils::sharedFileUtils()->fullPathForFilename(pszFilePath); static_playBackgroundMusic(fullPath.c_str(), bLoop); }
void CocosDenshionTest::onExit() { CCLayer::onExit(); SimpleAudioEngine::sharedEngine()->end(); }
在Cocos2d-x中支持游戏存档类CCUserDefault可以用作为一个轻量级的数据库来使用。
(1)其文件位置为:libs/cocos2dx/support/user_default
关于在Cocos2dx中CCUserDefault的使用例子----CCUserDefaultTest
(2)这个类文件比较简单,而且是个单例类使用时,要用sharedUserDefault方法获取单例对象。
(3)其中主要的API都是一些set和get数据的方法。
例如:
/** @brief Get bool value by key, if the key doesn't exist, a default value will return. You can set the default value, or it is false. */ bool getBoolForKey(const char* pKey); bool getBoolForKey(const char* pKey, bool defaultValue);
/** @brief Set bool value by key. */ void setBoolForKey(const char* pKey, bool value);
(4)set完数据之后,要调用flush这个方法进行保存。通过查看这个方法的实现
void CCUserDefault::flush() { [[NSUserDefaults standardUserDefaults] synchronize]; }
(5)注意:使用CCUserDefault这个类保存数据是将数据存档到 XML 文件中的--这只是针对在cocos2dx 2.1.2 版本以前而言的(why?)
但是我目前安装的版本是2.1.4版本,其头文件中提供了以下这几个方法:
static void purgeSharedUserDefault(); const static std::string& getXMLFilePath(); static bool isXMLFileExist();
我一看,显然是用于获取xml路径的,我就试了一下:
CCUserDefault::sharedUserDefault()->setStringForKey("key", "value"); CCUserDefault::sharedUserDefault()->flush(); std::string myString = CCUserDefault::sharedUserDefault()->getStringForKey("key"); CCLog("value = %s",myString.c_str()); std::string str = CCUserDefault::getXMLFilePath(); CCLog("xml path_1 = %s",str.c_str()); bool isExit = CCUserDefault::isXMLFileExist(); if (isExit) { CCLog("xml path_2 = %s",str.c_str()); }
终端输出结果如下:
Cocos2d: value = value Cocos2d: xml path_1 = /Users/ios/Library/Application Support/iPhone Simulator/6.1/Applications/A77F61F5-F763-499D-9505-E938091011EE/Library/Caches/UserDefault.xml
怎么可能?我就根据xml path_1的路径到沙盒中查看Caches目录下,果然没有!!
但是假如我们把第一二行代码删掉,直接根据key获取value值,发现也是有数据的。
但是在Preferences目录下,有一个plist文件是保存了这些数据。
我找了好一会儿,终于有点发现了!!
在这个类是实现文件中的 initXMLFilePath 这个方法实现中
void CCUserDefault::initXMLFilePath() { #ifdef KEEP_COMPATABILITY if (! m_sbIsFilePathInitialized) { // xml file is stored in cache directory before 2.1.2 NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES); NSString *documentsDirectory = [paths objectAtIndex:0]; m_sFilePath = [documentsDirectory UTF8String]; m_sFilePath.append("/"); m_sFilePath += XML_FILE_NAME; m_sbIsFilePathInitialized = true; } #endif }
// xml file is stored in cache directory before 2.1.2 原来如此呀!是在2.1.2版本以前是保存到XML,但是我目前的版本是2.1.4,所以找不到XML,所以会找不到XML 文件。坑爹呀!个人认为,我当前版本是 CCUserDefault 这个类的数据是保存到Preferences目录下的plist文件下的。
(6)还有一个问题:在这个类中提供了set增加某一数据项的方法,但是并没有提供remove某一个数据项的方法,所以只能增加不能减少。
关于其中的 static void purgeSharedUserDefault(); 显然这个方法是将这个单例对象清除的。查看这个方法的实现
void CCUserDefault::purgeSharedUserDefault() { m_spUserDefault = NULL; }
(7)总结:关于这个类 CCUserDefault的使用十分的简单,提供的保存数据也有限(bool,int , float, double ,string)。