【问题标题】:Corona SDK - Call an instance method or class method from an eventListenerCorona SDK - 从 eventListener 调用实例方法或类方法
【发布时间】:2012-04-01 09:46:13
【问题描述】:

我有一个 Foo 类(嗯,一个伪类),设置如下:

--in foo.lua
Foo = {}

--constructor
function Foo:new(x, y)
  --the new instance
  local foo = display.newImage("foo.png")
  -- set some instance vars
  foo.x = x
  foo.y = y
  foo.name = 'foo'    

  --instance method
  function foo:speak()
    print("I am an instance and my name is " .. self.name)
  end

  --another instance method 
  function foo:moveLeft()
    self.x = self.x - 1
  end

  function foo:drag(event)
    self.x = event.x
    self.y = event.y  
  end

  foo:addEventListener("touch", drag)

  return foo
end

--class method
function Foo:speak()
  print("I am the class Foo")
end

return Foo

我希望 foo 对象上的事件侦听器在同一个实例上调用 foo:drag。不过,我不知道怎么做:目前它在我的 main.lua 中调用一个名为“drag”的本地函数,然后我将其传递回实例。我可以直接从监听器调用实例方法吗?我在这里阅读关于听众的信息http://developer.anscamobile.com/reference/index/objectaddeventlistener,但我有点困惑:/

谢谢,马克斯

【问题讨论】:

    标签: lua coronasdk


    【解决方案1】:

    Corona 中有 2 种不同类型的事件监听器,函数监听器表格监听器。您提到的本地函数有效,因为该函数在事件触发时直接调用。 Corona 不支持传递表格函数,因此在这种情况下传递拖动将不起作用。

    要使其正常工作,您需要像这样使用表侦听器:

    function foo:touch(event)
      self.x = event.x
      self.y = event.y  
    end
    
    foo:addEventListener("touch", foo)
    

    这是可行的,因为事件侦听器将尝试调用表 foo 中与事件同名的函数 - 在本例中为“touch”。

    如果您需要将函数名称保持为拖动,您可以通过在函数定义后添加以下内容来解决此限制:

    player.touch = player.drag
    

    这基本上将触摸调用重定向到您的拖动功能。

    【讨论】:

    • 忘记回到这个问题了,抱歉:)
    【解决方案2】:

    我在事件监听器方面也遇到过类似的问题。我用这样的方法解决了它:

    foo:addEventListener("touch", function(e) { self:drag(e); });
    

    我在 Lua 中使用 Middle Class 进行 OOP 编程(我非常推荐)...所以我不确定这是否适用于您的场景。希望对您有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-30
      • 1970-01-01
      • 1970-01-01
      • 2011-02-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-22
      相关资源
      最近更新 更多