【IOS-COCOS2D-X 游戏开发之六】使用BASE64算法对COCOS2DX自带CCUSERDEFAULT游戏存储数据编码加密!

本站文章均为 李华明Himi 原创,转载务必在明显处注明: 
转载自【黑米GameDev街区】 原文链接: http://www.himigame.com/iphone-cocos2dx/659.html

上一篇介绍了,如何使用Cocos2dX自带的CCUserDefault 存储游戏数据,那么Himi也提到此方式保存的为xml格式并且数据明文显示=。 =,这个对于我们开发者来说太暴漏了有木有! so~本篇Himi分享如何使用经典Base64算法对CCUserDefault进行数据编码形成一种简单的加密形式!

OK,关于base64的介绍,Himi不再赘述,还不太熟悉的童鞋请点击以下连接阅读:

http://baike.baidu.com/view/469071.htm (百度百科的 base64详细解释)

如果对于Cocos2dX自带的CCUserDefault类不太熟悉的请点击如下连接:

【iOS-cocos2d-X 游戏开发之五】游戏存储之Cocos2dX自带CCUserDefault类详解;

对Base64有了基础认识后我们就开始进入正题,首先,我们针对Cocos2dX使用c++版的base64编码文件:

base64.h以及base64.cpp  文件下载导入项目中:[download id=”63″]

然后Himi封装好了两个函数:(这里我们假设存储游戏金币)

首先.h中,定义枚举变量(备注1)

1

2

3

4

enum{

    DATA_GOLD,//金币

 

};

然后.h定义两个函数:(备注2)

1

2

3

4

5

    //存储数据

    void saveDataByKeyValue(int iKey, string sValue);

 

    //读取数据

    int loadDataByKey(int iKey);

最后.cpp中函数具体实现代码:(备注3)

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

//存储

void HelloWorld::saveDataByKeyValue(int iKey, string sValue){

    char buffer[32];

    sprintf(buffer, "%s%d", "Himi",iKey);

    CCLog("----------存储");

    CCLog("存储之前数据 key:index: Himi%i, value: %s  ",iKey,sValue.c_str());

    string sKey = himiSaveData(reinterpret_cast<const unsigned char*>(sValue.c_str()), sValue.length());

    CCLog("存储编码后的数据 key:index: Himi%i, value: %s  ",iKey,sKey.c_str());

    CCUserDefault::sharedUserDefault()->setStringForKey(buffer, sKey);

    CCUserDefault::sharedUserDefault()->flush();

}

 

//读取

int HelloWorld::loadDataByKey(int iKey){

    CCLog("----------读取");

    char buffer[32];

    sprintf(buffer, "%s%d", "Himi",iKey);

 

    string s = CCUserDefault::sharedUserDefault()->getStringForKey(buffer);

    CCLog("解码前的数据: %s  ",s.c_str());

    string parseKey = himiParseData(s);

    CCLog("解码后的数据: %s  ",parseKey.c_str());

    return atoi(parseKey.c_str());

}

OK,这里开始逐步解释一下:

首先说下备注2,这里定义的两个方法,第一个函数:

1

2

//存储数据

    void saveDataByKeyValue(int iKey, string sValue);

其中第一个函数传入一个int值,为什么要这样,原因是这样方便与结合枚举变量(备注1)来进行存储,这样使用的时候非常简化你的代码和步骤;第二个函数是值,这里我封装成string,这样为了更好的结合我们的base64编码!这点在(备注3)中体现!

第二个函数:

1

2

//读取数据

    int loadDataByKey(int iKey);

这个函数没什么好说的,传入的参数int,枚举变量即可!至于返回值是int 是方便程序中使用!

OK,那么备注3对于两个封装函数中的实现需要说明的有3点:

1.  将传入的int值(key)转化成char*类型,因为cocos2dx中并没有itoa这样的方法(原因上一篇有介绍),所以这里我采用   char buffer[32];    sprintf(buffer, “%s%d”, “Himi”,iKey);  方式进行将int转化char*类型;

2. 存储的时候我们步骤是:string值进行base64编码,然后存储到xml中;

3. 将int转化string的时候我在枚举变量前加入”Himi”,大家不喜欢可以换成自己喜欢的,但是千万不要删除!因为一旦你删除掉,然后将存储后的形式为: <1>数据</1>  这样会造成你读取数据出错!

