【quick遇到的陷阱】lua 全局

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

归根到底,还是自己渣。

---------------------------全局变量

如果sample吃得够细,其实也会发现一些好玩的地方。比如,调用MyApp.lua的函数时,是这么调用的。

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")

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值