1

我有以下功能

不工作:

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'
4

5 回答 5

4

这条线的解释:

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

此行调用onPlayBtnRelease("loadscene1")并将返回值分配给 field 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")
于 2013-09-21T15:17:09.857 回答
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是一个事件侦听器函数,因此应将其声明为采用单个参数的函数,该参数是触发事件:

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
    }
于 2013-09-19T15:43:17.173 回答
1

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

planet1 = widget.newButton { -- then initialize as usuall
 }
planet1.next_scene = "loadscene1"
于 2013-09-20T07:48:12.303 回答
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"
}

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

于 2013-09-19T15:58:22.380 回答
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"
于 2016-03-01T10:08:09.977 回答