中产阶级问题

Dav*_*son 3 lua coronasdk

在遇到一些问题后,我现在正在使用 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
Run Code Online (Sandbox Code Playgroud)

当我这样做时,上面示例中的每个变量(例如 self.name)现在都为零。我相信这是因为我的功能是:

function weaponCanon2:onWeaponCollision(event)
   ...
end
Run Code Online (Sandbox Code Playgroud)

然后设置像 self.collisionEvent = WeaponCanon2.onWeaponCollision 这样的碰撞事件变量不是一回事。我不是 100% 确定 : 和 . 运营商是在 LUA 方面,但这些给了我不同的问题。

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

timer.performWithDelay(100, weaponCanon2.resetShot, 1)
Run Code Online (Sandbox Code Playgroud)

然后在 100 毫秒内它会调用 Wea​​ponCAnon2.resetShot 1 次。当它这样做时,我所有的 self.name 等变量都为零。现在,如果我创建我的班级:

require("weaponCanon2")
local canon = weaponCanon2:new("someName")
canon:saveInstance(canon)
Run Code Online (Sandbox Code Playgroud)

然后回到我的类文件中:

function saveInstance(value)
   self.instance = value
end
Run Code Online (Sandbox Code Playgroud)

现在我可以像这样调用它来使用这个计时器:

timer.performWithDelay(100, function() self.instance:resetShot(); end, 1)
Run Code Online (Sandbox Code Playgroud)

这将在没有我的任何成员变量 (self.name) 为 == 为 nil 的情况下工作。在使用您的库或在 LUA 中时,是否有更好/更简单的方法来做到这一点?

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

谢谢您的帮助,

-d

kik*_*ito 5

[编辑 3] 好的,我想我现在明白这个问题了。

在 lua 中,这样做:

function something:foo(bar, baz)
Run Code Online (Sandbox Code Playgroud)

与制作此相同:

function something.foo(self, bar, baz)
Run Code Online (Sandbox Code Playgroud)

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

something:foo(bar, baz)
Run Code Online (Sandbox Code Playgroud)

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

something.foo(something, bar, baz)
Run Code Online (Sandbox Code Playgroud)

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

但是 Corona 只会向它传递一个参数:事件。你必须欺骗 Corona 传递你想要的参数;一个可能的解决方案是将您的函数包装到另一个函数中,如下所示:

self.someObject:addEventListener("touch", function(event) self:onWeaponCollision(event) end)
Run Code Online (Sandbox Code Playgroud)

我希望这可以澄清整个“:”的事情。

我做了一个 Lua 教程,解释了这一点,以及其他关于 Lua 的事情。它在这里:

http://github.com/kikito/lua_missions

它是交互式的;你在用 Lua 编程的同时学习 Lua。有一章解释了 ':' 运算符(在 tables_and_functions 中)。它还解释了“闭包”是什么,以及其他事情。

无论如何,我希望这会有所帮助。

问候!