2014-12-13 11 views
5

Ich habe 2 verschiedene Lua-Dateien, main.lua und game_model.lua. Ich versuche, einige Details in einer JSON-Datei zu speichern (I gegoogelt, dass eine JSON-Datei wäre der beste Weg, die Einstellungen eines Benutzers und Punkte speichern), aber ich bin immer folgende Fehlermeldung:Versuch zu indizieren lokal (ein boolescher Wert)

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

Warum bekomme ich diesen Fehler und wie kann ich ihn beheben? Hier

ist der Code in meinem 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 (im data Unterverzeichnis) enthält dieser Code:

--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 

Antwort

8

Es bedeutet, dass das Modul data.game_model nichts zurück haben, als es war geladen.
In diesem Fall gibt requiretrue zurück.

1

das Problem in lhf's answer identifiziert Um dies zu beheben, können Sie Ihre Tabelle Speichern und Laden-Funktionen in einer Tabelle setzen, die von data.game_model, wie dies zurückgegeben wird:

-- 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 

Beachten Sie auch, dass ein häufiger Fehler zu erklären wäre, die Funktionen wie model:saveTable(t, fn) anstelle von model.saveTable(t, fn). Denken Sie daran, der erste ist syntaktischer Zucker für model.saveTable(model, t, fn).

Nun muss die Variable game in local game = require("data.game_model") mit einer Tabelle initialisiert werden, die Ihre Funktionen enthält. Sie können dies leicht überprüfen:

local game = require("data.game_model") 

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

Erzeugt eine Ausgabe wie:

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

Benutzen Sie den Code unten zu speichern/laden. Der gesamte Code stammt von 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 

Nutzungs

local loadsave = require("loadsave") 

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

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

Vielen Dank für Ihre Antwort ... :) –

Verwandte Themen