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

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

概述2014-01-23 17:03:50 标签: js  cocos2d-x  jsb 原创作品,允许转载,转载时请务必以超链接形式标明文章  原始出处 、作者信息和本声明。否则将追究法律责任。 http://www.voidcn.com/article/p-kduvryhh-vm.html 对于C++来说,存在函数重载,例如: 1 2 void  CCNode::setScale( float  2014-01-23 17:03:50 标签: js cocos2d-x jsb 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处、作者信息和本声明。否则将追究法律责任。 http://www.jb51.cc/article/p-kduvryhh-vm.html

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


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

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


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


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

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

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); (!ok) { ok = Js_TRUE; break ; } arg1; ; } cobj->setScale(arg0,arg1); Js_SET_RVAL(cx,vp,JsVAL_VOID); return Js_TRUE; } } while (0); { (argc == 1) { arg0; ; } cobj->setScale(arg0); Js_TRUE; } (0); 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" ); Js_FALSE; }

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


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

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


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


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

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

总结

以上是内存溢出为你收集整理的【cocos2d-x从c++到js】10:JS与C++的交互2——JS与C++的“函数重载”问题全部内容,希望文章能够帮你解决【cocos2d-x从c++到js】10:JS与C++的交互2——JS与C++的“函数重载”问题所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1020095.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-23
下一篇 2022-05-23

发表评论

登录后才能评论

评论列表(0条)

保存