如何在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 )
函数可以存储在变量(全局和局部)和表中,可以作为参数传递,并且可以被其他函数返回。
当我们谈论一个函数名称,比如 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。
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
创建显示对象
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 )这是一个分配给特定对象的局部侦听器。因此,仅当触摸到该特定对象时,该方法才会触发。
这很好地将显示对象转换为按钮,并检测单个对象与其世界之间的碰撞。
还有其他方法来处理这个问题。你可以创建运行时侦听器,而不是监听特定的对象去触发事件。这将监听指定的事件(触摸、碰撞等)。任何该类型的事件,无论所涉及的对象如何,都会触发该方法。
我认为,为我的对象创建侦听器比运行时侦听器更容易。这样,我不必过滤哪些对象参与了事件,然后从中分派适当的方法。
总结:对象上的侦听器仅在该对象参与时触发。这使得你可以直接路由到为该对象设计的方法,当事件触发时。运行时侦听器则在任何时候触发该事件。从那里,你将需要弄清楚哪些对象参与其中,以及从哪些方法进行路由。