读取数据步骤:根据key读取xml的编码过的string,然后base64解码出原始值,最终atoi转化成int扔出!

这其中应该说没什么难于理解的,所以这里不再赘述了;

那么下面我们来看这两个函数如何使用:

1

2

3

4

5

    //base64编码存储

    this-&gt;saveDataByKeyValue(DATA_GOLD, "10000");

 

    //base64读取数据

    this-&gt;loadDataByKey(DATA_GOLD);

代码是不是用起来很方面呢!哈哈,这就对啦,不能因为编码弄得乱78糟~OK,运行项目,控制台你将看到如下显示:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

Cocos2d: cocos2d: cocos2d-1.0.1-x-0.12.0

Cocos2d: cocos2d: GL_VENDOR:     Imagination Technologies

Cocos2d: cocos2d: GL_RENDERER:   PowerVR SGX 543

Cocos2d: cocos2d: GL_VERSION:    OpenGL ES-CM 1.1 IMGSGX543-63.14.2

Cocos2d: cocos2d: GL_MAX_TEXTURE_SIZE: 4096

Cocos2d: cocos2d: GL_MAX_MODELVIEW_STACK_DEPTH: 16

Cocos2d: cocos2d: GL supports PVRTC: YES

Cocos2d: cocos2d: GL supports BGRA8888 textures: NO

Cocos2d: cocos2d: GL supports NPOT textures: YES

Cocos2d: cocos2d: GL supports discard_framebuffer: YES

Cocos2d: cocos2d: compiled with NPOT support: NO

Cocos2d: cocos2d: compiled with VBO support in TextureAtlas : NO

Cocos2d: 此项目已存在保存数据的xml文件

Cocos2d: 存储之前数据 key:index: 0, value: 10000

Cocos2d: 存储编码后的数据 key:index: 0, value: MTAwMDA=

Cocos2d: 解码前的数据: MTAwMDA=

Cocos2d: 解码后的数据: 10000

存储的文件内容截图如下:

OK,最后呢,我要说一点,虽然我们使用base64可以对数据进行编码,但是对于不懂程序的用户来说基本无法修改,但是对于稍微有了解base64编码的童鞋,那么直接可以在线解码你的这个编码,所以呢!最后Himi提醒大家,使用base64当中,大家可以书写一些算法结合base64来使用!这样即使明文也不怕,至于怎么做,Himi就不再多说了 哈哈!

本篇源码下载:”base64SaveDataForCocos2dx.zip”               下载地址: http://vdisk.weibo.com/s/hq0Pq

时间: 2024-09-08 11:38:14

【IOS-COCOS2D-X 游戏开发之六】使用BASE64算法对COCOS2DX自带CCUSERDEFAULT游戏存储数据编码加密!的相关文章

【转】【UNITY3D 游戏开发之六】UNITY 协程COROUTINE与INVOKE

本站文章均为 李华明Himi 原创,转载务必在明显处注明:  转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/unity3d-game/1610.html 这里Himi强调一点:Unity里面的协程并不是线程,协程是在unity主线程中运行的,每一帧中处理一次,而并不与主线程并行.这就意味着在协程之间并不存在着所谓线程间的同步和互斥问题,不会出现死锁.一般来说,访问同一个值也都是很安全的,用协程可以处理绝大多数的小问题,而且不用考虑复杂的线程间同步,

【ANDROID游戏开发之六】在SURFACEVIEW中添加系统控件,并且相互交互数据!

本站文章均为 李华明Himi 原创,转载务必在明显处注明:  转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/android-game/306.html ----------------------- 『很多童鞋说我的代码运行后,点击home或者back后会程序异常,如果你也这样遇到过,那么你肯定没有仔细读完Himi的博文,第十九篇Himi专门写了关于这些错误的原因和解决方法,这里我在博客都补充说明下,省的童鞋们总疑惑这一块:请点击下面联系进入阅读:

【IOS-COCOS2D-X 游戏开发之五】游戏存储之COCOS2DX自带CCUSERDEFAULT类详解;

