关于cocos2dx CCCallfunc对象的传参 (2.x)

前端之家收集整理的这篇文章主要介绍了关于cocos2dx CCCallfunc对象的传参 (2.x)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

之前就觉得这个回调对象很麻烦,需要在create的时候,就把参数设置进去,然后execute的时候,只是直接用开始设定的参数调用这个函数。要更改,只能获取这个对象,然后用setObject来做,设置完了再execute。


而现在做lua,发现有这么一种神奇的做法:

function MessageCenter:send(message,...)
    if self.handlers[message] ~= nil then
        for k,v in pairs(self.handlers[message]) do
            self:onMsg(k,v,... )
        end
    end
end
function MessageCenter:onMsg(target,callback,...) 
    callback(target,...)
end


一分析,貌似C++也可以这么做啊,做了如下测试:
class base
{
public:
    int tag;
};

typedef void (base::*SEL_CallFunc)(int id,...);

#define CALLFUNC_SELECTOR(_SELECTOR) static_cast<SEL_CallFunc>(&_SELECTOR)

class callfunc
{
public:
    base* target;
    SEL_CallFunc func;
    
    void execute(int id,...)
    {
        base* tmp = nullptr;
        
        va_list argList;
        va_start(argList,id);
        while(1)
        {
            tmp = va_arg(argList,base*);
            
            if(tmp!=nullptr)
            {
                (target->*func)(id,tmp,nullptr);
            }
            else
            {
                break;
            }
        }
        va_end(argList);
    }
};

class child : public base
{
public:
    void testFunc(int id,base*);
            
            if(tmp!=nullptr)
            {
                cout<<"id : "<<id<<"  base tag : "<<tmp->tag<<endl;
            }
            else
            {
                break;
            }
        }
        va_end(argList);
    }
};


int main(int argc,const char * argv[])
{
    child *c = new child;
    callfunc *cf = new callfunc;
    
    cf->target = c;
    cf->func = CALLFUNC_SELECTOR(child::testFunc);
    
    
    base *iNode = new base;
    iNode->tag = 1989;
    
    cf->execute(2,iNode,nullptr);
    
    return 0;
}

测试能得到正常的结果。

说明可以实现


然后开始想,为什么之前C++不这样做呢。。。

想来想去,发现:

1、C++的强类型,支持动态特性有限,导致接收的变参类型不一致的时候,很麻烦。

2、类成员函数还要做静态转型,才能完成这样的封装(当然引擎里面一直是这么做的。。。)

3、这样好像也不比之前的setObject这一系列的操作简单。。。

原文链接:https://www.f2er.com/cocos2dx/344034.html

猜你在找的Cocos2d-x相关文章