中产阶级问题

我现在正在使用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

点赞
stackoverflow用户312586
stackoverflow用户312586

[EDIT 3] 好的,现在我认为我理解了这个问题。

在lua中,做这个事情:

function something:foo(bar, baz)

和做这个事情是一样的:

function something.foo(self, bar, baz)

换句话说:' :' 运算符仅仅添加了一个“幽灵”的self参数。同样地,当你使用它调用函数时:

something:foo(bar, baz)

' :'自动用 something的self值填充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。有一个章节解释了“:”运算符(表和函数内部)。它也解释了“闭包”是什么,以及其他一些事情。

无论如何,我希望这能帮到你。

问候!

2011-06-15 21:37:42
stackoverflow用户510531
stackoverflow用户510531

你不需要编写包装器来获得在 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 )
2011-10-16 11:35:02