【问题标题】:Corona SDK: Error: "attempt to index field "?" a nil value", but only when I am on a certain sceneCorona SDK:错误:“尝试索引字段”?“一个零值”,但仅当我在某个场景中时
【发布时间】:2014-08-15 04:35:57
【问题描述】:

所以我正在制作一款需要保存很多价值的游戏。我使用了 Rob Miracle 的一个模块,它可以很容易地保存和加载表来使用两个表来执行此操作。一个名为“gamestuff”,另一个名为“leveltries”。

在一个场景中,我声明了这些表的值(仅当它们之前没有保存时​​)

gamestuff.level = 1
        gamestuff.sound = true
        gamestuff.name = "user"
        gamestuff.highscore = 0
        gamestuff.lastscore = 0
        gamestuff.volume = 0.5
        gamestuff.lastlevel = 1
        gamestuff.won = false
        gamestuff.bouncesleft = 0

        local leveltries = {
            {tries =0, wins = 0, fails = 0, retries = 0, bouncesleft = 0, bestbounces = 0, score = 0},
            {tries =0, wins = 0, fails = 0, retries = 0, bouncesleft = 0, bestbounces = 0, score = 0},
            {tries =0, wins = 0, fails = 0, retries = 0, bouncesleft = 0, bestbounces = 0, score = 0},
            {tries =0, wins = 0, fails = 0, retries = 0, bouncesleft = 0, bestbounces = 0, score = 0},
            {tries =0, wins = 0, fails = 0, retries = 0, bouncesleft = 0, bestbounces = 0, score = 0},
            {tries =0, wins = 0, fails = 0, retries = 0, bouncesleft = 0, bestbounces = 0, score = 0},
            {tries =0, wins = 0, fails = 0, retries = 0, bouncesleft = 0, bestbounces = 0, score = 0},
            {tries =0, wins = 0, fails = 0, retries = 0, bouncesleft = 0, bestbounces = 0, score = 0},
            {tries =0, wins = 0, fails = 0, retries = 0, bouncesleft = 0, bestbounces = 0, score = 0},
            {tries =0, wins = 0, fails = 0, retries = 0, bouncesleft = 0, bestbounces = 0, score = 0},


        }
        loadsave.saveTable(leveltries, "leveltries.json")
    loadsave.saveTable(gamestuff, "gamestuff.json")

这很好用,除非我尝试在第一关之后进入重新启动关卡场景和胜利场景。

但这让我很困惑,因为我在第一级尝试过

        print("Fails: "..leveltries[gamestuff.lastlevel].fails)

它可以工作

但是当我在重启场景中尝试它时,它没有:

local storyboard = require( "storyboard" )
local scene = storyboard.newScene()
local loadsave = require("loadsave")

local gamestuff = {}
local leveltries = {}
local options =
{
    effect = "fade",
    time = 400
}

local function loader()
    gamestuff = loadsave.loadTable("gamestuff.json")
    leveltries = loadsave.loadTable("leveltries.json")
    print("loaded")
end

local function save()
    loadsave.saveTable(gamestuff, "gamestuff.json")
    loadsave.saveTable(leveltries, "leveltries.json")
end

function scene:createScene(event)

    gamestuff = {}
    leveltries = {}
end

function scene:enterScene(event)

    loader()
    print("Fails"..leveltries[gamestuff.lastlevel].fails) --says the error is here
    local a = leveltries[gamestuff.lastlevel].fails + 1
    leveltries[gamestuff.lastlevel].fails = a
    timer.performWithDelay( 50, function()
        save()
        storyboard.gotoScene("level"..tostring(gamestuff.lastlevel), options)
    end, 1 )

end

function scene:exitScene(event)
    local group = self.view
    storyboard.removeScene("restarter")

end

function scene:destroyScene(event)
    gamestuff = nil
    leveltries = nil
    options  = nil
end
scene:addEventListener( "createScene", scene )
scene:addEventListener( "enterScene", scene )
scene:addEventListener( "exitScene", scene )
scene:addEventListener( "destroyScene", scene )


return scene

谁能告诉我为什么上面的代码不起作用?

会不会是我没有正确删除level1中的“gamestuff”和“leveltries”?

我试着把一些照片放进去。在 1 级场景中:

一切正常:

print(gamestuff.lastlevel)

print(leveltries[gamestuff.lastlevel].fails)

print(leveltries[gamestuff.lastlevel])

但是在重启场景中,只有:

print(gamestuff.lastlevel) --which prints 1 and is right

作品

print(leveltries[gamestuff.lastlevel]),在restarter场景中打印nil

我不知道这怎么可能。我在两个场景中同时以相同的方式加载相同的表格并以相同的方式使用它们。

会不会是我错误地删除了表格?

在场景一中,这些是我的 exitScene 和 removeScene:

function scene:exitScene(event)
    Runtime:removeEventListener("touch", shoot)
    menub:removeEventListener("touch", gotomenu)
    restartb:removeEventListener("touch", restart)
    goal:removeEventListener("collision", win)
    ball:removeEventListener("collision", hit)
    ball:removeEventListener("collision", grow)
    Runtime:removeEventListener("enterFrame", twinkle)
    Runtime:removeEventListener("enterFrame", redraw)
end

function scene:didExitScene(event)
    --storyboard.removeScene("level1")
end

function scene:destroyScene(event)
    bg:removeSelf()
    ball:removeSelf()
    goal:removeSelf()
    topwall:removeSelf()
    bottomwall:removeSelf()
    rightwall:removeSelf()
    leftwall:removeSelf()
    menub:removeSelf()
    bounces = nil
    bouncestext:removeSelf()
    taps = nil
    restartb:removeSelf()
    tuttext:removeSelf()
    gamestuff = nil

    bg = nil
    ball = nil
    goal = nil
    topwall = nil
    bottomwall = nil
    rightwall = nil
    leftwall = nil
    menub = nil
    bouncestext = nil
    restartb = nil
    tuttext = nil
    options = nil
    trailprops = nil
    for i = 1, 3 do
        wallColor[i] = nil
    end


end

scene:addEventListener("createScene", scene)
scene:addEventListener("enterScene", scene)
scene:addEventListener("exitScene", scene)
scene:addEventListener("didExitScene", scene)
scene:addEventListener("destroyScene", scene)

【问题讨论】:

    标签: lua coronasdk null lua-table corona-storyboard


    【解决方案1】:

    我认为问题在于,您在场景开始时声明了 gamestuff 和 leveltries 数组。然后你再次在创建场景中声明它。您再次覆盖同一个数组。我认为这没有任何意义。删除在创建场景中声明的数组并尝试。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-05-15
      • 1970-01-01
      • 2014-03-26
      • 2018-04-13
      • 2016-09-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多