zoukankan      html  css  js  c++  java
  • cocos2dX 之数据存储

    今天我们来看cocos2dX里面的数据存储类, CCUserDefault, 如今的游戏基本都会把用户信息保存下来, 以便于再次进入游戏的时候读取, 为了方便起见,有时我们也能够用CCUserDefault来存储金币数目这样的简单的数据项, 当然, 大型数据还是建议使用数据库


    闲话不多说, 我们来看看cocos2dX为我们准备了哪些函数:

    setBoolForKey( 键值, 值);            //设置一个bool值
    setStringForKey( 键值, 值);         //设置一个string值
    setDoubleForKey( 键值, 值);        //设置一个double值
    setFloatForKey( 键值, 值);           //设置一个float值
    setIntegerForKey( 键值, 值);        //设置一个int值

    getBoolForKey( 键值);    //读取一个bool值 
    getStringForKey( 键值);  //读取一个string值
    getDoubleForKey( 键值);//读取一个double值
    getFloatForKey( 键值);    //读取一个float值
    getIntegerForKey( 键值); //读取一个int值
    getBoolForKey( 键值, 默认值);    //读取一个bool值
    getStringForKey( 键值, 默认值);  //读取一个string值
    getDoubleForKey( 键值, 默认值);//读取一个double值
    getFloatForKey( 键值, 默认值);    //读取一个float值
    getIntegerForKey( 键值, 默认值); //读取一个int值
    flush();                                              //保存到文件

    话说函数也不是非常多啊, 五种类型, set写入, get取出, 非常明显的哈希表结构, Key-Valua, Key索引Value的值,


    我们先来来写写代码:

    	CCLabelTTF* ttf = CCLabelTTF::create( "null", "Arial", 32);
    	ttf->setPosition( ccp( visibleSize.width / 2, visibleSize.height / 2));
    	addChild( ttf, 0, 101);
    
    	if ( CCUserDefault::sharedUserDefault()->getBoolForKey( "flag", false))
    	{
    		//有数据
    		std::string str = CCUserDefault::sharedUserDefault()->getStringForKey( "str", "null");	//取出string
    		ttf->setString( str.c_str());	//将字符串的标题设为str
    	} 
    	else
    	{
    		//没有数据
    		CCUserDefault::sharedUserDefault()->setStringForKey( "str", "now, hava data");	//写入字符串
    		CCUserDefault::sharedUserDefault()->setBoolForKey( "flag", true);		//写入bool
    		CCUserDefault::sharedUserDefault()->flush();		//将数据存入xml里面, 只是如今貌似能够不加也能够
    	}


    我们来看看第一次执行的效果:


    第二次执行:



    我们再到项目里面的Debug.win32以下看看, 是不是多了一个UserDefault.xml



    我们打开这个文件看看:


    非常熟悉吧, 有两个数据:

    key: str<====>valua:now, hava data

    key:flag<====>valua:true



    只是CCUserDefault给我们提供的存储方式是明文存储, 非常easy被其它人从外部改动, 所以我们存入xml的时候最好是加密存储, 所以为了防止玩家改动数据, 我们也写个简单的加密解密函数:

    在头文件中面定义两个函数:

    void encode(std::string &str);
    	void decode(std::string &str);


    实现他们, 这个, 我没有研究过加密解密算法, 所以就来个最简单的:

    //加密
    void HelloWorld::encode(std::string &str)  
    {  
    	for(int i = 0; i < str.length(); i++) {  
    		int ch = str[i];  
    		ch = ch ^ 1;  
    		str[i] = ch;  
    	}
    }  
    
    //解密
    void HelloWorld::decode(std::string &str)  
    {  
    	for(int i = 0; i < str.length(); i++) {  
    		int ch = str[i];  
    		ch = ch ^ 1;  
    		str[i] = ch;  
    	}
    }  



    使用一下, 看看效果先:





    ( 旁白: 感觉怎么没有区别呢? 又忽悠我们?), 别急嘛, 我们看看XML文件:



    看看, 你能看懂吗?



    好了, 今天就到这里, 我发现近期的东西会不会是越来越简单了啊, 过段时间给来点有难度的偷笑

  • 相关阅读:
    【Java学习】Intellij IDEA基本配置
    【Java学习】Integer、new Integer() 和 int 比较和相关的面试题
    【Java学习】String[] args和String args[]的区别在哪里?
    【Java学习】包装类
    【Java学习】Java 枚举(enum)
    【Java学习】eclipse与intellij idea的区别
    【Mysql学习】mysql远程连接:ERROR 1130 (HY000): Host '*.*.*.*' is not allowed to connect to this MySQL server解决办法
    【Mysql学习】Mysql安装
    qplot函数用法(转载)
    webservice部署到服务器报错
  • 原文地址:https://www.cnblogs.com/jhcelue/p/7137826.html
Copyright © 2011-2022 走看看