cocos2d-js 风格的代码转化为脚本插件的问题

creator 版本: 1.8.0

先说一下这个问题的起源,是因为我有很多 cocos2d-js 的模块,想要做到尽量少的改动的前提下,适配到 CCC 中使用。

假设我有一段简单的 cocos2d-js 的代码如下:

JiaoBen.js

var NAMESPACE_TEST = NAMESPACE_TEST || {};

NAMESPACE_TEST.AAA = cc.Node.extend( {
    ctor:function () {
    	cc.log("AAA");
    }
});


NAMESPACE_TEST.BBB = NAMESPACE_TEST.AAA.extend( {
    ctor:function () {
    	cc.log("BBB");
    }
});

这在 cocos2d-js 中是很常见的写法。

然后,现在我尝试将这个脚本在 CCC 中,以插件脚本的形式(允许native),导入项目。

当然这里做了个修改,把 cc.Node 改成了 _ccsg.Node

然后在一个 脚本中测试一下 demo.js :

cc.Class({
    extends: cc.Component,
    properties: {
    },
    onLoad: function () {
        cc.log(NAMESPACE_TEST);
        cc.log(NAMESPACE_TEST.AAA);
        cc.log(NAMESPACE_TEST.BBB);
    }
});

在 浏览器环境下,代码可以正常运行,并打印出结果。

但是在 native 环境下(mac),就会报错:

ERROR: TypeError: NAMESPACE_TEST.AAA.extend is not a function.

再尝试另一种方法,JiaoBen.js 稍作修改,作为普通脚本形式,导入项目:

JiaoBen.js

var NAMESPACE_TEST = NAMESPACE_TEST || {};

NAMESPACE_TEST.AAA = cc.Node.extend( {
    ctor:function () {
    	cc.log("AAA");
    }
});


NAMESPACE_TEST.BBB = NAMESPACE_TEST.AAA.extend( {
    ctor:function () {
    	cc.log("BBB");
    }
});

module.exports = NAMESPACE_TEST;

demo.js

var NAMESPACE_TEST = require('AAA');
cc.Class({
    extends: cc.Component,
    properties: {
    },
    onLoad: function () {
        cc.log(NAMESPACE_TEST);
        cc.log(NAMESPACE_TEST.AAA);
        cc.log(NAMESPACE_TEST.BBB);
    }
});

同样,浏览器环境可以正常运行,打印出结果,

但是在 native 环境下(mac),还是一样报错:

ERROR: TypeError: NAMESPACE_TEST.AAA.extend is not a function.

所以想请问一下,这个有什么办法解决呢?

阅读了一下源码后,找到了一个方法,自己解答一下。

需要添加一下下面的代码:

NAMESPACE_TEST.AAA.extend = cc._Class.extend;

这样在 native 下也就 OK 了,当然不确定是不是最好的解决方案…

当然这里做了个修改,把 cc.Node 改成了 _ccsg.Node … 这是为啥?