【发布时间】:2018-09-25 19:21:17
【问题描述】:
我在我的游戏中将回调注册为事件处理程序,如下所示:
--register event handler
EventDispatcher:register("fire", mt.onPlayerFire, self)
--this is the event handler
mt:onPlayerFire()
print("play fire")
end
--unregister event handler
EventDispachter:unregister("fire", mt.onPlayerFire, self)
当事件处理程序是模块mt中的一个函数时,注销它很好,因为我可以在mt中找到相同的函数来注销它,但是当我使用这种形式时:
EventDispatcher:register("fire", function() doSomething() end, nil)
我无法取消注册事件处理程序,因为它是匿名的,所以我想在我的 register 函数中添加一些检查,以防止匿名函数作为事件处理程序。
我发现 lua 源代码中的 Proto 结构可能会有所帮助,但我不知道每个部分的含义。
【问题讨论】:
-
您可以引入新功能
unregister_last()以便能够取消注册最后注册的功能而无需指定它。您注册的系统会记住register()调用堆栈,而unregister_last()函数将从该堆栈中“弹出”一个函数并取消注册。
标签: lua