博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【cocos2d-x从c++到js】JS与C++的交互2——JS与C++的“函数重载”问题
阅读量:1969 次
发布时间:2019-04-27

本文共 1984 字,大约阅读时间需要 6 分钟。

对于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来判断参数个数,然后执行对应的分支代码。


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

转载地址:http://wzypf.baihongyu.com/

你可能感兴趣的文章
基础架构系列篇-NGINX部署VUE
查看>>
个人电商项目,基于uni-app+ springcloud +VUE技术
查看>>
基础架构系列篇-系统centos7安装kafka
查看>>
基础架构系列篇-系统centos7中docker安装分布式文件存储服务minio
查看>>
知识点记录-java判断系统是linux或windows
查看>>
知识点记录-springboot静态资源映射路径
查看>>
知识点记录-vue-cli+webpack打包运行图标显示异常
查看>>
知识点记录-springboot2.1集成rabbitmq
查看>>
微服务springcloud2系列篇-配置与注册nacos组件
查看>>
微服务springcloud2系列篇-集成分布式事务seata1.4.1(数据库mysql8)与nacos1.4.1注册配置(WINDOWS环境)
查看>>
数据库系列篇-多数据源集成+springboot+数据库连接池druid(使用注解切换方式) (方便的直接切换方式待更新)
查看>>
数据库系列篇mysql8-分库分表中间件mycat(WINDOWS环境)
查看>>
用户权限设计-基于RBAC模型
查看>>
微服务springcloud2系列篇-网关GATEWAY跨域问题
查看>>
微服务springcloud(H版本)与springboot(2.X版本) maven常见问题整理记录
查看>>
Java并发以及多线程基础
查看>>
软件质量的8个特性
查看>>
应届渣渣前端的艰难求职之路
查看>>
2021年不可错过的17种JS优化技巧(一)
查看>>
2021年不可错过的17种JS优化技巧(二)
查看>>