一些官方有的文档我就不重复了,只是简单记录下自己的研究。暂时版本1.2.2
1、creator的默认编辑器使用的引擎路径
cocos2d-x引擎路径在 creator安装文件夹\resources\cocos2d-x下,这个是构建发布原生平台版本的时候才用到,非link模式下,复制一份该引擎源码到发布路径下。默认已经编译好模拟器exe在该路径\simulator\win3下,每次运行预览也是在这个路径下刷新资源。
JavaScript 引擎(也就是Creator-JS引擎)在creator安装文件夹\resources\engine下,这个是creator主要作用的代码,大部分UI组件代码都是在这里写的,发布的时候会默认打包所有js文件成一个jsb_polyfill.js,默认会有一份编译好的在该路径\bin下,每次代码更新都会在这里复制一份到模拟器路径下。
2、分辨率适配
creator的canvas分辨率适配是没有EXACT_FIT即拉伸铺满屏幕,有需要的话得自己改,话说搞不懂别的模式都搞了,这个模式为什么不来个字段适配下,可以自己修改Creator-JS引擎下的CCCanvas.js文件里面的处理来实现,具体修改applySettings函数,相信大部分人都能看懂改哪,我是将NO_BORDER修改成EXACT_FIT。值得注意的是,默认编辑器你需要直接修改jsb_polyfill.js里面的那段函数才可以,因为他不会重新编译一次Creator-JS引擎(或许有什么条件下会,但我不清楚)
3、事件管理
节点的事件管理是个坑,他是冒泡传递的,也就是只能从孩子节点传给父节点,而无法从父节点传到孩子节点,限制很大,而eventManager只能监听无法发送消息,所以需要自己重新写一套来实现功能,这里写个全局事件管理器来处理,可以参考节点的事件管理,写一个EventMgr.js,简单写了个,具体如下
(function () {
var list ={};
var __EventMgr = {
//注册消息
on:function(key,func,node) {
if(list[key] == null){
list[key] =[];
}
var d = {};
d.func =func;
d.node = node;
list[key].push(d);
},
//移除一个消息
remove:function(key,func,node) {
if(list[key]){
for(var i=0; i<data.length;i++){
if(data[i].node == node && data[i].func == func)
{
data.splice(i,1);
--i;
}
}
}
list[key].push(func);
},
//移除node所有消息
removeByNode:function(node) {
for ( var p in list ){
var data = list[p];
for(var i=0; i<data.length;i++){
if(data[i].node == node)
{
data.splice(i,1);
--i;
}
}
}
},
//移除key注册的所以消息
removeByKey:function(key) {
delete list[key];
},
//遍历通知消息
emit:function (key,arg) {
if(list[key]){
var funcs = list[key].concat();
for(var i=0;i<funcs.length;i++){
if((funcs[i].node instanceof cc.Component))
{
if( cc.isValid (funcs[i].node) ){
funcs[i].func(arg,funcs[i].node);
}
}
else{
funcs[i].func(arg,funcs[i].node);
}
}
}
}
};
window.EventMgr = __EventMgr;
})();
因为引擎开始加载js脚本的时候,会执行一遍js代码,所以默认就会把EventMgr加到全局变量里,这里只是一个全局分发消息的处理,可以自己扩展改进需要的功能,一般简单的事件分发用它也够了。