2
#define CC_CALLBACK_0(__selector__,__target__, ...) std::bind(&__selector__,__target__, ##__VA_ARGS__)
#define CC_CALLBACK_1(__selector__,__target__, ...) std::bind(&__selector__,__target__, std::placeholders::_1, ##__VA_ARGS__)
#define CC_CALLBACK_2(__selector__,__target__, ...) std::bind(&__selector__,__target__, std::placeholders::_1, std::placeholders::_2, ##__VA_ARGS__)
#define CC_CALLBACK_3(__selector__,__target__, ...) std::bind(&__selector__,__target__, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3, ##__VA_ARGS__)

请原谅我的英语不好~~~!

头文件"ccMacros.h"Cocos2d-x 3.x,CC_CALLBACK Technology使用的是new ISO C++ standard std::bind,例如:</p>

    class HelloWorldScene : cocos2d::Layer
{
public :
    static cocos2d::Scene* createScene();
    virtual bool init();
    CREATE_FUNC(HelloWorldScene);
    // overload this function
    void ontouchmoved(cocos2d::Touch*, cocos2d::Event*);
};

// HelloWorld.cpp

    bool HelloWorldScene::init()
{
    auto listener = cocos2d::EventListenerTouchOneByOne::create();

    listener->onTouchBegan = [](cocos2d::Touch* _touch, cocos2d::Event* _event){ CCLOG("onTouchBegan..."); return true;};
    // using the CC_CALLBACK 
    listener->onTouchMoved = CC_CALLBACK_2(HelloWorldScene::ontouchmoved, this);
    listener->onTouchEnded = [](cocos2d::Touch* _touch, cocos2d::Event* _event){ CCLOG("onTouchEnded...");};
    cocos2d::Director::getInstance()->getEventDispatcher()->addEventListenerWithSceneGraphPriority(listener, this);

    return true;
}
void HelloWorldScene::ontouchmoved(cocos2d::Touch* touch, cocos2d::Event* event)
{
    CCLOG("onTouchMoved...");
}

我发送这个函数"HelloWorld::ontouchmoved"和指针"this",`"HelloWorld::ontouchmoved" 是 CC_CALLBACK_2 中的选择器,"this" 是 CC_CALLBACK_2 中的目标。但是为什么呢?我不再向 CC_CALLBACK_2 发送参数,但 CC_CALLBACK_2 的定义是:

#define CC_CALLBACK_2(__selector__,__target__, ...) std::bind(&__selector__,__target__, std::placeholders::_1, std::placeholders::_2, ##__VA_ARGS__)

placeholders_1 和 placehoders_2 没有绑定参数,它们有什么用呢?我猜他们绑定了HelloWorld::ontouchmoved的参数,但我不知道绑定HelloWorld::ontouchmoved参数的方法。</p>

帮帮我!非常感谢!

4

3 回答 3

1

我不完全理解你的问题,但为什么不使用 lambda 函数呢?:

auto listener = EventListenerTouchOneByOne::create();
listener->setSwallowTouches(true);

listener->onTouchBegan = [&](Touch* touch, Event* event){

};

listener->onTouchMoved = [&](Touch* touch, Event* event){

};

listener->onTouchEnded = [&](Touch* touch, Event* event){

};

listener->onTouchCancelled = [&](Touch* touch, Event* event){

};

_eventDispatcher->addEventListenerWithSceneGraphPriority(listener, this);
于 2015-12-14T08:18:15.833 回答
0

请阅读 addEventListenerWithSceneGraphPriority 函数中的更多详细信息。此时添加了触摸和事件。

于 2015-12-14T09:05:55.180 回答
0

std::placeholders::_N 的目的是允许 std::bind 创建一个参数与原始函数的第 N 个参数匹配的函数。

如果要创建一个采用较少参数(环绕原始函数)或重新排序或复制原始参数的函数,您可以附加值而不是占位符。您还可以绑定通过值或引用传入的任何变量。

如果您想了解更多关于您可以做的所有疯狂事情的​​信息,您需要阅读更多关于 std::bind 的内容。

http://en.cppreference.com/w/cpp/utility/functional/bind

于 2015-12-17T02:11:17.267 回答