如何在 corona sdk 中使用 table 监听器及其工作原理?

How to use table listeners in corona sdk and how it works?

任何人都可以向我解释 table 听众吗?如何使用它?什么时候,为什么? 并向我解释以下代码

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 )

创建显示对象

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 )

这是分配给特定对象的本地侦听器。因此,只有在触摸特定对象时才会触发该方法。

这非常适合将显示对象变成按钮并检测单个对象与其世界之间的碰撞。

还有其他方法可以处理此问题。您可以创建运行时侦听器,而不是侦听特定对象来触发事件。这些将监听指定的事件(触摸、碰撞等)。该类型的任何事件,无论对象如何,都会触发该方法。

在我看来,我发现为我的对象创建监听器比 运行time 监听器更容易。这样,我就不必过滤事件中涉及的对象,然后从那里触发适当的方法。

总结:对象上的侦听器仅在涉及该对象时触发。这使您可以在事件触发时直接路由到用于该对象的方法。只要事件发生,运行时侦听器就会触发。从那里,您将必须弄清楚涉及哪些对象以及从哪些方法进行路由。

函数可以存储在变量(全局和局部)和 tables 中,可以作为参数传递,也可以由其他函数返回 函数。

当我们谈论函数名称时,例如 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

函数定义实际上是一个语句(更具体地说,是一个赋值),它创建一个“函数”类型的值并将其分配给一个变量。 我们不仅可以将函数存储在全局变量中,还可以存储在 table 字段和局部变量中。这样的定义对于包特别有用:因为 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 )

在函数侦听器中,您将事件侦听器添加到对象。当以某种方式调度触摸事件时,将调用 onObjectTouch function

Table 听众 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 )

在table listener 1 中,你有一个对象(更具体地说是A TABLE)。您将一个键作为触摸添加到您的对象,并通过 onObjectTouch 值提供此键。因此,在您将触摸事件侦听器添加到对象后,corona 将在对象 TABLE 中搜索键值 "touch",这就是为什么您将对象作为第二个条目输入,而不是函数(在此方法 corona 中想要主要 table 而不是函数):object:addEventListener( "touch", object )。 在 onObjectTouch 方法中,您现在有两个条目:self 和 event。像往常一样,self 是您的对象,event 是您的触摸事件。

Table 听众 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, ...)

因此在最后一种方法中我们不需要告诉 corona:嘿 corona 对象有一个名为 "touch" 的键,值为 "onObjectTouch":object.touch = onObjectTouch