0

SDK Corona 実行したい --> movboton:setSequence( "apretado" ) <-- ImageSheet の Sequence の変更用。関数の外で実行すると機能しますが、関数から実行すると機能します。「99: グローバル 'movboton' (nil 値) のインデックスを作成しようとしています」というエラーが表示されます。

理由はありますか?ありがとう。

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( "apretado" )
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

このキーワードは、この変数が上記の関数localでのみ使用可能であることを Lua に伝えます。つまり、その関数の外からアクセスしようとしても、Lua はそれを見つけられません。Lua に関する限り、コード ブロックの外側に名前が付けられた変数はありません。movbotonmovbotoncreateScene

あなたのmovboton:setSequence( "apretado" )行は関数の外側にあるcreateSceneため、Lua に関する限り、movbotonコードのその時点には変数がないため、nil代わりに (means nothing) を取得します。

あなたがする必要があるのは、関数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 に答える