Lua - 尝试索引本地'item'(函数值)

时间:2015-07-21 20:22:27

标签: lua

我收到了这个错误,我无法弄清楚它是否是一个范围问题,一个逻辑问题,或者其他什么。用C语言来说,目标是修改模块中的指针以改变draw()命令的行为。错误来自的地方是:

function M.draw()
  for k, item in pairs(M.buttons.current) do
    love.graphics.setColor(M.buttons.bkg_color)
    love.graphics.rectangle("fill", item.pos_x, item.pos_y, M.buttons.size_x, M.buttons.size_y)
    love.graphics.setColor(M.buttons.txt_color)
    --TODO: center text on button
    love.graphics.print(item.text, item.pos_x+10, item.pos_y+10)
  end
end

此功能在第一个菜单中有效,但当我单击按钮更改菜单时,错误会在love.graphics.rectangle(...)行中弹出。更改M.buttons.current的代码是:

function M.mousereleased(x, y, button)
  if button == 'l' and M.buttons.buttonPressedFlag and M.mouseCollide(x,y,M.buttons.buttonPressed) then
    M.buttons.buttonPressed.fun()
  end
  M.buttons.buttonPressedFlag = false
end

和我点击的按钮是在初始化期间使用:

定义的
M.formButton( M.buttons.main,
              "options",
              GLOBAL_SETTINGS.resolution_x/2-M.buttons.size_x,
              GLOBAL_SETTINGS.resolution_y/7*5-M.buttons.size_y,
              M.buttons.size_x,
              M.buttons.size_y,
              "Options",
              function() M.buttons.current = M.buttons.main.options end )

其中M.formButton定义在模块的顶部:

function M.formButton(menu, buttonName, pos_x, pos_y, size_x, size_y, text, fun)
  menu[buttonName].pos_x = pos_x
  menu[buttonName].pos_y = pos_y
  menu[buttonName].size_x = size_x
  menu[buttonName].size_y = size_y
  menu[buttonName].text = text
  menu[buttonName].fun = fun
end

应该在新菜单中的每个按钮都是类似地定义的。 作为参考,模块结构的原型是:

local M = {buttons = { main = { campaign =    { newgame =  {},
                                                continue = {},
                                                load =     {},
                                                back =     {} },
                                freeplay =    { newgame =  {},
                                                continue = {},
                                                load =     {},
                                                custom =   {},
                                                back =     {} },
                                multiplayer = { lan =      { newgame = {},
                                                             load =    {},
                                                             back =    {}, },
                                                hotseat =  { newgame = {},
                                                             load =    {},
                                                             back =    {}, },
                                                network =  { newgame = {}, 
                                                             load =    {},
                                                             back =    {} } },
                                options =    {  audio =    {},
                                                display =  {},
                                                gameplay = {},
                                                language = {} },
                                exitgame =   {} } } }

我很确定问题是来自mouseReleased函数的第三行,结合我实例化按钮的方式,但我无法弄清楚问题是什么。这可能是一件令人沮丧的事情,我很遗憾,因为我对这门语言很新,但任何帮助都会受到赞赏。

1 个答案:

答案 0 :(得分:0)

您可能会在某处覆盖M.buttons.optionsM.buttons.current,将其更改为功能值。尝试在函数调用之间定期添加print(type(M.buttons.current), type(M.buttons.options)) - 您应该能够将其缩小到违规代码。