在游戏中通常需要保存数据,常见的数据如玩家账号信息一般由服务端采用SQL等技术保存在数据库中。对于某些数据量较小且使用次数较少的数据,可以保存在本地文件中。cocos2d-x引擎为开发者提供了数据存储类CCUserDefault,该类支持跨平台使用,使用比较方便。
CCUserDefault支持bool、int、float、double以及string 5种类型的数据保存,各种数据保存的实现方式如下:
bool getBoolForKey(const char* pKey);
bool getBoolForKey(const char* pKey, bool defaultValue);
int getIntegerForKey(const char* pKey);
int getIntegerForKey(const char* pKey, int defaultValue);
float getFloatForKey(const char* pKey);
float getFloatForKey(const char* pKey, float defaultValue);
double getDoubleForKey(const char* pKey);double getDoubleForKey(const char* pKey, double defaultValue);
std::string getStringForKey(const char* pKey);
std::string getStringForKey(const char* pKey, const std::string & defaultValue);
CCUserDefault将数据以XML格式保存在本地文件中,通过TinyXML2进行数据解析。xml文件本质是一个小型的数据库,因此,可以像操作数据那样,实现对xml文件的增删查改。CCUserDefault首先创建一个XMLDocument类型的文件,然后将key与value写入该文件,并保存,即可实现数据的存储。
以保存游戏中玩家是否点击了消息查看按钮为例,说明CCUserDefault在游戏中的应用。通常游戏推送给玩家的消息存放在消息列表中,如果玩家未点击消息列表,可能忽略该消息。因此需要在界面上增加提示。如果玩家点击消息按钮查看之后,就不再需要提示了,如果通过游戏内的变量标识,玩家退出游戏重新进入之后,该变量将会重置,达不到效果。因此,这里可以采用CCUserDefault中的setBoolForKey() / getBoolForKey()函数保存是否点击的标识。其实现过程如下:
1. 初始化点击消息按钮变量的key值
在程序中初始化一个变量IS_CLICKED,用以标识点击消息按钮的动作。
2. 设置点击标识值
在点击消息按钮的相应函数中,通过函数setBoolForKey() 设置变量IS_CLICKED的bool值为false,并将该键值对保存到缓冲区中;
调用flush()函数将键值对从缓冲区保存到本地文件中。
3. 获取点击标识值
在更新界面的函数中,通过getBoolForKey()函数读取变量IS_CLICKED的 bool值。如果值为true,说明未点击过,在界面上显示消息提示;如果值为 false,说明已经点击过了,不再提示。在getBoolForKey()函数中,需要设置 第二个参数为true,即未点击的情况下默认值应该需要显示。
上述过程实现的主要代码如下:
local IS_CLICKED = "is_clicked"
function uiUtil:setIsClicked(flag)
CCUserDefault:sharedUserDefault():setBoolForKey(IS_CLICKED, flag)
CCUserDefault:sharedUserDefault():flush()
end
function uiUtil:isClicked()
return CCUserDefault:sharedUserDefault():getBoolForKey(IS_CLICKED, true)
end
上述程序执行完毕之后,将会在目录下生成一个名为UserDefault的.xml文件,文件的内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<userDefaultRoot>
<is_clicked>false</is_clicked>
</userDefaultRoot>
可以看出,is_clicked对应的值已经变为false,当玩家再次点击消息按钮时,不再弹出界面提示。
需要注意的是,如上所述,通过CCUserDefault创建的UserDefault .xml文件并不是加密的,如果保存了重要的信息,需要将文件进行加密处理。
由上述介绍可知,CCUserDefault类保存文件的方式类似于网站中应用较为广泛的cookies,它们都是将某些信息保存在客户端。不同的是,cookies一般只用于保存用户信息等固定的数据,而CCUserDefault方式保存数据的灵活性更好。