在lua中调用函数传递参数

时间:2013-09-19 15:12:40

标签: lua corona

我有以下功能

不工作:

local function onPlayBtnRelease(level)
    storyboard.gotoScene( level, "fade", 500 )
    return true 
end

我想传递一个参数,以便加载适当的级别,所以我有以下按钮:

planet1 = widget.newButton{
    label="1",
        labelColor = { default={255}, over={128} },
        fontSize=25,
        defaultFile="levelplanet.png",
        overFile="levelplanet-over.png",
        width=62, height=62,
        onRelease = onPlayBtnRelease("loadscene1")  -- event listener function
    }

但上述情况不起作用。

没关系:

如果我这样做

local function onPlayBtnRelease
    storyboard.gotoScene( "loadscene1", "fade", 500 )
    return true 
end


planet1 = widget.newButton{
        label="1",
            labelColor = { default={255}, over={128} },
            fontSize=25,
            defaultFile="levelplanet.png",
            overFile="levelplanet-over.png",
            width=62, height=62,
            onRelease = onPlayBtnRelease    
        }

它编译。如何将参数传递给onPlayBtnRelease?知道为什么会导致编译错误吗?

错误:

Runtime error
bad argument #1 to 'find' (string expected, got table)
stack traceback:
        [C]: ?
        [C]: in function 'error'
        ?: in function 'gotoScene'

5 个答案:

答案 0 :(得分:3)

这一行的解释:

onRelease = onPlayBtnRelease("loadscene1")  -- event listener function

此行调用onPlayBtnRelease("loadscene1")并将返回值分配给字段onRelease。所以,你可能需要的是这样做:

onRelease = function() return onPlayBtnRelease("loadscene1") end

如果你需要做很多事情,你可以制作一个这样的闭包生成器

local function newclosure(func, ...)
    local args = {...}
    return function()
        return func(unpack(args));
    end
end

这样你只需写下这样的一行:

onRelease = newclosure(onPlayBtnRelease, "loadscene1")

答案 1 :(得分:1)

错误很可能是由以下原因引起的:

local function onPlayBtnRelease
    storyboard.gotoScene( "loadscene1", "fade", 500 )
    return true 
end

因为函数定义中缺少参数列表。

错误可能与此类似,我想:

G:\root\main\core\Lua/app/lua51/bin/lua.exe: lua_08.lua:5: 
 '(' expected near 'storyboard'

根据您发布的内容,似乎onPlayBtnRelease是一个event listener函数,因此它应该被声明为一个函数,它接受一个触发事件的参数:

local function onPlayBtnRelease(event)
    // ... code ...
    return true 
end

修改

onRelease字段必须是监听器,而不是调用它时返回的结果。试试这个:

planet1 = widget.newButton{
    label="1",
        labelColor = { default={255}, over={128} },
        fontSize=25,
        defaultFile="levelplanet.png",
        overFile="levelplanet-over.png",
        width=62, height=62,
        onRelease = onPlayBtnRelease
    }

答案 2 :(得分:1)

也许可以在构造函数之外关联需要的数据?例如:

planet1 = widget.newButton { -- then initialize as usuall
 }
planet1.next_scene = "loadscene1"

答案 3 :(得分:0)

想知道,如果您可以使用一些非标准选项构建Widget对象而不将其包装到另一个表中,如下所示:

local function onPlayBtnRelease(event)
    storyboard.gotoScene(event.target.next_scene, "fade", 500 )
    return true 
end


planet1 = widget.newButton{
        label="1",
        labelColor = { default={255}, over={128} },
        fontSize=25,
        defaultFile="levelplanet.png",
        overFile="levelplanet-over.png",
        width=62, height=62,
        next_scene = "loadscene1"
}

如果它不起作用,表听众就是你正在寻找的。

答案 4 :(得分:0)

试试这个它肯定会起作用。

local onPlayBtnRelease = function(event)
    storyboard.gotoScene(event.target.myScene, "fade", 500 )
    return true 
end


planet1 = widget.newButton{
    label="1",
    labelColor = { default={255}, over={128} },
    fontSize=25,
    defaultFile="levelplanet.png",
    overFile="levelplanet-over.png",
    width=62, height=62,
    onRelease = onPlayBtnRelease
}
planet1.myScene = "yourSceneName"