cocos2d-x从c++到jsJS与C++的交互2——JS与C++的“函数重载”问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了cocos2d-x从c++到jsJS与C++的交互2——JS与C++的“函数重载”问题相关的知识,希望对你有一定的参考价值。


对于C++来说,存在函数重载,例如:

​​void​​         ​​CCNode::setScale(​​        ​​float​​         ​​scale)​​       


​​void​​ ​​CCNode::setScale(​​ ​​float​​ ​​scaleX,​​ ​​float​​ ​​scaleY)​​


这两个函数的函数名是一样的,但是参数表不同。最终在编译器编译后的函数签名不一样。

但是在javascript中并没有这种机制。怎么破?存在两种情况:

第一种、JS需要调用重载的C++函数接口

​​JSBool js_cocos2dx_Node_setScale(JSContext *cx, uint32_t argc, jsval *vp)​​       


​​​​


​​jsval *argv = JS_ARGV(cx, vp);​​


​​JSBool ok = JS_TRUE;​​


​​JSObject *obj = NULL;​​


​​cocos2d::Node* cobj = NULL;​​


​​obj = JS_THIS_OBJECT(cx, vp);​​


​​js_proxy_t *proxy = jsb_get_js_proxy(obj);​​


​​cobj = (cocos2d::Node *)(proxy ? proxy->ptr : NULL);​​


​​JSB_PRECONDITION2( cobj, cx, JS_FALSE, ​​ ​​"js_cocos2dx_Node_setScale : Invalid Native Object"​​ ​​);​​


​​do​​ ​​​​


​​if​​ ​​(argc == 2) ​​


​​double​​ ​​arg0;​​


​​ok &= JS_ValueToNumber(cx, argv[0], &arg0);​​


​​if​​ ​​(!ok) ok = JS_TRUE; ​​ ​​break​​ ​​; ​​


​​double​​ ​​arg1;​​


​​ok &= JS_ValueToNumber(cx, argv[1], &arg1);​​


​​if​​ ​​(!ok) ok = JS_TRUE; ​​ ​​break​​ ​​; ​​


​​cobj->setScale(arg0, arg1);​​


​​JS_SET_RVAL(cx, vp, JSVAL_VOID);​​


​​return​​ ​​JS_TRUE;​​


​​​​


​​ ​​ ​​while​​ ​​(0);​​


​​do​​ ​​​​


​​if​​ ​​(argc == 1) ​​


​​double​​ ​​arg0;​​


​​ok &= JS_ValueToNumber(cx, argv[0], &arg0);​​


​​if​​ ​​(!ok) ok = JS_TRUE; ​​ ​​break​​ ​​; ​​


​​cobj->setScale(arg0);​​


​​JS_SET_RVAL(cx, vp, JSVAL_VOID);​​


​​return​​ ​​JS_TRUE;​​


​​​​


​​ ​​ ​​while​​ ​​(0);​​


​​JS_ReportError(cx, ​​ ​​"js_cocos2dx_Node_setScale : wrong number of arguments"​​ ​​);​​


​​return​​ ​​JS_FALSE;​​


​​​​



argc参数简单判断了一下参数个数,然后就执行对应的分支代码就好了。但是如果遇到参数个数相同,而类型不同的情况呢?尚不得而知。

第二种、不需要调用C++函数接口,直接在JS层代码中模拟一下函数重载。这个就要利用JS语言的一些特性了。我们直接看Cocos2d-html5中的对应代码。哦,no,因为html5里面关于CCNode::setScale函数写了一点杂技代码。所以我们改成看setPosition函数吧。也是一样的。

​​setPosition:​​        ​​function​​         ​​(newPosOrxValue, yValue) ​​       


​​var​​ ​​locPosition = ​​ ​​this​​ ​​._position;​​


​​if​​ ​​(arguments.length == 2) ​​


​​locPosition._x = newPosOrxValue;​​


​​locPosition._y = yValue;​​


​​ ​​ ​​else​​ ​​if​​ ​​(arguments.length == 1) ​​


​​locPosition._x = newPosOrxValue.x;​​


​​locPosition._y = newPosOrxValue.y;​​


​​​​


​​this​​ ​​.setNodeDirty();​​


​​,​​


可以看到,该代码使用了JS的arguments来判断参数个数,然后执行对应的分支代码。

好了,重载就说道这里,下篇继续~

以上是关于cocos2d-x从c++到jsJS与C++的交互2——JS与C++的“函数重载”问题的主要内容,如果未能解决你的问题,请参考以下文章

cocos2d-x从c++到js21:使用CocosCode调试JSB

cocos2d-x从c++到js17:使用FireFox进行JS远程调试

cocos2d-x从c++到js19:CoffeeScript开发环境搭建续

cocos2d-x从c++到js22:使用非侵入方式扩展UI系统接口的举例

cocos2d-x从c++到js16:使用cocos2d-console工具转换脚本为字节码

标题:如何使用ShareSDK实现Cocos2d-x的Android/iOS分享与授权