如何在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 )
点赞
用户2494064
用户2494064

创建显示对象

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 )

这是一个分配给特定对象的局部侦听器。因此,仅当触摸到该特定对象时,该方法才会触发。

这很好地将显示对象转换为按钮,并检测单个对象与其世界之间的碰撞。

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

我认为,为我的对象创建侦听器比运行时侦听器更容易。这样,我不必过滤哪些对象参与了事件,然后从中分派适当的方法。

总结:对象上的侦听器仅在该对象参与时触发。这使得你可以直接路由到为该对象设计的方法,当事件触发时。运行时侦听器则在任何时候触发该事件。从那里,你将需要弄清楚哪些对象参与其中,以及从哪些方法进行路由。

2015-05-19 15:25:36
用户2376323
用户2376323

函数可以存储在变量(全局和局部)和表中,可以作为参数传递,并且可以被其他函数返回。

当我们谈论一个函数名称,比如 print,实际上我们是在谈论持有该函数的变量。

a = {p = print}
a.p("Hello World")
print = math.sin
a.p(print(1))
sin = a.p
sin(10, 20)
--> Hello World
--‘print'现在引用正弦函数
--> 0.841470
--‘sin'现在引用print函数
--> 10      20

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

表监听器 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中,您有一个对象(更具体地说是一个表)。您向对象添加一个 touch 键,并使用 onObjectTouch 值提供此键。因此,在将触摸事件侦听器添加到对象后,Corona 将搜索对象表中的键值“touch”,这就是为什么您将对象作为第二个条目输入的原因(在此方法中,Corona 需要主表,而不需要函数):object:addEventListener( "touch", object )。在 onObjectTouch 方法中,您现在有两个条目:self 和 event。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, ...)

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

2015-05-22 06:39:59