在lua中调用函数并传递参数

在lua中调用函数并传递参数,lua,coronasdk,Lua,Coronasdk,我有以下功能 不起作用: 我想传递一个参数,以便加载适当的级别,因此我有以下按钮: planet1 = widget.newButton{ label="1", labelColor = { default={255}, over={128} }, fontSize=25, defaultFile="levelplanet.png", overFile="levelplanet-over.png", widt

我有以下功能

不起作用:

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

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?知道这会导致编译错误的原因吗

错误:


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

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似乎是一个函数,因此应该将其声明为一个函数,并使用一个参数作为触发事件:

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
    }

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

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似乎是一个函数,因此应该将其声明为一个函数,并使用一个参数作为触发事件:

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
    }

不知道您是否可以使用一些非标准选项构建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"
}
onRelease = function() return onPlayBtnRelease("loadscene1") end
onRelease = newclosure(onPlayBtnRelease, "loadscene1")

如果它不起作用,那么表侦听器就是您正在寻找的对象。

想知道,您是否可以使用一些非标准选项构建小部件对象,而不必像这样将其包装到另一个表中:

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"
}
onRelease = function() return onPlayBtnRelease("loadscene1") end
onRelease = newclosure(onPlayBtnRelease, "loadscene1")

如果它不起作用,那么您需要的就是表侦听器。

是否可以将所需的数据关联到构造函数之外?例如:

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

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

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

对这一行的解释:

onRelease = onPlayBtnRelease("loadscene1")  -- event listener function
此行调用onPlayBtnReleaseloadscene1并将返回值分配给onRelease字段。因此,您可能需要这样做:

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"
}
onRelease = function() return onPlayBtnRelease("loadscene1") end
onRelease = newclosure(onPlayBtnRelease, "loadscene1")
如果你需要经常这样做,你可以做一个闭包生成器

local function newclosure(func, ...)
    local args = {...}
    return function()
        return func(unpack(args));
    end
end
这样,您只需这样写一行:

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"
}
onRelease = function() return onPlayBtnRelease("loadscene1") end
onRelease = newclosure(onPlayBtnRelease, "loadscene1")

对这一行的解释:

onRelease = onPlayBtnRelease("loadscene1")  -- event listener function
此行调用onPlayBtnReleaseloadscene1并将返回值分配给onRelease字段。因此,您可能需要这样做:

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"
}
onRelease = function() return onPlayBtnRelease("loadscene1") end
onRelease = newclosure(onPlayBtnRelease, "loadscene1")
如果你需要经常这样做,你可以做一个闭包生成器

local function newclosure(func, ...)
    local args = {...}
    return function()
        return func(unpack(args));
    end
end
这样,您只需这样写一行:

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"
}
onRelease = function() return onPlayBtnRelease("loadscene1") end
onRelease = newclosure(onPlayBtnRelease, "loadscene1")

试试这个,肯定会有用的

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"

试试这个,肯定会有用的

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"

你能告诉我们确切的编译错误吗?您使用的是哪个小部件库版本?@Kamiccolo I更新了帖子,输入了准确的错误消息。将onRelease=onPlayBtnReleaseloadscene1-事件侦听器函数替换为onRelease=onPlayBtnReleaseloadscene1函数end@EgorSkriptunoff直到情节提要的调用。gotoScene级别,淡出,500则应为字符串,但级别为表。有什么想法吗?你能告诉我们确切的编译错误吗?您使用的是哪个小部件库版本?@Kamiccolo I更新了帖子,输入了准确的错误消息。将onRelease=onPlayBtnReleaseloadscene1-事件侦听器函数替换为onRelease=onPlayBtnReleaseloadscene1函数end@EgorSkriptunoff直到情节提要的调用。gotoScene级别,淡出,500则应为字符串,但级别为表。有什么想法吗?但在第一种情况下,如果存在错误,我在函数定义中有参数列表。我知道这是可行的,但我想实现的是在所有级别上都有一个函数,在onPlayBtnRelease中,使用if语句根据函数定义中的参数选择要加载的级别。这可能吗?@AvraamMavridis您无法控制传递给该侦听器的参数,因为它是由事件循环调用的。侦听器被传递一个参数,该参数是触发的事件。要找到替代方案,您必须告诉我们当前级别的信息存储在哪里。是在全球范围内吗?它是否在一个从侦听器定义可见的本地中?但是在第一种情况下,如果存在错误,我在函数定义中有参数列表,我知道这是可行的,但我想要实现的是,在onPlayBtnRelease和onPlayBtnRelease-use-if语句中为所有级别提供一个函数,以根据函数定义中的参数选择要加载的级别。这可能吗?@AvraamMavridis您无法控制传递给该侦听器的参数,因为它是由事件循环调用的。侦听器被传递一个参数,该参数是触发的事件。要找到替代方案,您必须告诉我们当前级别的信息存储在哪里。是在全球范围内吗?是在当地的whi吗 ch在侦听器定义中可见?planet1.next_scene=loadscene1如何?无聊的。。。还是要避免包装…:那么planet1.next_scene=loadscene1呢?无聊的。。。还是要避免包装…: