【问题标题】:Corona SDK how to add custom method to displayobjectCorona SDK如何将自定义方法添加到显示对象
【发布时间】:2014-08-27 03:50:39
【问题描述】:

我想添加自定义方法来显示对象,例如“setFillColor”等预建方法

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

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


local myRectangle = display.newRect( 0, 0, 150, 50 )
myRectangle:foo("something to be printed")

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

【问题讨论】:

  • 它不起作用,因为返回了ShapeObject
  • 您是要添加方法还是用您自己的方法替换现有方法?
  • @Schollii 我想要一个新方法,比如很棒的“Foo”方法:)

标签: oop lua coronasdk


【解决方案1】:

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

local oldNewRect = display.newRect

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

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

    return rect
end

-- usage

local rect = display.newRect( 0, 0, 40, 40 )
rect:foo( "hello" ) -- prints "hello"

【讨论】:

  • 行不通,因为他想将字符串作为参数传递
  • 是的。我正在展示如何向每个显示对象构造函数添加一个函数。添加功能以将参数作为字符串传递到我上面发布的内容是微不足道的
  • 编辑添加了传入字符串并打印其值的功能
【解决方案2】:

我不希望替换库中的任何方法,因为这意味着创建的每个对象,而不仅仅是您创建的对象,都会受到影响,这可能会产生意想不到的副作用。所以我主张简单地创建一个函数,将所需的方法添加到您创建的每个实例中。此方法还用作此显示对象是“您的”之一的签名(不是 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

【讨论】:

  • 是的,这比覆盖 corona 的显示方法要好,但是他要求扩展显示对象本身,这就是我在示例中展示的内容。但是,我同意创建自己的方法来调用 corona 的内部方法是最好的方法。
【解决方案3】:

有点复杂,因为我们需要劫持 display.newRect 调用。操作方法如下:

-- Store the old method
local oldNewRect = display.newRect

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

    oDisplayObject.foo = function(oDisplayObject, sText)
       -- Do something with the display object
       -- Print the text passed as argument
       print(sText)
    end
    return oDisplayObject
end

local myRectangle1 = display.newRect( 0, 0, 150, 50 )
myRectangle1:foo("something to be printed")

local myRectangle2 = display.newRect( 0, 0, 150, 50 )
myRectangle2:foo("something to be printed")

【讨论】:

  • @PersuitOfPerfection 另一方面,that 不是必需的。
  • ... 确保传递给函数调用的所有参数。冒号语法也可以。 arg 名称不需要为 self
  • 个人喜好问题然后我猜。更整洁地通过自我明确恕我直言
  • @scholli,我不是这么说的。我了解代码的工作原理。
  • @PersuitOfPerfection 那么 self 只是 Lua 中的一个构造。在我的例子中,我更喜欢明确地使用 .foo = function() 表示法来清楚地解释发生了什么,因为 :foo 表示法有时会让人感到困惑,尤其是当你劫持方法调用时,就像在这种情况下一样。
猜你喜欢
  • 1970-01-01
  • 2014-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-26
相关资源
最近更新 更多