本站文章均为 李华明Himi 原创,转载务必在明显处注明:  转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/iphone-cocos2dx/653.html 本篇跟大家分享下Cocos2dX中的存储,其中也介绍些细节容易犯错的问题: 在Cocos2dX中提供了自带存储类:CCUserDefault  ,当然了这里Himi强调一点,如果你的数据量比较大,建议使用SQL存储比较适合,另外一点要注意的是,尽可能不要在Cocos2dX中使用与平台相关的ap

《Cocos2D-X游戏开发技术精解》一1.7 成功的游戏

1.7 成功的游戏 Cocos2D-X游戏开发技术精解 按照官方的数据,市场上基于Cocos2D-X引擎开发的游戏已达三百多款.根据开源社区的保守统计,基于Cocos2D-X开发的游戏全球范围内已经突破一亿安装量.比如著名的捕鱼达人就是引擎应用成功的典范.国内知名的游戏厂商,网龙.空中网.Haypi.TinyCo.人人游戏.4399.热酷.五分钟等都在使用Cocos2D-X开发手机游戏.国外也有很多公司选用Cocos2D-X引擎制作二维游戏,比如GameLoft.Glu以及Disney Mobi

【IOS-COCOS2D-X 游戏开发之十二】自定义COCOS2DX摇杆(增强JOYSTICK),增加摇杆跟随用户触点作为摇杆坐标,让摇杆不再死板!

本站文章均为 李华明Himi 原创,转载务必在明显处注明:  转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/iphone-cocos2dx/721.html 对于虚拟摇杆在游戏开发中必不可少,Android方面的是由Himi自己实现封装的,大家可以移步到这里查看详细实现机制: [Android游戏开发二十四]360°平滑游戏摇杆(触屏方向导航)  那么在Cocos2d引擎已提供此摇杆类(Joystick),所以Himi也就懒得重写了,但是Cocos

【ANDROID游戏开发十七】让玩家自定义手势玩转ANDROID游戏!—ANDROID GESTURE之【输入法手势技术】

本站文章均为 李华明Himi 原创,转载务必在明显处注明: 转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/android-game/340.html ----------------------- 『很多童鞋说我的代码运行后,点击home或者back后会程序异常,如果你也这样遇到过,那么你肯定没有仔细读完Himi的博文,第十九篇Himi专门写了关于这些错误的原因和解决方法,这里我在博客都补充说明下,省的童鞋们总疑惑这一块:请点击下面联系进入阅读:

【ANDROID游戏开发二十二】(图文详解)游戏中灵活实现动画播放!简述J2ME的游戏类库与ANDROID游戏开发!

本站文章均为 李华明Himi 原创,转载务必在明显处注明:  转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/android-game/361.html 由于写书的缘故,博文更新缓慢,大家体谅,今天针对群内常提出动画实现的问题来进行一个详细讲述: 此章节适合没有做过游戏开发的同学学习! 做过Android软件的童鞋们,在学习游戏开发的时候,思维总是被固定在了Android系统组件上!比如动画实现总想着利用BitmapDrawable.Animatio

《Lua游戏开发实践指南》一3.1脚本语言和游戏

3.1脚本语言和游戏 脚本语言可以让美术师直接开始界面设计,让设计师和初级程序员(脚本语言是一种让新手快速进入游戏开发的很好的方式)立即着手游戏流程和逻辑的开发,让关卡设计师能迅速掌控游戏环境和游戏体验.脚本语言不是非常高效--它们没有原生代码的运行效率,因此不适合作为开发高性能需求处理的工具.但易整合语言能够利用原生语言编写的模块扩展功能,比如Lua,可以作为控制机制来调用原生代码编写的高性能处理组件.(Lua是运行效率最高的脚本语言之一,因此大部分性能方面的问题都可以不用担心.)C函数可以利

《Unity 3.x游戏开发实例》——2.13节适合上千款游戏的机制

2.13 适合上千款游戏的机制<Pong>游戏机制如此简单.高效,其影响力非常深远,贯穿了整个电子游戏历史. 从<Pong>中得到了<打砖块>游戏(Breakout).这里的迭代是将<Pong>转化为单机游戏,例如现实世界中的手球或壁球,并外加了一堵易碎的砖墙.<打砖块>在<Pong>理念中引入了阶段或关卡,每一关都配置了不同的砖块. <Arkanoid>通过将主题修改为科幻主题来迭代<打砖块>.球拍变成了宇宙