2015-05-15 31 views
1

可以任何一個向我解釋表監聽器嗎?如何使用它?何時以及爲什麼? 和我解釋一下下面的代碼如何在corona sdk中使用表監聽器以及它如何工作?

local object = display.newImage("ball.png") 
object.id = "ball object" 

local function onObjectTouch(self, event) 
    if event.phase == "began" then 
     print("Touch event began on: " .. self.id) 
    end 
    return true 
end 

object.touch = onObjectTouch 
object:addEventListener("touch", object) 
+0

這裏很清楚地解釋了https://docs.coronalabs.com/api/type/EventListener/addEventListener.html –

回答

0

函數可以存儲在變量(全局和本地)和表中,可以作爲參數傳遞,並可以由其他函數返回。

當我們談論一個函數名稱,比如print時,我們實際上是在討論一個包含該函數的變量。

a = {p = print} 
a.p("Hello World") 
print = math.sin 
a.p(print(1)) 
sin = a.p 
sin(10, 20) 
--> Hello World 
-- ’print’ now refers to the sine function 
--> 0.841470 
-- ’sin’ now refers to the print function 
--> 10  20 

函數定義實際上創建型「功能」的值,並將其分配給一個變量的聲明(分配,更具體地)。 我們不僅可以將函數存儲在全局變量中,還可以存儲在表格字段和局部變量中。這樣的定義對於包來說特別有用:因爲Lua將每個塊作爲一個函數處理,所以塊可以聲明本地函數,這些函數僅在塊中可見。

-------------------------- 區別 -------------- -------------

功能監聽

local object = display.newImage("ball.png") 
object.id = "ball object" 

local function onObjectTouch(event) 
    if event.phase == "began" then 
     print("Touch event began on: " .. event.target.id) 
    end 
    return true 
end 
object:addEventListener("touch", onObjectTouch) 

在功能收聽您添加事件偵聽器的對象。當touch事件以某種方式分派時,onObjectTouch 函數將被調用。

表監聽1

local object = display.newImage("ball.png") 
object.id = "ball object" 

local function onObjectTouch(self, event) 
    if event.phase == "began" then 
     print("Touch event began on: " .. self.id) 
    end 
    return true 
end 

object.touch = onObjectTouch 
object:addEventListener("touch", object) 

在表聆聽者1,你有一個對象(更具體甲TABLE)。您將觸摸對象添加到對象,並通過onObjectTouch值提供此關鍵字。因此,在向對象添加觸摸事件偵聽器之後,corona將在對象TABLE中搜索鍵值「touch」,這就是爲什麼您要將對象作爲第二項輸入,而不是函數(在此方法中,corona希望主表不是功能):object:addEventListener("touch", object)。 在onObjectTouch方法中,您現在有兩個條目:self和event。自我是你的客體,事件就像往常一樣是你的觸摸事件。

表2監聽

local object = display.newImage("ball.png") 
object.id = "ball object" 

function object:touch(event) 
    if event.phase == "began" then 
     print("Touch event began on: " .. self.id) 
    end 
    return true 
end 
object:addEventListener("touch", object) 

在第三種方法請關注主要區別是:在使用object.touch = onObjectTouch我們使用object:onObjectTouch的情況。請記住,只要你用這個結構就意味着:在這最後一種方法

object:onObjectTouch(...) ≣ onObjectTouch(self, ...) 

爲此我們並不需要告訴電暈:哎電暈對象有一個名爲「接觸」與「onObjectTouch」的價值關鍵:object.touch = onObjectTouch

+0

非常感謝。這是非常清楚的。但我想問:爲什麼我們不總是使用函數監聽器,並保持表? –

+0

這取決於你的需要。有時你只是想調用一個函數來執行一個任務,所以你使用例如函數監聽器,有時你想通過一個對象調用一個函數,並且在那個函數中改變這個對象,所以你使用了例如表監聽器2. 上面的例子是全部用於觸摸監聽,想想別人:你想更新一個對象:object:update()。你只是想計算一個公式,所以你只需調用一個函數... 希望這可以幫助你。如果這次談話解決了你的問題和困惑,請關閉並投票。 THNKS –

0

創建顯示對象

local object = display.newImage("ball.png") 
object.id = "ball object" 

創建應獲得運行時,相應的事件它提出的功能。在這種情況下,觸摸事件。

local function onObjectTouch(self, event) 
    if event.phase == "began" then 
     print("Touch event began on: " .. self.id) 
    end 
    return true 
end 

將偵聽器分配給在觸摸事件上觸發的對象。您還可以爲特定對象上的碰撞指定偵聽器。

object.touch = onObjectTouch 
object:addEventListener("touch", object) 

這是分配給特定對象的本地監聽器。因此,該方法只會觸發特定對象。

將顯示對象轉換爲按鈕並檢測單個對象與其世界之間的碰撞非常好。

還有其他方法可以處理這個問題。您可以創建運行時偵聽器,而不是偵聽特定對象來觸發事件。這些將監聽指定的事件(觸摸,碰撞等)。任何類型的事件,不管對象如何都會觸發該方法。

在我看來,我更容易爲我的對象而不是運行時偵聽器創建偵聽器。這樣,我就不必過濾事件中涉及的對象,然後從那裏觸發適當的方法。

摘要:對象上的偵聽器僅在涉及該對象時觸發。這可以讓您在事件觸發時直接發送給該對象的方法。運行時監聽器在事件發生時觸發。從那裏,你將不得不弄清楚哪些對象涉及到哪些方法和路由。

+0

Thanx爲您解釋。我其實知道本地事件和全球事件的區別。但是我在問這種類型的監聽器和直接函數監聽器之間的區別,爲什麼我不寫:object:addEventListener(「touch」,aNameOfFunction)而不是:object:addEventListener(「touch」 ,目的)。有什麼區別和什麼時候我應該使用每種類型? –

相關問題