【问题标题】:Calling a function in lua passing a parameter在lua中调用函数传递参数
【发布时间】:2016-03-01 18:08:09
【问题描述】:

我有以下功能

不起作用:

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'

【问题讨论】:

  • 您能告诉我们确切的编译错误吗?您使用的是哪个 Widget 库版本?
  • @Kamiccolo 我更新了贴出确切错误消息的帖子。
  • 用onRelease = function() onPlayBtnRelease("loadscene1") end替换onRelease = onPlayBtnRelease("loadscene1") -- event listener function
  • @EgorSkriptunoff 一直有效,直到调用 storyboard.gotoScene( level, "fade", 500 ) 然后是一个字符串,但 level 是一个表。有什么想法吗?

标签: lua coronasdk


【解决方案1】:

这一行的解释:

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")

【讨论】:

    【解决方案2】:

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

    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
        }
    

    【讨论】:

    • 但在第一种情况下,存在错误,我在函数定义中有参数列表
    • 我知道这行得通,但我想要实现的是为所有级别 onPlayBtnRelease 和 onPlayBtnRelease 内部使用一个功能,使用 if 语句根据参数选择要加载的级别在函数定义中。这可能吗?
    • @AvraamMavridis 您无法控制传递给该侦听器的参数,因为它是由“事件循环”调用的。侦听器被传递给作为触发事件的单个参数。要找到替代方案,您必须告诉我们您将当前级别的信息存储在何处。它在全球范围内吗?它是否在从侦听器 definition 可见的本地?
    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

      想知道,如果您可以使用一些非标准选项构建 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>

      【讨论】:

      • planet1.next_scene = "loadscene1" 呢?嗯...仍然想避免包装... :)
      【解决方案5】:

      试试这个肯定会奏效的。

      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"
      

      【讨论】:

        猜你喜欢
        • 2013-02-13
        • 2016-08-19
        • 2018-10-11
        • 2012-12-16
        • 2013-10-10
        • 2013-01-08
        • 2013-06-03
        • 1970-01-01
        • 2012-01-25
        相关资源
        最近更新 更多