[✔️]cocos2dx luabinding代码,参数类型的推断

90 阅读1分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 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_stringtools\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:静态重载函数