1、引擎包里有个非常值得借鉴的设计方法。
    cocos下有个init.lua。引擎类的加载,还有根据配置加载一些加载一些东西。这里就加载了framework的init
    cocos.framework下有个init.lua。framework下的类的加载。还有根据配置加载一些东西。
    我们自定义的packages下有个init.lua。加载我们自己的一些基本类。

    相当于C++中的cocos2d.h一样。达到类加载管理的模块化。非常值得借鉴。

    2、关于cc.bind(target,components)
    作用:将components所具有的特性赋予给target。更具体一点就是,让target拥有一些和components一样的函数等。
    而当target调用这些函数的时候其实是让components调用对应的方法。这样是不是非常的神奇?
    例子:
    local target = {}
    cc.bind(target,”event”) —绑定event
    target.dispatch{name = “eventName”}

    1. target.addEventListener("eventName",handler(self,self.onEvent),"TAG")
    2. function target:onEvent(event)<br /> event.tag 就等于了“TAG”<br /> event.stop()就组织后面消息的接收<br /> event.target就等于target<br /> end<br /> cc.unbind(target,"event")--取消绑定event

    cc.bind的原理:cc.bind(target,components),将components及components所依赖的组件(components.depends)全部bind到
    target上。这个bind的过程当中用到了一个非常有意思的方法setmethods(target,components,methods)
    源码如下:
    function cc.setmethods(target, component, methods)
    for , name in ipairs(methods) do
    local method = component[name]
    target[name] = function(__, …)
    return method(component, …)
    end
    end
    end
    还有unsetmethods(target,methods)
    function cc.unsetmethods(target, methods)
    for
    , name in ipairs(methods) do
    target[name] = nil
    end
    end

    3、target.addEventListener(“eventName”,handler(self,self.onEvent),”TAG”)中的handler用法。
    源码如下:相当于C++中的保留函数指针。随时准备执行,非常值得借鉴
    function handler(obj, method)
    return function(…)
    return method(obj, …)
    end
    end

    4、偶然看到MenuEx.lua的这样一段代码。
    local Menu = cc.Menu
    local MenuItem = cc.MenuItem
    function MenuItem:onClicked(callback)
    self:registerScriptTapHandler(callback)
    return self
    end
    这样的效果是:如果require(MenuEx.lua),那么就会让MenuItem多一个onClicked特性。这么简单就扩展了简值了!
    cocos.framework.extends里面扩展了好多比如Layer,Menu,Sprite,UICheckBox

    5、多用用引擎已经封装好的table。非常便捷。

    6、require和import:import是quick lua封装自lua引擎本身提供的require的。
    import(“…app.class.testClass”)导入当前目录的上两级目录。一个.就升一级目录。只有一个.的时候就是当前所在目录下
    注意import只能在模块级调用的时候才能使用相对路径,也就是必须在函数外
    require只能写入绝对路径,函数内外都可以调用

    7、uiMgr:unload(conf)和uiMgr.unload(conf)是完全不同的情况。
    加入用了uiMgr.unLoad则unload的定义处必须显式地在参数列表的第一个位置加self,而:没有

    8、dump(table,tableanme)是打印表的好方法,tableName是一个字符串

    9、lua的require原理:先到package.loaded全局表中查找时候已经加载过目标文件,再到package.preload查找,

    10、lua的热加载原理。重新加载lua文件到内存当中。
    package.preload[moduleName] = nil
    reuqire(moduleName)

    11、#table取表table的长度

    12、表的尾部插入
    table[#table+1] = element

    13、function(target, …),…为可变参数。
    local params = {…},params就是一个数组表

    14、DEBUG,当前调试环境,0代表已取消。1已上就是调试环境,

    15,loadFile,doFile,require区别:
    loadFile,编译代码。并没有加载到内存当中。
    doFile,编译代码并加载到内存当中(即执行了)。调用一次,加载一次。
    require,优化过的doFile,只会加载一遍。在package.loaded中会缓存。其实就是把doFile过的文件缓存起来了,然后根据情况要不要再doFile

    16、local function onTouchCancelled(touch, event) end
    如果touch:getLocation()返回GL坐标,touch:getLocationInView()返回屏幕坐标,
    node:getBoundingBox()返回在父亲节点的rect