【问题标题】:middleclass problems中产阶级问题
【发布时间】:2011-06-15 20:06:31
【问题描述】:

在遇到一些问题后,我现在正在使用 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)现在都为零。我相信这是因为我的功能是:

function weaponCanon2:onWeaponCollision(event)
   ...
end

然后像 self.collisionEvent = WeaponCanon2.onWeaponCollision 这样设置一个碰撞事件变量就不是一回事了。我不是 100% 确定 : 和 . 之间有什么区别。运营商是根据 LUA 的,但这些给我带来了不同的问题。

现在另一个例子是我有一个重置功能。计时器关闭,然后调用重置函数。如果我这样做:

timer.performWithDelay(100, weaponCanon2.resetShot, 1)

然后在 100ms 内它会调用 Wea​​ponCANon2.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) 不 == 为零的情况下工作。使用您的库或在 LUA 中是否有更好/更简单的方法来执行此操作?

抱歉,不清楚我无法解决这个问题并解释它非常困难。

感谢您的帮助,

-d

【问题讨论】:

  • 问题似乎是,一旦我调用:武器Canon2.onTouchEvent,它就无法找到创建的类的实例,因为我要求进行全局调用。那么如何调用其中一个类函数呢? (即类中的辅助函数)
  • 如果你需要访问原始实例,你应该使用表监听器(见下面的答案)而不是函数监听器

标签: lua coronasdk


【解决方案1】:

[EDIT 3] 好的,我想我现在明白问题所在了。

在 lua 中,制作这个:

function something:foo(bar, baz)

和做这个一样:

function something.foo(self, bar, baz)

换句话说:':' 运算符只是添加了一个“幻像”self 参数。同样,当您使用它调用函数时:

something:foo(bar, baz)

':' 会自动用某物的值“填充”self 参数。相当于:

something.foo(something, bar, baz)

简而言之:武器Canon2.onWeaponCollision在现实中需要两个参数:self和event。

但 Corona 只会传递一个参数:事件。您必须欺骗 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 任务,因为我需要快速掌握这些东西的工作速度。再次感谢您的帮助!我只需要重写我的代码来处理碰撞检测并且效果很好:self.canonBall:addEventListener ("collision", function(event) self.onWeaponCollision(self, event); end)
  • 不客气。注意self.onWeaponCollision(self, event) 等价于self:onWeaponCollision(event)。你应该习惯那个成语;这在 Lua 中很常见。
  • 您不应该使用包装函数。而是使用表侦听器:
  • @walter 我本可以使用其中一个表侦听器,但是 David 不会理解 Lua 如何处理 : 运算符。我觉得这个问题更重要。
【解决方案2】:

您不需要编写包装器来访问自我作为 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/ 的“定义事件侦听器”部分,该部分讨论了创建侦听器的不同方法(最后两个是等效的,并且具有隐式 self 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 )

【讨论】:

  • 在这个答案中,进一步阅读的链接没有显示任何有用的信息:2x 没有,1x 服务器未找到
猜你喜欢
  • 1970-01-01
  • 2020-01-17
  • 1970-01-01
  • 1970-01-01
  • 2021-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多