lua没有所谓私有共有(当然这个是可以实现的),但是有全局和局部,但是这两对可一点都不像。
---------------------------全局帧事件
我们想使用update(),很好,quick有给我们封装好了。在framework\scheduler.lua中
--[[
计划一个全局帧事件回调,并返回该计划的句柄。
全局帧事件在任何场景中都会执行,因此可以在整个应用程序范围内实现较为精确的全局计时器。
该函数返回的句柄用作 scheduler.unscheduleGlobal() 的参数,可以取消指定的计划。
@param function 回调函数
@return mixed schedule句柄
--]]
function scheduler.scheduleUpdateGlobal(listener)
return sharedScheduler:scheduleScriptFunc(listener, 0, false)
end
太简单了,这东西我会用,于是咔咔咔,在【某个继承自node的类】里面写下:
local scheduler = require("framework.scheduler")
--省略好多代码
function myClass:update(dt)
--做一些事情
--self:XXX()
end
function myClass:aFunction()
--返回的句柄咱不要了,任性
scheduler.scheduleUpdateGlobal(function(dt)
self:update(dt)
end)
end
嗯,这个代码目前还是没有问题的,如果不出现一些特殊情况的话,比如,销毁这个类的实例。
具体的说,假设这个类是个‘太阳类’,太阳要自转,咱给他写了个update函数,让他转个够。但是,假如我们切换了场景
xxxx:enterScene("otherScene")
然后就控制台就刷刷的报错了,报个不停,同一个错误
我定睛一看,这特么怎么是在update函数里面,讲道理,切换场景了,场景里的对象应该被销毁了(确实销毁了)。
有毒,重新看了看scheduler.lua,那玩意注释比代码多。
嗯,找到了原因。
本文开头给的代码的注释第二行【全局帧事件在任何场景中都会执行,因此可以在整个应用程序范围内实现较为精确的全局计时器】
【全局全局全局】,重要的事情要说3遍。
好了到此为止。
既然他是全局的,那么我们销毁对象之后就希望这个帧事件(或者其他scheduler.lua中的事件,因为他们也都是全局的)不再存在,因此我们需要手动取消。
function myClass:aFunction()
--返回的句柄还是要的,不能任性
self.updateHandle_ = scheduler.scheduleUpdateGlobal(function(dt)
self:update(dt)
end)
end
function myClass:onExit()
if self.updateHandle_ then scheduler.unscheduleGlobal(self.updateHandle_) end
end
归根到底,还是自己渣。
---------------------------全局变量
app:enterManagerScene()
当时我就懵了,这【app】是何方神圣,在MyApp.lua里面确实没有,那就往基类找。于是确实在AppBase的构造函数里面找到一句
-- set global app
app = self
哦嚯,global。
是的,这是lua的语法问题,跟cocos无关。
---------------------------全局模块
代码不是一个人敲出来的,是一堆人敲出来的。lua写模块也挺方便的。可以参考书上的方法就可以了。比如简单的写个读写模块。
local state = {}
local GameState = require("framework.api.GameState")
appstate = state --global
appstate就是持有这个模块全局全局啦。我们就可以相对自由的使用这个模块里的函数了。
当然,全局所带来的潜在问题就是重名,如果团队已经约定好了就没什么问题,如果没有,就去掉吧。毕竟咱还可以这样
appstate = require("实际路径.SomeGameState")