在遇到一些问题后,我现在正在使用 LUA 中间类库,但我遇到了一种我似乎无法弄清楚的情况。
假设我有我的课:编辑:打字错误:这是实际功能
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 不是一回事。我不是 100% 确定 : 和 . 之间的区别。运营商是根据 LUA 但这些给我不同的问题。
现在另一个例子是我有一个重置功能。计时器关闭,然后调用重置功能。如果我这样做:
timer.performWithDelay(100, weaponCanon2.resetShot, 1)
然后在 100 毫秒内它会调用 weaponCAnon2.resetShot 1 次。当它这样做时,我所有的 self.name 等变量都是零。现在,如果我创建我的类:
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
最佳答案
[编辑 3] 好的,我想我现在明白了问题。
在lua中,做这个:
function something:foo(bar, baz)
和做这个一样:
function something.foo(self, bar, baz)
换句话说:':' 运算符只是添加一个“幻影”自参数。同样,当您使用它调用函数时:
something:foo(bar, baz)
':' 会自动用某物的值“填充” self 参数。它相当于:
something.foo(something, bar, baz)
简而言之: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。有一章解释“:”运算符(在 tables_and_functions 内)。它还解释了什么是“闭包”,以及其他内容。
无论如何,我希望这对您有所帮助。
问候!
关于lua - 中间类问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6363671/