如何在 Corona SDK 中将自定义方法添加到 displayobject

我想添加自定义方法来显示对象,就像预置方法一样,例如“setFillColor”

我编写了以下代码,但不起作用;但是,它解释了我需要什么

function display:foo(bar)
    print(bar)
end

local myRectangle = display.newRect(0, 0, 150, 50)
myRectangle:foo("要打印的内容")

我希望“foo”方法适用于所有 DisplayObjects,而不仅仅是 myRectangle?

点赞
用户1300186
用户1300186

以下是示例。未经测试但应该有效。然后将可用于所有 newRect 调用。但是,您必须对所有 display.* 调用执行此操作,如果您希望使用。

local oldNewRect = display.newRect

function display.newRect( ... )
    local rect = oldNewRect( ... )

    function rect:foo( str )
        print( str )
    end

    return rect
end

-- 用法
local rect = display.newRect( 0, 0, 40, 40 )
rect:foo( "hello" ) -- 输出 "hello"
2014-07-06 18:09:37
用户2895078
用户2895078

有点复杂,因为我们需要劫持 display.newRect 函数才能实现。以下是具体步骤:

-- 存储旧方法
local oldNewRect = display.newRect

display.newRect = function(...)
    local oDisplayObject = oldNewRect(...)

    oDisplayObject.foo = function(oDisplayObject, sText)
       -- 对显示对象进行一些操作
       -- 输出传递的文本
       print(sText)
    end
    return oDisplayObject
end

local myRectangle1 = display.newRect(0, 0, 150, 50)
myRectangle1:foo("需要被打印的内容1")

local myRectangle2 = display.newRect(0, 0, 150, 50)
myRectangle2:foo("需要被打印的内容2")
2014-07-06 19:35:13
用户869951
用户869951

我倾向于不替换库中的任何方法,因为这意味着每个创建的对象,不仅是你创建的,都会受到影响,这可能会产生意外的副作用。因此,我建议简单地创建一个函数,将所需的方法添加到你创建的每个实例中。这个方法也作为一个标记,表明这个显示对象是你的(而不是由Corona“在幕后”创建的)。例如,

function myNewCustomRect(...)
    local obj = display.newRect(...)
    obj.foo = function (self, a,b,c)
        -- self is obj, although obj is an upvalue so can use directly too
        print(self, obj, a,c,b)
    end
    return obj
end

yourRect = myNewCustomRect(0, 0, 150, 50)
yourRect:foo(1,2,3) -- first two data printed should be same
2014-07-07 13:21:44