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

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


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

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


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


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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
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函数吧。也是一样的。

1
2
3
4
5
6
7
8
9
10
11
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来判断参数个数,然后执行对应的分支代码。


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

本文出自 “做游戏的老G” 博客,请务必保留此出处http://goldlion.blog.51cto.com/4127613/1354185

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值