Cocos2d-x 声音SimpleAudioEngine & 游戏存档 CCUserDefault


一、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);
}


2)注意在onExit函数中结束对SimpleAudioEngine的使用

void CocosDenshionTest::onExit()
{
    CCLayer::onExit();

    SimpleAudioEngine::sharedEngine()->end();
}


二、Cocos2d-x中的游戏存档

在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];
}

我们就知道,其实这个CCUserDefault就是OC中的NSUserDefault啦。

(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_2 那么就是表明XML文件不存在!!

怎么可能?我就根据xml  path_1的路径到沙盒中查看Caches目录下,果然没有!!

但是假如我们把第一二行代码删掉,直接根据key获取value值,发现也是有数据的。

但是在Preferences目录下,有一个plist文件是保存了这些数据。

Cocos2d-x 声音SimpleAudioEngine & 游戏存档 CCUserDefault_第1张图片

我找了好一会儿,终于有点发现了!!

在这个类是实现文件中的 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)。




你可能感兴趣的:(C++,cocos2d-x,CCUserDefault)