2016-03-15 1 views
0

У меня есть куча переменных, таких как «Модернизация куплена», «Сумма денег» и т. Д. Я хочу наиболее эффективный способ сохранить эти переменные и загрузить их при запуске игры, так как вы даже не вышли из игры (каждый вещь остается той же). Итак, все настройки и переменные остаются неизменными до тех пор, пока вы не перезагрузите игру.Каков наилучший способ сохранить и загрузить переменные?

Я спрашиваю, так как я думаю, что это огромная и очень важная часть, и я хочу начать с лучшей техники.

Каковы ваши предложения и как я могу реализовать это в своей игре?

+1

Сохраните эти значения в файле и загрузите их при необходимости. проверьте json на простой способ хранения lua-таблиц. относительно вашего вопроса смотрите [ask] или возьмите [тур] – Piglet

+1

@Piglet: вы можете использовать * Lua * для хранения таблиц Lua. Использование JSON для хранения таблиц Lua просто ... глупо. –

+0

@ НикольБолас, и не могли бы вы просветить меня, почему это так глупо? – Piglet

ответ

1

Вы можете сохранить их в виде полей таблицы, а затем сериализовать таблицу, используя один из many options for serializers. См. Также Serialization chapter в Программирование в Lua.

+0

Итак, в основном, я поместил все мои переменные в таблицу и сохранил таблицу. После запуска моего приложения я загружаю эту таблицу из какого-то файла? – FICHEKK

+0

@FICHEKK да. так просто – Piglet

0

Есть два способа сделать довольно легко:

Используя простой текстовый файл, сохраненный на DocumentDirectory:

local filePath = system.pathForFile("data.txt", system.DocumentsDirectory) 
local file = io.open(filePath, "r") 
if file then 
    -- read all contents of file into a string 
    local contents = file:read("*a") 

    print("Contents of " .. filePath) 
    print(contents) 

    io.close(file) 

    local t = display.newText("Contents of ", 5, 80, nil, 16); 
    t:setFillColor(1, 1, 136/255); 
    local t = display.newText(filePath, 5, 100, nil, 10); 
    t:setFillColor(1, 1, 136/255); 

    local ylast = 130 
    for line in io.lines(filePath) do 
     local t = display.newText(line, 15, ylast, nil, 14); 
     t:setFillColor(1, 1, 1); 
     ylast = ylast + 20 
    end 

else 
    print("Creating file...") 

    -- create file b/c it doesn't exist yet 
    file = io.open(filePath, "w") 
    file:write("Feed me data!\n") 
    local numbers = {1,2,3,4,5,6,7,8,9} 
    file:write(numbers[1], numbers[2], numbers[3], "\n") 
    for _,v in ipairs(numbers) do 
     file:write(v, " ") 
    end 
    file:write("\nNo more data\n") 
    io.close(file) 

    local t = display.newText("Created file at:", 5, 80, nil, 16); 
    t:setFillColor(1, 1, 136/255); 
    local t = display.newText(filePath, 5, 100, nil, 10); 
    t:setFillColor(1, 1, 136/255); 
    local t = display.newText("Run app again to test file read.", 5, 130, nil, 12); 
    t:setFillColor(1, 1, 136/255); 

    -- This removes the file just created 
    -- os.remove(filePath) 
end 

2) с помощью SQLite файл, сохраненный на DocumentDirectory:

--Include sqlite 
require "sqlite3" 
--Open data.db. If the file doesn't exist it will be created 
local path = system.pathForFile("data.db", system.DocumentsDirectory) 
db = sqlite3.open(path) 

--Handle the applicationExit event to close the db 
local function onSystemEvent(event) 
     if(event.type == "applicationExit") then    
      db:close() 
     end 
end 

--Setup the table if it doesn't exist 
local tablesetup = [[CREATE TABLE IF NOT EXISTS test (id INTEGER PRIMARY KEY, content, content2);]] 
print(tablesetup) 
db:exec(tablesetup) 

--Add rows with a auto index in 'id'. You don't need to specify a set of values because we're populating all of them 
local testvalue = {} 
testvalue[1] = 'Hello' 
testvalue[2] = 'World' 
testvalue[3] = 'Lua' 
local tablefill =[[INSERT INTO test VALUES (NULL, ']]..testvalue[1]..[[',']]..testvalue[2]..[['); ]] 
local tablefill2 =[[INSERT INTO test VALUES (NULL, ']]..testvalue[2]..[[',']]..testvalue[1]..[['); ]] 
local tablefill3 =[[INSERT INTO test VALUES (NULL, ']]..testvalue[1]..[[',']]..testvalue[3]..[['); ]] 
db:exec(tablefill) 
db:exec(tablefill2) 
db:exec(tablefill3) 

--print the sqlite version to the terminal 
print("version " .. sqlite3.version()) 

--print all the table contents 
for row in db:nrows("SELECT * FROM test") do 
    local text = row.content.." "..row.content2 
    local t = display.newText(text, 20, 120 + (20 * row.id), native.systemFont, 16) 
    t:setFillColor(1,0,1) 
end 

Вы также можете использовать облачную основу, которая практически одинакова с большей мобильностью.