Cocos2d-x 3.4 解析MVC入口新手篇

2015年03月17日 09:17 0 点赞 0 评论 更新于 2017-05-08 10:56

最近在学习Cocos2d-x 3.4,我算是个不折不扣的新手。在此分享一些心得,与初学的朋友们交流。

Cocos2d-x 3.4 demo接口分析

Cocos2d-x 3.4的入口在main.lua,这点就不多赘述了。在main函数里,能找到如下代码:

require("app.MyApp"):create():run()

之前我使用的是Cocos2d-x 2.2.3和Lua,也是第一次接触MVC模式,所以这里多解释几句。上面的代码其实可以拆解为:

local app = require("app.MyApp"):create() -- 返回的是一个继承AppBase的类
app:run()

当调用该类的create方法时,很多人会疑惑:“我在MyApp里没找到create方法啊”,我当时看的时候也郁闷了好久。经过一番努力,我终于找到了问题所在。

我们来看看创建类时,框架做了哪些操作。相关代码在cocos -> cocos2d -> functions.lua文件中(要是连这个文件都找不到,那我也没办法啦)。找到文件后,查看里面的class函数,能发现如下代码:

cls.create = function(_, ...)
return cls.new(...)
end

到这里就明白了,框架自动添加了create函数,只是我们一开始没发现。

接下来看看create函数里调用的cls.new(...)做了什么:

cls.new = function(...)
local instance
if cls.__create then
instance = cls.__create(...)
else
instance = {}
end
setmetatableindex(instance, cls)
instance.class = cls
-- 这里调用了ctor函数,每次创建一个类都会自动调用ctor函数,一般在这里做一些初始化的事情,不过很多帖子说不推荐在这里加载资源
instance:ctor(...)
return instance
end

这就解决了ctor自动调用的问题。只要在新增的类中编写ctor()函数,加载类时该函数就会自动运行。

回到最初的问题,create()方法就讲解到这里,下面看看run()方法做了什么。

进入AppBase类,其文件目录为packages -> mvc -> AppBase.lua。实际上,这里主要是创建初始场景,在demo里是MainScene。相关代码如下:

function AppBase:run(initSceneName)
initSceneName = initSceneName or self.configs_.defaultSceneName
print("入口名:"..initSceneName)
-- 默认是进入MainScene场景,这里就不深入讲解了,绕了一大圈其实就是为了创建一个场景
self:enterScene(initSceneName)
end

如果要修改入口界面,可以在AppBase:ctor()中进行。代码如下:

self.configs_ = {
viewsRoot  = "app.views",
modelsRoot = "app.models",
defaultSceneName = "MainScene", -- 修改这里的名字
}

建议像我一样的新手多看看框架里的代码,只要深入钻研,定会有所收获!

作者信息

boke

boke

共发布了 1025 篇文章