2012-04-01 44 views
4

我有一个Foo类调用一个实例方法或类的方法(当然,伪类)设置如下:科罗娜SDK - 从事件监听

--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但也有点困惑:/

感谢,最大

回答

5

Corona有两种不同类型的事件监听器,函数监听器表监听器。你提到的本地函数是有效的,因为该函数在事件触发时直接调用。 Corona不支持传递表函数,因此在这个实例中传递drag不起作用。

得到这个工作,你需要使用表听者这样的:

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

foo:addEventListener("touch", foo) 

这工作,因为事件监听器将尝试调用表foo中的函数具有相同的名称作为事件 - 中这个例子“触摸”。

如果你需要保持函数名称为拖动,就可以解决此限制由函数定义后添加此:

player.touch = player.drag 

这基本上重定向触摸调用你的拖累作用。

+0

忘了回到这个问题,直到现在,对不起:) – 2015-10-13 11:19:46

3

我已经与事件监听器类似的问题。我是这样解决的:

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

我用Middle Class在Lua中(我真的建议)OOP编程...所以我不知道这是否会在方案中工作。希望能帮助到你。