【cocos2d-x从c++到js】10:JS与C++的交互2——JS与C++的“函数重载”问题

前端之家收集整理的这篇文章主要介绍了【cocos2d-x从c++到js】10:JS与C++的交互2——JS与C++的“函数重载”问题前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
2014-01-23 17:03:50 @H_404_3@
标签js cocos2d-x jsb @H_404_3@
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处、作者信息和本声明。否则将追究法律责任。 http://www.jb51.cc/article/p-kduvryhh-vm.html @H_404_3@

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


1 @H_404_3@
2 @H_404_3@
void CCNode::setScale( float scale) @H_404_3@
scaleX, scaleY) @H_404_3@ @H_404_3@
@H_404_3@ @H_404_3@

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


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


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

我们就以上面的函数为例,来看看在cxx-generator的自动生成代码中,函数重载是如何处理的。打开jsb_cocos2dx_auto.cpp,找到如下代码

2 @H_404_3@
3 @H_404_3@
4 @H_404_3@
5 @H_404_3@
6 @H_404_3@
7 @H_404_3@
8 @H_404_3@
9 @H_404_3@
10 @H_404_3@
11 @H_404_3@
12 @H_404_3@
13 @H_404_3@
14 @H_404_3@
15 @H_404_3@
16 @H_404_3@
17 @H_404_3@
18 @H_404_3@
19 @H_404_3@
20 @H_404_3@
21 @H_404_3@
22 @H_404_3@
23 @H_404_3@
24 @H_404_3@
25 @H_404_3@
26 @H_404_3@
27 @H_404_3@
28 @H_404_3@
29 @H_404_3@
30 @H_404_3@
31 @H_404_3@
32 @H_404_3@
33 @H_404_3@
34 @H_404_3@
35 @H_404_3@
36 @H_404_3@
JSBool js_cocos2dx_Node_setScale(JSContext *cx,uint32_t argc,jsval *vp) @H_404_3@
{ @H_404_3@
jsval *argv = JS_ARGV(cx,vp); @H_404_3@
JSBool ok = JS_TRUE; @H_404_3@
JSObject *obj = NULL; @H_404_3@
cocos2d::Node* cobj = NULL; @H_404_3@
obj = JS_THIS_OBJECT(cx,vp); @H_404_3@
js_proxy_t *proxy = jsb_get_js_proxy(obj); @H_404_3@
cobj = (cocos2d::Node *)(proxy ? proxy->ptr : NULL); @H_404_3@
JSB_PRECONDITION2( cobj,cx,JS_FALSE, "js_cocos2dx_Node_setScale : Invalid Native Object" ); @H_404_3@
do { @H_404_3@
if (argc == 2) { @H_404_3@
double arg0; @H_404_3@
ok &= JS_ValueToNumber(cx,argv[0],&arg0); @H_404_3@
(!ok) { ok = JS_TRUE; break ; } @H_404_3@
arg1; @H_404_3@
404_3@
; } @H_404_3@
cobj->setScale(arg0,arg1); @H_404_3@
JS_SET_RVAL(cx,vp,JSVAL_VOID); @H_404_3@
return JS_TRUE; @H_404_3@
} @H_404_3@
} while (0); @H_404_3@
{ @H_404_3@
(argc == 1) { @H_404_3@
arg0; @H_404_3@
404_3@
; } @H_404_3@
cobj->setScale(arg0); @H_404_3@
404_3@
JS_TRUE; @H_404_3@
} @H_404_3@
(0); @H_404_3@
JS_ReportError(cx,monospace!important; font-size:1em!important; min-height:inherit!important; color:blue!important; background:none!important">"js_cocos2dx_Node_setScale : wrong number of arguments" ); @H_404_3@
JS_FALSE; @H_404_3@
} @H_404_3@ @H_404_3@ @H_404_3@ @H_404_3@

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


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

11 @H_404_3@
setPosition: function (newPosOrxValue,yValue) { @H_404_3@
var locPosition = this ._position; @H_404_3@
if (arguments.length == 2) { @H_404_3@
locPosition._x = newPosOrxValue; @H_404_3@
locPosition._y = yValue; @H_404_3@
} else (arguments.length == 1) { @H_404_3@
locPosition._x = newPosOrxValue.x; @H_404_3@
locPosition._y = newPosOrxValue.y; @H_404_3@
} @H_404_3@
.setNodeDirty(); @H_404_3@
}, @H_404_3@ @H_404_3@ @H_404_3@ @H_404_3@


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


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

本文出自 “老G的小屋博客,请务必保留此出处http://www.jb51.cc/article/p-kduvryhh-vm.html

@H_404_3@

猜你在找的Cocos2d-x相关文章