最近在学习Cocos2d-x 3.4,算是个不折不扣的新手菜鸟。拿一点心得和初学同好交流下。

       关于Cocos2d-x 3.4 demo接口分析。入口在main.lua这里不多说。

       在mai 函数里面能找到这么一段代码: 

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

       这里解释一下(之前是用的Cocos2d-x 2.2.3和lua ,也是第一次接触mvc的模式,这里就多啰嗦几句)

上面那段代码其实可以拆解为:

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


       这里调用了该类里面的 create方法 这时候很多人就会问  『我没有在MyApp里面找到create方法啊』(看的当时我就郁闷了)。

       经过不懈的努力终于让我找到了问题的所在。我们看看在创建一个类的时候,框架帮我们做了什么直接上代码,目录在cocos-》cocos2d -》 functions.lua ps.这个再找不到我就救不了你了!

        找到文件后来看里面的class函数,在里面可以发现有这么一段代码

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

到这你应该就明白了把,这里自动加上了create函数所以说create函数是有的(只是被蒙在鼓里了)。


废话不多说,接着来看create函数里面调用了cls.new(...)

那么cls.new(...)里面又做了什么呢

1
2
3
4
5
6
7
8
9
10
11
12
13
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

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


如果入口界面可以再AppBase:ctor()中进行修改MainScene

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

建议像我一样的新手多看看框架里面的代码,只要能够专研,定会有收获的!