Corona Sdk - 有没有办法调用和分组:insert()来自另一个lua文件的对象?

时间:2014-02-28 02:50:21

标签: lua corona

如标题中所述,我不仅要从外部Lua文件中调用一个对象,而且我还希望group:insert()将此对象放入我的菜单页面,其中包含外部lua中的属性文件。这可能和/或有效吗?我真的很想确保在我的项目中不重复数据。

修改

到目前为止,这是我的代码: 组:insert()函数给我一个错误,指出它正在期待一个表,我可能一直试图调用一个函数,在这种情况下我应该使用“:”而不是“。”

这是menu.lua:

local storyboard = require( "storyboard" )
local scene = storyboard.newScene()
local widget = require "widget"
local m = require ("myData")
local menuFunction = require("menuFunction")
local menuSwipe

-- =======================
-- menuSwipe()
-- =======================
menuSwipe = function(self, event)
    local phase = event.phase
    local touchID = event.id


    if(phase == "began") then
    elseif(phase == "moved") then
    elseif(phase == "ended" or phase == "cancelled") then
        if(m.menuActivator > 0) then
            menuDown(m.invisiBar, event)
        else
            --m.layerInfo = layers
            transition.to( menuFunction.menuBar, { x = menuFunction.menuBar.x, y = 0, time = 200 } ) 
            --transition.to( layers, { x = menuFunction.menuBar.x, y = h, time = 100 } )
            m.invisiBar = display.newRect( 0,0,w,25,6)
            m.invisiBar.alpha = 0
            m.menuActivator = 1
        end
    end
end

-- ++++++++++++++++++++++
-- menuDown()
-- ++++++++++++++++++++++
function menuDown(self, event)
    local phase = event.phase
    local touchID = event.id

    if(phase == "began") then
    elseif(phase == "moved") then
    elseif(phase == "ended" or phase == "cancelled") then
        if(m.menuActivator == 1) then
            transition.to( menuFunction.menuBar, { x = m.menuInfo.x, y = h*.964, time = 200 } )
            --transition.to( group, { x = 0, y = 0, time = 10 } ) 
            m.menuActivator = 0
        end
    end
end

function scene:createScene( event )
    local group = self.view


    group:insert( menuFunction.menuBar ) -- *** ERROR occurs here


end

function scene:enterScene( event )
    local group = self.view 
end

function scene:exitScene( event )
    local group = self.view
end

function scene:destroyScene( event )
    local group = self.view
end

scene:addEventListener( "createScene", scene )
scene:addEventListener( "enterScene", scene )
scene:addEventListener( "exitScene", scene )
scene:addEventListener( "destroyScene", scene )

return scene

这是menuFunction.lua:

local m = require("myData")
local menu = require ("menu")

local w = display.contentWidth
local h = display.contentHeight

local menuFunction = {}
    --menuBar
    menuFunction.menuBar = display.newImage( "images/menuBar1.png")
    menuFunction.menuBar.x = w*(1/2)
    menuFunction.menuBar.y = h*1.465
    menuFunction.menuBar.height = h
    menuFunction.menuBar:setReferencePoint(display.TopLeftReferencePoint)
    menuFunction.menuBar.touch = menu.menuSwipe
    menuFunction.menuBar:addEventListener("touch", menuFunction.menuBar)

return menuFunction

这是确切的错误消息:

ERROR: table expected. If this is a function call, you might have used '.' instead of ':'
message**

2 个答案:

答案 0 :(得分:1)

这有几个问题,它们似乎都与您的错误无关,但修复它们也会修复错误或使错误原因更明显。请修正以下内容并更新:

  • 虽然Lua允许,但不要使用循环包含,其中A包含B,其中包含A.而不是菜单需要menuFunction,然后在menuFuntion中调用创建函数:

    -- menuFunction.lua
    local m = require("myData")
    -- require("menu") -- BAD! :)
    
    local w = display.contentWidth
    local h = display.contentHeight
    
    local menuBar = display.newImage( "images/menuBar1.png")
    menuBar.x = w*(1/2)
    menuBar.y = h*1.465
    menuBar.height = h
    menuBar:setReferencePoint(display.TopLeftReferencePoint)
    local menuFunction = { menuBar = menuBar }
    
    function createMenuBar(menuSwipe)
        menuFunction.menuBar.touch = menuSwipe
        menuFunction.menuBar:addEventListener("touch", menuFunction.menuBar)
        return menuFunction
    end
    
    -- menu.lua
    function createScene(event)
        local mf = require('menuFunction')
        mfFunction = mf.createMenuBar(menuSwipe)
        group:insert(menuFunction.menuBar)
    end
    
  • 其次,在对组的四次调用中:insert()前三个引用代码中未显示的对象,看不到与问题相关的内容,应删除它们或者如果您认为相关,评论为什么他们的代码现在显示,或显示他们的代码。

答案 1 :(得分:1)

每次调用此代码时是否会发生这种情况,或者是第一次出现任何机会然后崩溃?在您的情况下,代码可以在您第一次进入场景时工作,但第二次执行时,它可能会崩溃[如果您删除其间的场景]。

当你做“要求”时一个文件,其内容被执行,返回值保存在全局包表中。当您再次需要相同的文件时,返回的值将取自全局包表,而代码不会再次执行。

因此,如果您有任何机会在应用程序的某个位置需要此文件,然后调用:removeSelf()并且没有menuBar的引用,则将删除显示对象并且其引用将不再存在,并且调用再次要求,不会重新创建对象。完全删除场景也将删除显示对象。

所以你想要实现的是非常明智的[与@Schollii所说的相反],但你的"模块"如果你想在运行时删除它们,应该允许创建多个对象。

我不会更正你的代码,只是一个如何实现这个目标的简单例子:

-- menu.lua

local menuCreator = {}
menuCreator.newMenu = function(params)
    local menu = display.newGroup()
    -- create your menu here
    return menu
end
return menuCreator

现在随时都可以:

local menuCreator = require("menu.lua")

您可以致电:

local menu = menuCreator.newMenu(someParams)

在任何需要的地方为自己准备一个漂亮的新菜单。 如果它没有一直显示在屏幕上,那么最好在需要时创建一个新的,然后将其从内存中删除。