![[cocos2dx_Lua]自定义本地化数据,第1张 [cocos2dx_Lua]自定义本地化数据,第1张](/aiimages/%5Bcocos2dx_Lua%5D%E8%87%AA%E5%AE%9A%E4%B9%89%E6%9C%AC%E5%9C%B0%E5%8C%96%E6%95%B0%E6%8D%AE.png)
GameStateDB.lua
quick-cocos2d-x3.3版本中,framework/cc/utils/GameState.lua已经提供了GameStateDB.lua中的方法
--本地存储的加密文件local m = class( "GameStateDB" )m.ERROR_INVALID_file_CONTENTS = -1m.ERROR_HASH_MISS_MATCH = -2m.ERROR_STATE_file_NOT_FOUND = -3local crypto = require(cc.PACKAGE_name .. ".crypto")local Json = require(cc.PACKAGE_name .. ".Json")function m:ctor() self.encodeSign = "=GS=" self._filename = "GameStateDB.txt" self._cbHandle = nil self.secretKey = nilendfunction m:init(_cbHandle,filename,secretKey_) if type(_cbHandle) ~= "function" then print("m:init() - invalID self._cbHandle") return false end self._cbHandle = _cbHandle if type(filename) == "string" then self._filename = filename end if type(secretKey_) == "string" then self.secretKey = secretKey_ end self._cbHandle({ eventname = "init",filename = self:getGameStateDBPath(),isEncrypt = type(self.secretKey) == "string" }) return trueend--返回保存是否成功结果及保存存档字符串function m:save(newValues) local function encode_(values) local strValues = Json.encode(values) local md5 = crypto.md5(strValues..self.secretKey) --md5码,用于校验数据的完整性,安全性 local contents = Json.encode({md5 = md5,strValues = strValues}) return crypto.encodeBase64(self.encodeSign..contents) --数据加密 end local values = self._cbHandle({ eventname = "save",values = newValues,isEncrypt = type(self.secretKey) == "string" }) if type(values) ~= "table" then print("m:save() - Listener return invalID data") return false end local filename = self:getGameStateDBPath() local ret = false local saveStr = "" if self.secretKey then saveStr = encode_(values) ret = io.writefile(filename,saveStr) else saveStr = Json.encode(values) if type(saveStr) == "string" then ret = io.writefile(filename,saveStr) end end printf("m:save() - update file \"%s\"",filename) return ret,saveStrendfunction m:load(_strData) local function isEncodedContents_(contents) return string.sub(contents,1,string.len(self.encodeSign)) == self.encodeSign end local function decode_(fileContents) local contents = string.sub(fileContents,string.len(self.encodeSign) + 1) local j = Json.decode(contents) if type(j) ~= "table" then print("m:decode_() - invalID contents") return {errorCode = m.ERROR_INVALID_file_CONTENTS} end local hash,strValues = j.md5,j.strValues local testHash = crypto.md5(strValues..self.secretKey) if testHash ~= hash then print("m:decode_() - hash miss match") return {errorCode = m.ERROR_HASH_MISS_MATCH} end local values = Json.decode(strValues) if type(values) ~= "table" then print("m:decode_() - invalID state data") return {errorCode = m.ERROR_INVALID_file_CONTENTS} end return {values = values} end local contents = nil if _strData == nil then local filename = self:getGameStateDBPath() if not io.exists(filename) then printf("m:load() - file \"%s\" not found",filename) return self._cbHandle({eventname = "load",errorCode = m.ERROR_STATE_file_NOT_FOUND}) end contents = io.readfile(filename) printf("m:load() - get values from \"%s\"",filename) else printf("m:load() with function!!!") contents = _strData end --解密 contents = crypto.decodeBase64(contents) local values local isEncrypt = false if self.secretKey and isEncodedContents_(contents) then local d = decode_(contents) if d.errorCode then return self._cbHandle({eventname = "load",errorCode = d.errorCode}) end values = d.values isEncrypt = true else values = Json.decode(contents) if type(values) ~= "table" then print("m:load() - invalID data") return self._cbHandle({eventname = "load",errorCode = m.ERROR_INVALID_file_CONTENTS}) end end return self._cbHandle({ eventname = "load",values = values,isEncrypt = isEncrypt,time = os.time() })endfunction m:getGameStateDBPath() return string.gsub(device.writablePath,"[\\/]+$","") .. "/" .. self._filenameendreturn m LocalDBMgr.lua --[[ LocalDBMgr.lua 存储本地数据 数据编码格式: local data = { a=1,b=2,c=3} local secretKey = "123" 1.先将data转换成Json串s,然后s 和 secretKey 连接成字符串 c 2.再将c计算md5得到值hash 3.再次以格式 { h = hash,s = s } 编码Json 形成 contents 4.将contents进行base64加密]]local LocalDBMgr = class( "LocalDBMgr" )local GameStateDB = require("app.core.GameStateDB").new() --换成GameStateDB的真实路径--数据文件秘钥(不变化)local DATA_SER_KEY = "2k7x2023r49mvpus2t616e13c7965b1"--构造函数function LocalDBMgr:ctor() self:init() local function GameStateCallBackHandle(params) return params end GameStateDB:init( GameStateCallBackHandle,"LocalDBMgr",DATA_SER_KEY ) local path = GameStateDB:getGameStateDBPath() if not io.exists( path ) then print("[[ 创建LocalDBMgr ]]") GameStateDB:save( self.db ) else self:load() endend--初始化config表function LocalDBMgr:init() self.db = { clIEntVersion = "1.0.0",-- 客户端版本号 accesstoken = "",--微信token openID = "",--openID bgState = 1,--背景音乐是否打开 bgValume = 100,--背景音乐大小 soundState = 1,--音效是否打开 soundValume = 100,--音效大小 actimgList = {},--活动图片列表 }end--数据存储function LocalDBMgr:save(_key,_value) if not _key or not _value then assert( nil,"LocalDBMgr save key or value is nil! ") return end self.db[ _key .. '' ] = _value print( "LocalDBMgr save:",_key,_value ) GameStateDB:save( self.db )end--数据读取function LocalDBMgr:read(_key) if not _key then assert( nil,"LocalDBMgr read key is nil!" ) return end return self.db[ _key .. '' ]end--数据加载function LocalDBMgr:load() self:init()--只维护self.db中的数据 local data = GameStateDB:load().values.values for k,v in pairs(self.db) do if data[k] then self.db[k] = data[k] --本地数据重置到缓存数据, end end GameStateDB:save( self.db )endreturn LocalDBMgr 总结 以上是内存溢出为你收集整理的[cocos2dx_Lua]自定义本地化数据全部内容,希望文章能够帮你解决[cocos2dx_Lua]自定义本地化数据所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)