我有一个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:拖动同一个实例。我无法弄清楚如何:此时它正在我的main.lua中调用一个名为“drag”的本地函数,然后我将其传回实例。我可以直接从侦听器调用实例方法吗?我正在阅读这里的听众http://developer.anscamobile.com/reference/index/objectaddeventlistener,但有些困惑:/
谢谢,最大
答案 0 :(得分:5)
Corona中有两种不同类型的事件侦听器,函数侦听器和表侦听器。你提到的本地函数是有效的,因为当事件触发时会直接调用该函数。 Corona不支持传递表函数,因此在此实例中传递拖动将不起作用。
要使其正常工作,您需要使用如下的表监听器:
function foo:touch(event)
self.x = event.x
self.y = event.y
end
foo:addEventListener("touch", foo)
这是有效的,因为事件监听器将尝试使用与事件相同的名称调用表foo中的函数 - 在此示例中为“touch”。
如果您需要将函数名称保留为拖动,则可以通过在函数定义之后添加此函数来解决此限制:
player.touch = player.drag
这基本上会将触控调用重定向到你的拖动功能。
答案 1 :(得分:3)
我遇到过与事件监听器类似的问题。我用这样的东西解决了它:
foo:addEventListener("touch", function(e) { self:drag(e); });
我在Lua中使用Middle Class进行OOP编程(我真的推荐)...所以我不确定这是否适用于您的场景。希望它有所帮助。