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”}
target.addEventListener("eventName",handler(self,self.onEvent),"TAG")
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