cocos2dx-lua官方demo构建流程代码解析

       很久没弄cocos2dx了,其实相比unity我个人真心比较喜欢cocos,可能是我比较喜欢能直接接触代码吧,毕竟没有什么比代码更可靠的。

       我们看看c++调用lua的地方吧,打开cocos的c++工程,打开AppDelegate文件,可以看到engine->executeScriptFile("main.lua")这一句就是对lua的调用,接下来就可以开始看lua层了,从上面这句代码可以看出,lua层的启动函数就在main.lua文件里。打开lua工程的main.lua文件,我们看到lua层首先的启动函数里只执行了require("app.MyApp"):create():run()这一句代码,想要知道这句代码怎么工作我们就需要一层层抽丝剥茧了,接下来也就是正题了。

require("app.MyApp")这是lua的加载模块的方法,来看看app.MyApp这一模块吧,在app目录下找到MyApp文件,首先映入眼帘的就是一句local MyApp = class("MyApp", cc.load("mvc").AppBase),其实这一句代码包含了两个需要注意的地方,第一个就是class这个函数,我们知道lua是没有c++那样的存在类的继承这样的特性的,所以这是cocos团队做的lua仿继承的方式。找到class函数的函数实现,实现在cocos/cocos2d/functions.lua文件中,打开这个文件,就可以看到class的实现了,另一个要注意的是cc.load这个函数,这个函数的具体实现在cocos/framework/package_support.lua文件中,同样打开这个文件就可以看到cc.load的具体实现cc.load("mvc").AppBase这一句代码的意思,只要跟着函数的实现就不难理解,作用就是先加载了packages.mvc.init.lua模块,从init.lua模块中获得AppBase,而AppBase也是利用class的方式构造了一个实例,理解了cc.load接下来就看看class的具体实现。我们从local AppBase = class("AppBase")这一句开始入手吧,毕竟是最先执行的只带一个参数的class。而且,这个AppBase将会是MyApp的基类(就当做是吧)。进入class函数的实现,因为class("AppBase")只传了一个类名进去,所以class函数实现其实在这里只主要看后半部分就可以了,这里因为只传了一个类名进来,所以执行到了 setmetatable(cls, {__index = cls.super})这一句代码,这句代码其实意思就是设置了元表为空,就相当于没有基类,而可以看到,假如calss方法还传了另一个表进来,而且这个表由calss创建并且已经是多次继承,则会执行else部分代码,每一次获取该表元素,不存在则从super中获取,这就是lua的类似继承的实现。继续往下看,看到假如创建的表没有ctor,将自动创建一个ctor方法,不过该方法什么都不做。再往下这里帮每一个创建的对象都创建了一个create方法,这个create方法是cocos2dx2.x以后一直沿用的二段构建的方式,个人觉得挺好用。在create函数里执行了一些了构建初始化的方法,利用一个new方法。如此就该能理解 local MyApp = class("MyApp", cc.load("mvc").AppBase)这句代码的完整意思了,就是仿造c++的继承,创建了一个MyApp对象,该对象继承了AppBase所有方法以及变量,其中MyApp对象的create方法由class函数帮它构建,run方法则是继承了AppBase的run方法。这时候我们就可以在回来看看 require("app.MyApp"):create():run()这句代码。就是创建了一个MyApp对象,并且调用了它继承自AppBase的run方法。进去run方法可以看到,这里是运行了defaultSceneName场景,cocos2dx-lua的游戏构建流程解析就到这里。

下一篇也不知道什么时候,佛性写博哈哈

你可能感兴趣的:(cocos)