电晕。我无法从函数访问局部变量

时间:2013-04-17 16:55:06

标签: android lua corona

SDK Corona 我想执行 - > movboton:setSequence(“apretado”)< - 用于更改ImageSheet的序列。如果我在函数外部执行它,但是当我从函数中尝试时,它可以工作。我得到这个错误“99:尝试索引全局'movboton'(一个零值)”。

任何想法为什么? 感谢。

botonnormal = graphics.newImageSheet( "buttonstart.png", { width=340, height=338, numFrames=2 } )
botonapretado = graphics.newImageSheet ( "buttonstart.png", { width=340, height=338, numFrames=2 } )


local movboton
local seqBoton = {
    { name="normal", sheet=botonnormal, start=1, count=1, time=1000},
    { name="apretado", sheet=botonapretado, start=2, count=2, time=1100}
}

movboton = display.newSprite(botonnormal, seqBoton)
movboton.x = display.contentWidth / 2
movboton.y = display.contentHeight / 2
movboton.xScale = .5
movboton.yScale = .5

如果我把代码放在这里,它可以工作,但是从触摸屏时调用的函数来看,它给出了我的错误。

movboton:setSequence(“apretado”)
movboton:播放()

local function apretato(event)
    --print("apretado")
    if event.phase == "began" then
        print("start")
        --storyboard.gotoScene("game", "fade", 400)
        movboton:setSequence( "apretado" )
        movboton:play()
    end

end
function scene:enterScene(event)
   btninvisible:addEventListener( "touch", apretato )
end

以下是所有代码:

-- requerimientos


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

--Background

function scene:createScene(event)
    local screenGroup = self.view  

    local background = display.newImage("start.png")
    screenGroup:insert(background) 


    city2 = display.newImage("city2.png")
    city2:setReferencePoint(display.BottomLeftReferencePoint)
    city2.x = 0
    city2.y = 320
    screenGroup:insert(city2)  




    --PERSONAJE
    --Imagenes en forma de sheet
    botonnormal = graphics.newImageSheet( "buttonstart.png", { width=340, height=338, numFrames=2 } )
    botonapretado = graphics.newImageSheet ( "buttonstart.png", { width=340, height=338, numFrames=2 } )

    --Simulacion de andar del personaje
    local movboton
    local seqBoton = {
        { name="normal", sheet=botonnormal, start=1, count=1, time=1000},
        { name="apretado", sheet=botonapretado, start=2, count=2, time=1100}     --, loopCount =0
    }


    --Iniciamos
    movboton = display.newSprite(botonnormal, seqBoton)
    movboton.x = display.contentWidth / 2
    movboton.y = display.contentHeight / 2
    movboton.xScale = .5
    movboton.yScale = .5


    mybutton = display.newImage("button.png")
    mybutton.x = display.contentWidth /2
    mybutton.y = display.contentHeight -75
    mybutton.xScale = .3
    mybutton.yScale = .3

    btninvisible = display.newImage("botonopacityzero.png")
    btninvisible.x = display.contentWidth /2
    btninvisible.y = display.contentHeight /2
    btninvisible.xScale = .5
    btninvisible.yScale = .5
    btninvisible.alpha = 0.2 --opacidad

end


function start(event)
    if event.phase == "began" then
    --print("start")
    storyboard.gotoScene("game", "fade", 400)
end

end

local function apretato(event)
    --print("apretado")
    if event.phase == "began" then
        print("start")
        --storyboard.gotoScene("game", "fade", 400)
        movboton:setSequence( "apretado" )
        movboton:play()
    end

end

function scene:enterScene(event)

    --background:addEventListener("touch", start)

    mybutton:addEventListener( "touch", start )

    btninvisible:addEventListener( "touch", apretato )

end

function scene:exitScene(event)

    --background:removeEventListener("touch", start)
    mybutton:removeEventListener( "touch", start )
    --mybutton.destroy()

    mybutton:removeSelf()
    mybutton = nil

end

function scene:destroyScene(event)

end

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


return scene

1 个答案:

答案 0 :(得分:3)

据我所知,从未将movboton设置为任何内容,当您尝试拨打nil时,自然会movboton:setSequence( "apretado" )。无论你把它放在哪里,我都没有看到任何类似的调用会在这段代码中起作用......

如果您需要更多帮助,请显示更多代码。如果有一个工作的情况和它不起作用的情况,那么包括两者,以便我们可以比较。


两种情况下是否都有以下代码?

movboton = display.newSprite(botonnormal, seqBoton)
movboton.x = display.contentWidth / 2
movboton.y = display.contentHeight / 2
movboton.xScale = .5
movboton.yScale = .5

你的原帖不存在。如果没有该代码,您将收到错误。当您包含上面显示的代码时,它是否仍然失败并出现相同的错误?当您尝试运行它时,是否可以完全按照文件中的方式显示整个代码?


好的,现在很明显为什么它是nil

movboton变量在local函数中声明为 createScene

function scene:createScene(event)
    ...
    local movboton
    ...
end

local关键字告诉Lua此变量仅在上面的函数中 。这意味着如果您尝试从外部那个功能访问movboton,那么Lua将无法找到它。就Lua而言,movboton代码块之外没有名为createScene的变量。

您的movboton:setSequence( "apretado" ) createScene函数,因此,就Lua而言,此时没有变量movboton在代码中,所以你得到的是nil(意思是什么)。

您需要做的是更改代码,以便从movboton函数中看到apretato。最简单的方法是将local movboton行移至local scene = storyboard.newScene()下方

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

如果在那里声明它,那么它在包含apretato的范围内声明,这意味着apretato将能够看到它。

You can read more about scopes in Lua here.范围是一个在或多或少所有编程语言中都非常重要的概念,因此花时间并尝试理解它们的工作原理是值得的。

祝你好运:)