开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 7 天,点击查看活动详情
模板的现有结果:
if (argc == ${arg_idx})
{
#set $count = 0
#while $count < $arg_idx
#set $arg = $arguments[$count]
## 参数声明
${arg.to_string($generator)} arg${count};
#set $count = $count + 1
#end while
#set $count = 0
#set arg_list = ""
#set arg_array = []
#while $count < $arg_idx
#set $arg = $arguments[$count]
## ...
## 单个参数的拼接
#set $arg_array += ["arg"+str(count)]
#end while
## 函数的所有参数是通过join拼接出来的字符串
#set $arg_list = ", ".join($arg_array)
## 函数调用的地方
最终生成的c++代码
if (argc == 3)
{
cocos2d::Vec2 arg0;
bool arg1;
cocos2d::Vec2* arg2; // 我先修改这里的类型,不适用指针
cocos2d::Vec2 ret = Map::Pixel(arg0, arg1, arg2); // arg2的参数类型不符合预期,也需要改为&
优化指针类型
arg.to_string 在tools\bindings-generator\generator.py中有定义
里面会返回变量的类型,如果类型是指针也会原封不动的返回,所以也就看到了cocos2d::Vec2*,那么我们只需要修改下arg.to_string的实现就行了,可以根据self.is_pointer进行判断处理变量的类型
改完后,在调用的地方需要正确传参,预期的结果应该是:
cocos2d::Vec2 arg2;
cocos2d::Vec2 ret = Map::Pixel(arg0, arg1, &arg2);
args2要正确替换为&arg2,经过上边的分析,我们发现只需要在拼接单个参数的地方修改下即可,如果参数是指针类型,入参加上&即可,类似这样
#set $arg_array += [arg.to_prefix()+"arg"+str(count)]
在python中加上对应的函数:
def to_prefix(self)
if self.is_pointer:
return "&"
else:
return ""
具体的修改,参考这次:pr
函数指针参数的意义
目前这样就能达到预期的进行函数调用了
cocos2d::Vec2 arg2;
cocos2d::Vec2 ret = Map::Pixel(arg0, arg1, &arg2);
不过这样的调用其实没有什么意义,arg2是一个临时变量,使用完毕就抛弃了,其实我把参数声明为指针,是希望函数修改后,供外部使用,返回给lua才有意义,如果仅仅作为参数,其实是没有必要声明为指针的。
返回给lua多个值,目前模板不支持,需要后续慢慢再进行优化。
相关的模板代码
- ifunction.c:成员函数
- ifunction_overloaded.c:成员函数重载
- sfunction.c: 静态函数
- sfunction_overloaded.c:静态重载函数