CocosCreator简易开源框架SCL之本地化存储

本地化存储

单机游戏或者不是特别重要的游戏数据,我们往往选择将数据存储在本地,Cocos为我们提供了localStorage模块来操作。Cocos提供的localStorage在网页端的实现为localStorage,在原生上为Sqlite。本框架在该基础上做了一些优化,取名为SqlUtil。

改良原因

  1. 目前所有的浏览器中都会把localStorage的值类型限定为string类型
  2. 明文存储

主要是因为存储都为string类型,对我们对类型处理和json序列化需要重复操作,不太方便,这是我们主要改良点,第二点加密方案,仅是一种优化方案。

改良方式

对症下药,我们能否提前定义好类型,让数据返回时就处理好数据类型的问题呢?
所以,我们仅需对下面这个api做出处理就可以了

1
let data = sys.localStorage.getItem(key);

我们重新定义一个方法

1
2
3
4
5
6
7
8
9
10
get(key, type){
let data = sys.localStorage.getItem(key);
if(type is string) {
return data;
}
if(type is number) {
return data to number;
}
...
}

这样,我们就达到要求了,同时我们可能希望没有这个值的时候,能够使用一个默认值,那么还可以传一个默认值进去

1
2
3
4
5
6
7
get(key, type, default){
// ...
if(null == data) {
return default;
}
// ...
}

这样传递参数似乎有点多,我们考虑下,是否default也是一种数据类型,而且应该和我们期望的数据类型是一致的,所以修改下

1
2
3
4
get(key, default){
type = getType(default);
// ...
}

至此,我们的改良方案就结束了。

关于加密方案

我选取的是aes加密,所以安全系数一般,但是也可以防止那些直接伸手的了,还是可以的。当然,我们调试的时候,其实并不想加密,那么可以做个例外

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
set(){
// ...
if(!调试模式) {
encrypt();
}
// ...
}

get(){
// ...
if(!调试模式) {
decrypt();
}
// ...
}

继续优化

又到出题目时间了~

  1. 我们存储时,需要区分用户数据和系统数据,我们要清空所有用户数据,但不想清除系统数据,怎么做?
  2. 在原生上,存储和获取,使用的是线程操作,会让游戏卡顿,如何优化?

系列文章

  1. CocosCreator简易开源框架SCL之白皮书
  2. CocosCreator开源框架SCL之弹框管理

该框架开发的小游戏:翻棋子游戏

代码已上传到git: github / 同步镜像gitee

  • 如需2.x版本,请看CCCLibs仓库该仓库并没有整理,请自行参考

有任何建议或者疑问,可以关注作者公众号