中产阶级问题
我现在正在使用LUA的middleclass库,但遇到了一些问题,我有一个情况无法解决。
比如我有一个类:
require "middleclass"
weaponCanon2 = class("weaponCanon2")
function weaponCanon2:onWeaponCollision(event)
if (event.phase == "began") then
if (event.other.name ~= "ground") then
self.canonBall.inAir = false
end
end
end
function weaponCanon2:initialize(atX, atY, inGroup)
self.name = "some value"
self.someObject:addEventListener("touch", **weaponCanon2.onWeaponCollision**)
...
end
当我这样做时,像上面示例中的self.name等每个变量都是nil。我认为这是因为我的函数是:
function weaponCanon2:onWeaponCollision(event)
...
end
那么设置碰撞事件变量如self.collisionEvent = weaponCanon2.onWeaponCollision并不是同一件事情。我不确定:和.运算符在LUA中的区别,但它们给我带来了不同的问题。
现在另一个例子是,我有一个复位函数。一个计时器提醒,然后调用重置函数。如果我这样做:
timer.performWithDelay(100, weaponCanon2.resetShot, 1)
那么在100ms内它将调用1次weaponCanon2.resetShot。当它这样做时,我的所有self.name等变量都是nil。现在,如果我创建我的类:
require("weaponCanon2")
local canon = weaponCanon2:new("someName")
canon:saveInstance(canon)
然后在我的类文件中:
function saveInstance(value)
self.instance = value
end
现在我可以使用如下方式调用这个计时器:
timer.performWithDelay(100, function() self.instance:resetShot(); end, 1)
这将正常工作,而不会使我的成员变量(self.name)等于nil。在使用您的库或LUA时,是否有更好/更容易的方法来做到这一点?
抱歉表述不清,我很难理解这个问题,并且解释非常困难。
谢谢您的帮助,
-d
原文链接 https://stackoverflow.com/questions/6363671
你不需要编写包装器来获得在 Corona 中作为隐式第一个参数的 self。为了将 self 作为隐式第一个参数传递给监听器,你需要使用表监听器而不是函数监听器。表监听器将对象(表)作为实际监听器而不是函数。
参见 http://developer.anscamobile.com/content/events-and-listeners#Function_vs_Table_Listeners
还可以参见 http://blog.anscamobile.com/2011/06/the-corona-event-model-explained/ 中的 "Defining event listeners" 部分,该部分讨论了创建监听器的不同方法(最后两种方法是等效的并具有隐式self参数),如下所示:
-- 方法1:
local function touchListener( event )
...
end
myImage:addEventListener( "touch", touchListener )
----------------------------------------------------------------------
-- 方法2:
local function touchListener( self, event )
-- 在此示例中,“self”与 event.target 相同
...
end
-- 注意指定事件的区别:
myImage.touch = touchListener
myImage:addEventListener( "touch", myImage )
----------------------------------------------------------------------
-- 方法3:
function myImage:touch( event )
-- 与将函数分配给 myImage 的 .touch 属性相同
-- 这次,“self”存在,但不需要在函数参数中定义(这是 Lua 的一种快捷方式)。
...
end
myImage:addEventListener( "touch", myImage )
- 如何在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中获取用户配置主目录的跨平台方法
- 如何编写 Lua 模式将字符串(嵌套数组)转换为真正的数组?
[EDIT 3] 好的,现在我认为我理解了这个问题。
在lua中,做这个事情:
function something:foo(bar, baz)
和做这个事情是一样的:
function something.foo(self, bar, baz)
换句话说:' :' 运算符仅仅添加了一个“幽灵”的self参数。同样地,当你使用它调用函数时:
' :'自动用 something的self值填充self参数。其等效于:
简而言之:' weaponCanon2.onWeaponCollision '实际上有两个参数:self和event。
但是,Corona只会传递一个参数:event。你必须欺骗Corona来传递自己想要的参数;一个可能的解决方案是将函数包装在另一个函数中,像这样:
self.someObject:addEventListener("touch", function(event) self:onWeaponCollision(event) end)
我希望这澄清了整个' :'的事情。
我做了一个关于Lua的教程,解释了这个问题和其他关于Lua的东西。这里是:
http://github.com/kikito/lua_missions
它是交互式的;你在Lua中编程时学习Lua。有一个章节解释了“:”运算符(表和函数内部)。它也解释了“闭包”是什么,以及其他一些事情。
无论如何,我希望这能帮到你。
问候!