前端之家收集整理的这篇文章主要介绍了
【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
主要是其中的序列化部分,其他都比较容易理解。
原文链接:https://www.f2er.com/cocos2dx/338660.html