2014-12-13 14 views
5

Ho 2 file Lua diversi, main.lua e game_model.lua. Sto cercando di salvare alcuni dettagli in un file JSON (Ho cercato su google che l'utilizzo di un file JSON sarebbe il modo migliore per salvare le impostazioni di un utente e il punteggio), ma sto ottenendo il seguente errore:Tentativo di indicizzare locale (valore booleano)

Error: File: main.lua Line: 11 Attempt to index local 'game' (a boolean value)

Perché sto ricevendo questo errore e come posso risolverlo?

Ecco il codice nel mio main.lua:

--Main.lua 

display.setStatusBar(display.HiddenStatusBar) 

local composer = require("composer") 
local game = require("data.game_model") 

myGameSettings = {} 
myGameSettings.highScore = 1000 
myGameSettings.soundOn = true 
myGameSettings.musicOff = true 
myGameSettings.playerName = "Andrian Gungon" 
game.saveTable(myGameSettings, "mygamesettings.json") 

composer.gotoScene("scripts.menu") 

game_model.lua (nel data sottodirectory) contiene questo codice:

--game_model.lua (located at data/game_model.lua) 

local json = require("json") 

function saveTable(t, filename) 
    local path = system.pathForFile(filename, system.DocumentsDirectory) 
    local file = io.open(path, "w") 
    if (file) then 
     local contents = json.encode(t) 
     file:write(contents) 
     io.close(file) 
     return true 
    else 
     print("Error!") 
     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 contents = file:read("*a") 
     myTable = json.decode(contents); 
     io.close(file) 
     return myTable 
    end 
    return nil 
end 

risposta

8

Ciò significa che il modulo data.game_model non ha restituito nulla quando era caricato.
In questo caso, require restituisce true.

1

Per risolvere il problema identificato in lhf's answer, potete mettere i vostri funzioni di risparmio e di carico della tabella in una tabella che viene restituito dalla data.game_model, in questo modo:

-- Filename: data/game_model.lua 

local model = {} 

local json = require("json") 

function model.saveTable(t, filename) 
    -- code for saving 
end 

function model.loadTable(filename) 
    -- code for loading 
end 

return model 

Si noti inoltre che un errore comune sarebbe quello di dichiarare le funzioni come model:saveTable(t, fn) invece di model.saveTable(t, fn). Ricorda, il primo è zucchero sintattico per model.saveTable(model, t, fn).

Ora la variabile game in local game = require("data.game_model") deve essere inizializzata su una tabella contenente le funzioni. Si può facilmente controllare questo:

local game = require("data.game_model") 

print(type(game)) 
for k,v in pairs(game) do 
    print(k,v) 
end 

produce un output simile:

table 
loadTable function: 0x7f87925afa50 
saveTable function: 0x7f8794d73cf0 
2

Usa codice di seguito per salvare/caricare. Tutto il codice proviene da github/robmiracle.

local M = {} 
local json = require("json") 
local _defaultLocation = system.DocumentsDirectory 
local _realDefaultLocation = _defaultLocation 
local _validLocations = { 
    [system.DocumentsDirectory] = true, 
    [system.CachesDirectory] = true, 
    [system.TemporaryDirectory] = true 
} 

function M.saveTable(t, filename, location) 
    if location and (not _validLocations[location]) then 
    error("Attempted to save a table to an invalid location", 2) 
    elseif not location then 
     location = _defaultLocation 
    end 

    local path = system.pathForFile(filename, location) 
    local file = io.open(path, "w") 
    if file then 
     local contents = json.encode(t) 
     file:write(contents) 
     io.close(file) 
     return true 
    else 
     return false 
    end 
end 

function M.loadTable(filename, location) 
    if location and (not _validLocations[location]) then 
    error("Attempted to load a table from an invalid location", 2) 
    elseif not location then 
     location = _defaultLocation 
    end 
    local path = system.pathForFile(filename, location) 
    local contents = "" 
    local myTable = {} 
    local file = io.open(path, "r") 
    if file then 
     -- read all contents of file into a string 
     local contents = file:read("*a") 
     myTable = json.decode(contents); 
     io.close(file) 
     return myTable 
    end 
    return nil 
end 

function M.changeDefault(location) 
    if location and (not location) then 
     error("Attempted to change the default location to an invalid location", 2) 
    elseif not location then 
     location = _realDefaultLocation 
    end 
    _defaultLocation = location 
    return true 
end 

function M.print_r (t) 
    local print_r_cache={} 
    local function sub_print_r(t,indent) 
     if (print_r_cache[tostring(t)]) then 
      print(indent.."*"..tostring(t)) 
     else 
      print_r_cache[tostring(t)]=true 
      if (type(t)=="table") then 
       for pos,val in pairs(t) do 
        if (type(val)=="table") then 
         print(indent.."["..pos.."] => "..tostring(t).." {") 
         sub_print_r(val,indent..string.rep(" ",string.len(pos)+8)) 
         print(indent..string.rep(" ",string.len(pos)+6).."}") 
        elseif (type(val)=="string") then 
         print(indent.."["..pos..'] => "'..val..'"') 
        else 
         print(indent.."["..pos.."] => "..tostring(val)) 
        end 
       end 
      else 
       print(indent..tostring(t)) 
      end 
     end 
    end 
    if (type(t)=="table") then 
     print(tostring(t).." {") 
     sub_print_r(t," ") 
     print("}") 
    else 
     sub_print_r(t," ") 
    end 
    print() 
end 

M.printTable = M.print_r 

return M 

Uso

local loadsave = require("loadsave") 

myTable = {} 
myTable.musicOn = false 
myTable.soundOn = true 

loadsave.saveTable(myTable, "myTable.json") 
+0

Grazie per la risposta ... :) –

Problemi correlati