2012-04-01 123 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編程...所以我不知道這是否會在方案中工作。希望能幫助到你。