2015年5月12日 星期二

[Corona SDK] How can we store and retrieve the game setting data?

To store the data, we can use file:write() to write to the specified file.
After that, we can use file:read() to retrieve them.
However, the game setting data are recorded in table format in most cases.
The functions file:write() and file:read() are both accepted string type as the input/output.
We need to use json to encode table into string and decode string into table, as shown below:
local json = require("json")

function saveTable(myTable, filename)
    local path = system.pathForFile( filename, system.DocumentsDirectory)
    local file = io.open(path, "w")
    if file then
        local sTable = json.encode(myTable)--encode the table to string
        file:write( sTable )
        io.close( file )
        return true
    else
        return false
    end
end

function loadTable(filename)
    local path = system.pathForFile( filename, system.DocumentsDirectory)
    local contents = ""
    local myTable = {}
    local file = io.open( path, "r" )
    if file then         
         local sTable = file:read( "*a" )-- read the entire contents of the file
         myTable = json.decode(sTable)--decode the string back to table
         io.close( file )
         file = nil
         return myTable 
    end
    return nil
end

Next, how to use the above functions in our codes?
gameSettingsFileName = "mygamesettings.json"
currentSettingsVersion = 3

myGameSettings = loadTable("mygamesettings.json")
if(myGameSettings == nil or myGameSettings.version == nil or myGameSettings.version ~= currentSettingsVersion) then
        -- the default settings
 myGameSettings = {}
 myGameSettings.version = currentSettingsVersion
 myGameSettings.level = 2
 myGameSettings.speed = 5 
 saveTable(myGameSettings, gameSettingsFileName)
end

myGameSettings.level = myGameSettings.level+1
saveTable(myGameSettings, gameSettingsFileName)

[Corona SDK] 如何儲存和取出遊戲的設定資料?

要儲存資料,可以用file:write()寫到指定的檔案,
之後再用file:read()將它們讀出來,
不過,一般遊戲設定的資料通常都是以table方式來紀錄,
file:write()file:read() 卻是以string為input/output對象,
所以我們還另外需要json來幫忙將做tablestring的轉換:
local json = require("json")

function saveTable(myTable, filename)
    local path = system.pathForFile( filename, system.DocumentsDirectory)
    local file = io.open(path, "w")
    if file then
        local sTable = json.encode(myTable)--encode the table to string
        file:write( sTable )
        io.close( file )
        return true
    else
        return false
    end
end

function loadTable(filename)
    local path = system.pathForFile( filename, system.DocumentsDirectory)
    local contents = ""
    local myTable = {}
    local file = io.open( path, "r" )
    if file then         
         local sTable = file:read( "*a" )-- read the entire contents of the file
         myTable = json.decode(sTable)--decode the string back to table
         io.close( file )
         file = nil
         return myTable 
    end
    return nil
end
接下來,在程式中要如何使用呢?
gameSettingsFileName = "mygamesettings.json"
currentSettingsVersion = 3

myGameSettings = loadTable("mygamesettings.json")
if(myGameSettings == nil or myGameSettings.version == nil or myGameSettings.version ~= currentSettingsVersion) then
        -- the default settings
 myGameSettings = {}
 myGameSettings.version = currentSettingsVersion
 myGameSettings.level = 2
 myGameSettings.speed = 5 
 saveTable(myGameSettings, gameSettingsFileName)
end

myGameSettings.level = myGameSettings.level+1
saveTable(myGameSettings, gameSettingsFileName)