我有以下功能
不工作:
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'
答案 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"
}
如果它不起作用,表听众就是你正在寻找的。 p>
答案 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"