使用 Corona SDK - 从 eventListener 调用实例方法或类方法

我已经设置了一个名为Foo的伪类,如下所示:

--在foo.lua中
Foo = {}

--构造函数
function Foo:new(x, y)
  --新实例
  local foo = display.newImage("foo.png")
  -- 设置一些实例变量
  foo.x = x
  foo.y = y
  foo.name = 'foo'

  --实例方法
  function foo:speak()
    print("我是一个实例,我的名字是 " .. self.name)
  end

  --另一个实例方法
  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

--类方法
function Foo:speak()
  print("我是类Foo")
end

return Foo

我希望foo对象上的事件侦听器调用同一实例上的foo:drag。但是,我无法弄清楚如何操作:目前它正在调用主.lua中的名为“drag”的本地函数,然后我将其传递回实例。我能直接从监听器调用实例方法吗?我在这里阅读监听器的内容:http://developer.anscamobile.com/reference/index/objectaddeventlistener,但有点困惑:/

谢谢,马克斯

原文链接 https://stackoverflow.com/questions/9963440

点赞
stackoverflow用户715597
stackoverflow用户715597

我遇到过类似的事件监听器问题。我用了类似这样的解决方案:

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

我在 Lua 中使用 Middle Class 进行面向对象编程(我非常推荐)……所以我不确定这是否适用于你的情况。希望可以帮到你。

2012-04-03 15:56:03
stackoverflow用户1019194
stackoverflow用户1019194

在 Corona 中有两种不同类型的事件监听器,函数监听器表监听器。您提到的本地函数之所以有效,是因为该函数在事件触发时直接调用。Corona 不支持传递表函数,因此在这种情况下传递 drag 是行不通的。

要使此功能正常工作,您需要像这样使用表监听器:

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

foo:addEventListener("touch", foo)

这可以工作,因为事件监听器将尝试使用与事件相同名称的表 foo 中的函数 - 在此示例中为“touch”。

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

player.touch = player.drag

这基本上会将触摸调用重定向到您的 drag 函数。

2012-04-16 21:41:36