0

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

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

movboton:setSequence("pretado")
movboton:play()

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
4

1 回答 1

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

关键字告诉 Lua这个local变量只在上面的函数内部可用。这意味着如果您尝试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它将能够看到它。

你可以在这里阅读更多关于Lua作用域的信息。作用域是一个或多或少在所有编程语言中都非常重要的概念,因此值得花时间尝试了解它们的工作原理。

祝你好运 :)

于 2013-04-17T20:12:21.717 回答