在 Lua 中调用一个函数,传递一个参数。

我有以下函数

不能工作:

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”?为什么会导致编译错误?

错误:

运行时错误
错误的参数#1到“find”(需要字符串,得到表)
堆栈跟踪:
        [C]:?
        [C]:在函数“error”中
        ?:在函数“gotoScene”中
点赞
用户2633423
用户2633423

错误很可能是因为在函数定义中缺少参数列表,代码如下:

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
    }
2013-09-19 15:43:17
用户1150918
用户1150918

想知道是否可以创建一个具有某些非标准选项的 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-19 15:58:22
用户2481172
用户2481172

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

planet1 = widget.newButton { -- 然后像平常一样初始化
 }
planet1.next_scene = "loadscene1"
2013-09-20 07:48:12
用户1244588
用户1244588

解释这一行代码:

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")
2013-09-21 15:17:09
用户2902517
用户2902517

尝试这个,它肯定能够工作。

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-01 10:08:09