项目需求需要用到物理引擎,发现cocos2d-x 3.2版本中有很方便的建立带有物理效果的场景,而且加到层中的带有物理效果的node也可以非常方便的跟层一起移动和缩放,这正是我想要的。但是问题来了,我准备用cocosjs来做这些事。cocosjs的CCScene里导处了createWithPhysics这个工厂方法,ok,建立场景没问题。但是调用getPhysicsWorld进行物理参数设置时每次都挂掉……无奈之下我就用xcode打开了cocosjs3.0,写了同样的js代码进行调试,发现是在挂在了自动生成的jsb_cocos2dx_auto.cpp里的以下函数里:
bool js_cocos2dx_Node_getPhysicsBody(JSContext *cx, uint32_t argc, jsval *vp)
{
JSObject *obj = JS_THIS_OBJECT(cx, vp);
js_proxy_t *proxy = jsb_get_js_proxy(obj);
cocos2d::Node* cobj = (cocos2d::Node *)(proxy ? proxy->ptr : NULL);
JSB_PRECONDITION2( cobj, cx, false, "js_cocos2dx_Node_getPhysicsBody : Invalid Native Object");
if (argc == 0) {
cocos2d::PhysicsBody* ret = cobj->getPhysicsBody();
jsval jsret = JSVAL_NULL;
do {
if (ret) {
js_proxy_t *jsProxy = js_get_or_create_proxy(cx, (cocos2d::PhysicsBody*)ret);
jsret = OBJECT_TO_JSVAL(jsProxy->obj);
} else {
jsret = JSVAL_NULL;
}
} while (0);
JS_SET_RVAL(cx, vp, jsret);
return true;
}
JS_ReportError(cx, "js_cocos2dx_Node_getPhysicsBody : wrong number of arguments: %d, was expecting %d", argc, 0);
return false;
}
```
其中js_get_or_create_proxy返回了NULL。还是长话短说吧,最终我发现是PhysicsBody,PhysicsWorld等等几个物理相关的类没有导出到js,于是我就自己动手丰衣足食。用那个binding generator的工具进行生成,生成的Cpp代码怎么都编译不过,我又不知道到底是什么错误。猜想是自动生成jsb工具里的配置文件写错了,我是直接添加到cocos2d.ini里的,只是在class属性后边加上了这几个类名,感觉应该没问题。
想问问大家有没有解决办法?另外我想知道这几个类引擎为啥没有导出到js,而我试了lua端是没问题的……,而且我发现没有导出的好像还不只这几个物理相关的类。这么搞cocosjs满地是坑啊!!!