我们有一个新棋牌项目,目前在考虑用cocos2d-lua 和creator,因项目要保持长连接。想知道creator是否支持bsd socket?
目前知道cocos2d-lua 配合C++ 肯定支持,但不知道creator是否支持?
或者在哪里可以写底层c++代码?
creator构建native平台后,就是一个cocos2d-js工程,就可以和cocos2d-js一样进行jsbinding了,但是今天我测试了一下,没有成功,可能是我操作不对,或者creator的jsbinding还没有完善
像 @atmy 说的,打包出来原生工程就可以直接修改里面的原生层了(用 jsb-default 模版构建)。
操作步骤是什么?有错误嘛?Creator 的 JS binding 机制和 -x 完全一样
大神,我是这样操作的
用creator里的cocos2d引擎里的tools\tojs里的配置文件和py脚本把c++源文件进行jsbinding
binding完成后,绑定后的源文件(.cpp 和 .hpp)被放到默认目录 项目根目录\ build \ jsb-default \ framework \ cocos2d \ cocos \ scripting \ jsbinding \ auto下,生成的js的api文件也在这个目录的api文件夹下
然后我用vs打开这个项目,并且添加了cpp的源文件和绑定后的源文件到项目,然后我去js注册模块里注册了我的类
sc->addRegisterCallback(register_all_MyCppTools);
然后我在项目的js文件里调用我的类的方法,就是以下的提示,是我哪里操作有误吗?
![]()
是调用哪个函数报错的?这个函数的 C++ 实现什么样?调用怎么调用的?
另外,你的 log 里面有没有其他的报错信息?
看起来绑定没什么问题。
你要注意一下 register_all_MyCppTools 里面 MyCppTools 被注册到哪个命名空间了,正常如果用的是引擎的绑定配置文件的话,会绑定到 cc.MyCppTools
那确实应该是直接绑定到 MyCppTools 对象上
突然注意到你的 getRand 是 static 方法,估计被绑定成类方法(MyCppTools.getRand()),建议你检查一下绑定出来的源码
要看一下 MyCppTools 的类注册函数, js_register_MyCppTools
PS,复制代码可以用首尾各连续的三个 ` 来包裹代码
void js_register_MyCppTools_MyCppTools(JSContext *cx, JS::HandleObject global) {
jsb_MyCppTools_class = (JSClass *)calloc(1, sizeof(JSClass));
jsb_MyCppTools_class->name = "MyCppTools";
jsb_MyCppTools_class->addProperty = JS_PropertyStub;
jsb_MyCppTools_class->delProperty = JS_DeletePropertyStub;
jsb_MyCppTools_class->getProperty = JS_PropertyStub;
jsb_MyCppTools_class->setProperty = JS_StrictPropertyStub;
jsb_MyCppTools_class->enumerate = JS_EnumerateStub;
jsb_MyCppTools_class->resolve = JS_ResolveStub;
jsb_MyCppTools_class->convert = JS_ConvertStub;
jsb_MyCppTools_class->finalize = js_MyCppTools_finalize;
jsb_MyCppTools_class->flags = JSCLASS_HAS_RESERVED_SLOTS(2);
static JSPropertySpec properties[] = {
JS_PSG("__nativeObj", js_is_native_obj, JSPROP_PERMANENT | JSPROP_ENUMERATE),
JS_PS_END
};
static JSFunctionSpec funcs[] = {
JS_FN("create", js_MyCppTools_MyCppTools_create, 0, JSPROP_PERMANENT | JSPROP_ENUMERATE),
JS_FN("setRand", js_MyCppTools_MyCppTools_setRand, 1, JSPROP_PERMANENT | JSPROP_ENUMERATE),
JS_FN("getRand", js_MyCppTools_MyCppTools_getRand, 0, JSPROP_PERMANENT | JSPROP_ENUMERATE),
JS_FS_END
};
JSFunctionSpec *st_funcs = NULL;
JS::RootedObject parent_proto(cx, jsb_cocos2d_Ref_prototype);
jsb_MyCppTools_prototype = JS_InitClass(
cx, global,
parent_proto,
jsb_MyCppTools_class,
dummy_constructor<MyCppTools>, 0, // no constructor
properties,
funcs,
NULL, // no static properties
st_funcs);
// add the proto and JSClass to the type->js info hash table
JS::RootedObject proto(cx, jsb_MyCppTools_prototype);
jsb_register_class<MyCppTools>(cx, jsb_MyCppTools_class, proto, parent_proto);
}
你需要将你的 create 函数改成 static 函数,最终正确的绑定结果,应该是
getRand setRand 在 static JSFunctionSpec funcs[] 中,而 create 函数在 static JSFunctionSpec st_funcs[] 中
搞定了,感谢感谢感谢感谢感谢感谢感谢,非常感谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢
哥们,你现在可以c++ -> js 传递多个参数调用成功吗?







