我现在正在使用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)现在都是零。我相信这是因为我的功能是:
function weaponCanon2:onWeaponCollision(event)
...
end
然后设置像self.collisionEvent = weaponCanon2.onWeaponCollision这样的碰撞事件变量是不一样的。我不是100%确定:和之间有什么区别。运算符就LUA而言,但这些给我带来了不同的问题。
现在另一个例子是我有一个重置功能。计时器熄灭然后调用复位功能。如果我这样做:
timer.performWithDelay(100, weaponCanon2.resetShot, 1)
然后在100ms内,它将调用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
答案 0 :(得分:4)
[编辑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中)。它还解释了什么是“封闭”,以及其他东西。
无论如何,我希望这会有所帮助。
问候!
答案 1 :(得分:1)
您不需要编写包装器来访问自己作为Corona中隐含的第一个参数。要将self作为侦听器的隐式第一个参数,您需要使用表侦听器而不是函数侦听器。表侦听器使对象(表)成为实际的侦听器而不是函数。
请参阅http://developer.anscamobile.com/content/events-and-listeners#Function_vs_Table_Listeners
另请参阅http://blog.anscamobile.com/2011/06/the-corona-event-model-explained/的“定义事件侦听器”部分,其中讨论了创建侦听器的不同方法(最后2个是等效的并具有隐式自我arg),如下所示:
-- METHOD 1:
local function touchListener( event )
...
end
myImage:addEventListener( "touch", touchListener )
----------------------------------------------------------------------
-- METHOD 2:
local function touchListener( self, event )
-- In this example, "self" is the same as event.target
...
end
-- Notice the difference in assigning the event:
myImage.touch = touchListener
myImage:addEventListener( "touch", myImage )
----------------------------------------------------------------------
-- METHOD 3:
function myImage:touch( event )
-- Same as assigning a function to the .touch property of myImage
-- This time, "self" exists, but does not need to be defined in
-- the function's parameters (it's a Lua shortcut).
...
end
myImage:addEventListener( "touch", myImage )