前端之家收集整理的这篇文章主要介绍了
【cocos2dx 3.3 lua】09 lua配置文件读写,
前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
用lua格式做配置文件或记录文件,代码如下:
- --[[
- lua配置处理类
- 读写lua格式配置文件
-
- Load 读取lua配置文件
- Save 写入lua配置文件
- GetConfig 获取当前缓存的配置
- --]]
-
- local LuaConfig = class("LuaConfig")
-
- LuaConfig._instance = nil
-
- -- 各种参数
- LuaConfig._config = nil
- LuaConfig._defFilePath = cc.FileUtils:getInstance():getWritablePath().."config.lua"
- LuaConfig._formatString = ""
-
- function LuaConfig:GetInstance()
- if LuaConfig._instance == nil then
- LuaConfig._instance = LuaConfig.new()
- end
-
- return LuaConfig._instance
- end
-
- function LuaConfig:ReleaseInstance()
- if LuaConfig._instance ~= nil then
- LuaConfig._instance:Release()
- LuaConfig._instance = nil
- end
- end
-
- function LuaConfig:ctor()
-
- end
-
- -- 设置格式化输出缩进
- function LuaConfig:SetFormatString(formatString)
- self._formatString = formatString
- end
-
- -- 序列化 准备存储 返回序列化后的字符串 缩进暂时为1空格 参数为nil时 处理_config
- function LuaConfig:Serialize(config,formatString)
- if config == nil then -- nil不处理
- return "nil"
- end
-
- local serializedConfig = ""
- local formatString = formatString or self._formatString
- local tableFormatString = string.gsub(formatString,self._formatString,"",1) -- table去掉一个缩进
-
- -- 序列化操作 number boolean string table
- local paramType = type(config)
- if paramType == "number" then
- serializedConfig = serializedConfig..tostring(config)
- elseif paramType == "boolean" then
- serializedConfig = serializedConfig..tostring(config)
- elseif paramType == "string" then
- serializedConfig = serializedConfig..string.format("%q",config) -- 接受一个字符串并将其转化为可安全被Lua编译器读入的格式 主要防止使用if或其他关键字之类的作为key的情况
- elseif paramType == "table" then
- serializedConfig = serializedConfig.."\n"
- serializedConfig = serializedConfig..tableFormatString.."{\n"
- for k,v in pairs(config) do
- serializedConfig = serializedConfig..formatString
- serializedConfig = serializedConfig.."["..self:Serialize(k).."]"
- serializedConfig = serializedConfig.." = "
- serializedConfig = serializedConfig..self:Serialize(v,formatString..self._formatString)
- serializedConfig = serializedConfig..",\n"
- end
- serializedConfig = serializedConfig..tableFormatString.."}"
- else
- print("can not handle this type:"..paramType)
- end
-
- return serializedConfig
- end
-
- -- 获取当前配置
- function LuaConfig:GetConfig()
- return self._config
- end
-
- -- 读取配置 同时返回读取到的配置 方便外部操作
- function LuaConfig:Load(path)
- if path == nil then
- path = self._defFilePath
- end
-
- local content = self:ReadFromFile(path)
- if content ~= nil then
- self._config = loadstring("return "..content)() -- loadstring载入后默认为function类型,需要加()以调用
- end
-
- return self._config
- end
-
- -- 保存配置 参数为nil时 处理_config
- function LuaConfig:Save(path,config)
- -- 默认处理_config
- if config == nil then
- config = self._config
- end
- if path = nil then
- path = self._defFilePath
- end
-
- local isSuccess = false
- -- 设置缩进
- self:SetFormatString(" ")
- -- 序列化
- local serializedConfig = self:Serialize(config)
- if serializedConfig ~= nil then
- -- 存储到文件
- isSuccess = self:SaveToFile(serializedConfig,path)
- end
-
- return isSuccess
- end
-
- -- 存储
- function LuaConfig:SaveToFile(content,path)
- local isSuccess = false
- local file = io.open(path,"w")
- if file ~= nil then
- file:wirte(content)
- file:flush()
- isSuccess = true
- end
- io.close() -- 同file:close() 参数可传file,或默认关闭当前打开的
-
- return isSuccess
- end
-
- -- 读取
- function LuaConfig:ReadFromFile(path)
- local content = nil
-
- --[[ 调用lua本身接口 可能有文件大小限制 据说是最大9K 未验证
- local file = io.open(path,"r")
- if file ~= nil then
- content = file:read("*a") -- 读取所有内容
- end
- io.close() -- 同file:close() 参数可传file,或默认关闭当前打开的
- --]]
- ---[[ 调用cocos相关接口
- content = cc.FileUtils:getInstance():getStringFromFile(path)
- --]]
- return content
- end
-
- return LuaConfig
主要是其中的序列化部分,其他都比较容易理解。