打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
quick

GameState是quick-cocos2d-x中特有的一个用户信息存储类,相对于CCUserDefault而言,它增加了数据校验的功能,当数据被人为的改变之后,会被检测出来,下面介绍它的主要用法。

一、初始化

因为GameState并没有在framework中加载,所以我们要在开始的代码中去加载,如在MyApp.lua的开头位置加载
GameState=require(cc.PACKAGE_NAME .. “.api.GameState”)

二、提供的方法

1、GameState.init(eventListener_, stateFilename_, secretKey_)

这个方法是初始化GameState,在场景初始化之前调用一次即可,如在MyApp.lua的MyApp:ctor()中调用。
eventListener_是载入或保存时调用的函数,可以写个匿名函数,后面会重点介绍;
stateFilename_是保存的文件名,如果留空或非字符串(string)则是默认的state.txt,该文件会被保存到device.writablePath下;
secretKey_是 校验文件时所用到的密钥,GameState保存的数据格式为{h = hash, s = s},s是我们要保存的数据(一个table),h则是要校验的一个md5码。如果secretKey_留空或为非字符串(string)则不加校验码, 直接保存数据,跟CCUserDefault一样了。

2、GameState.load()

载入并返回数据,一般此方法只调用一些就行,在游戏加载前调用并保存到一个全局变量GameData。

3、GameState.save(newValues)

保存数据,newValues是一个table。GameState.init对应于保存一个文件,此文件的内容就是newValues,所以我们需要更新数据的时候应该改变上面的GameData,然后保存GameData。

4、GameState.getGameStatePath()

保存的文件的完整路径。

三、eventListener(value)

此函数就是GameState.init中的第一个参数,value为一个table,此函数在载入或保存时都会被调用,相当于一个监听器。不同的情况下value的值会不一样。
注意:eventListener一定要有返回值。
1、GameState.load()中用到的eventListener
1)  如果在这个函数中载入数据时有异常发生,value值为{name = “load”, errorCode = errorCode},name有两种值,”load””save”,分别对应载入和保存;errorCode分为三种:
GameState.ERROR_INVALID_FILE_CONTENTS//不合法的文件内容,即取出来的内容不是一个table
GameState.ERROR_HASH_MISS_MATCH//文件被人为更改过
GameState.ERROR_STATE_FILE_NOT_FOUND//文件不存在
这个时候eventListener可返回nil。
2)  如果载入的数据是正确的,value值为

1
2
3
4
5
6
7
8
9
10
11
{
        name   = "load",
        values = values,
        encode = encode,
        time   = os.time()
 }

values就是取出的数据;encode数据是否加密过;time当前取出的时间。这个时候eventListener返回value.values即可。
2、GameState.save(newValues)中用到的eventListener
这时value值为

1
2
3
4
5
6
7
8
9
{
        name   = "save",
        values = newValues,
        encode = type(secretKey) == "string"
}

values就是要保存的数据;encode数据是否要加密。这个时候eventListener返回value.values即可。
当然,以上的情况你都可以做一些其它的事,如弹出错误的窗口,或打印出已加载或已保存的数据。

四、加密数据

GameState保存的还是明文数据,只是加了校验码,如果我们不想被用户知道保存了什么信息,可加密了再保存,这个在eventListener中“过滤”一下就行了。

五、示例

下面是一个完整的加载、初始化、载入,保存及加解密的过程代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
//MyApp.lua(加载、初始化、载入,加解密)
...
require("framework.cc.init")
GameState=require(cc.PACKAGE_NAME .. ".api.GameState")
-- global var
GameData={}
...
function MyApp:ctor()
    -- init GameState
    GameState.init(function(param)
        local returnValue=nil
        if param.errorCode then
            CCLuaLog("error")
        else
            -- crypto
            if param.name=="save" then
                local str=json.encode(param.values)
                str=crypto.encryptXXTEA(str, "abcd")
                returnValue={data=str}
            elseif param.name=="load" then
                local str=crypto.decryptXXTEA(param.values.data, "abcd")
                returnValue=json.decode(str)
            end
            -- returnValue=param.values
        end
        return returnValue
    end, "data.txt","1234")
    if io.exists(GameState.getGameStatePath()) then
        GameData=GameState.load()
    end
.....
end
....
//保存的时候
GameData.aaa="bbb"
GameState.save(GameData)
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
Kivy和Python线程-如何在它们之间获取数据
新出 SpringBoot 2.5 更新功能变动说明
06_大数据_Zookeeper组件讲解及操作
tomcat7 下CORS(跨域资源共享) 的配置
上位机与PLC通讯及OPC数据采集实践一
如何训练AI玩飞机大战游戏
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服