之前看到大神分享的打飞机的代码,里面有几句不理解,在这里希望大神能帮忙解答一下…
auto repeatdone = CallFuncN::create(CC_CALLBACK_1(WelcomeLayer::loadingDone,this));
auto sequence = Sequence::create(repeat, repeatdone, nullptr);
loading->runAction(sequence);
void WelcomeLayer::loadingDone(Node* pNode)
{
auto pScene = GameScene::create();
auto animateScene = TransitionMoveInB::create(0.5f,pScene);
Director::getInstance()->replaceScene(animateScene);
}
很不理解的就是, CC_CALLBACK把后面的loadingDone绑定之后,为什么不需要传参数了呢,这个loadingDone函数是需要一个Node *pNode参数的,但是没有看到哪里穿进去了…还有个问题就是,这个loadingDone为什么需要一个Node *pNode,在函数定义里面也没有用到呀
1.loadingDone函数需要的Node *pNode参数,就是这句语句中的this
auto repeatdone = CallFuncN::create(CC_CALLBACK_1(WelcomeLayer::loadingDone,this));
2.loadingDone函数,确实用不到参数Node *pNode,可以不传。此时把CC_CALLBACK_1换成CC_CALLBACK_0即可,写法如下:
auto repeatdone = CallFuncN::create(CC_CALLBACK_0(WelcomeLayer::loadingDone));
void WelcomeLayer::loadingDone(){…}
其实我对CC_CALLBACK_1的理解就是
auto repeatdone = CallFuncN::create(CC_CALLBACK_1(WelcomeLayer::loadingDone,this));
这句话等价于
auto repeatdone = CallFuncN::create(std::bind(&WelcomeLayer::loadingDone, this, std::placeholders::_1));
假如说他俩等价的话,this其实并不是loadingDone要传进去的参数,只是需要的一个target而已啊 但是会不会如1L大幅船长说的,这个函数谁调用系统就会自动传谁进去呢…只不过这里巧合需要的参数恰巧就是前面的this? 或者说 假如loadingDone需要一个int类型的参数,那么这里确实没有传参进去…
我重新回答一遍,原来的说错了
1.loadingDone函数需要的Node *pNode参数,是repeatdone被调用时传入的
大副船长说的是对的,谁调用repeatdone 就传入谁,是这个意思:
loading->runAction(sequence);
是loading调用了repeatdone,所以是把loading传入loadingDone函数中
loadingDone执行时,指针pNode指向的对象就是loading
2.这里没有用到pNode,但可以在loadingDone函数中,执行这种操作,pNode->stopAllActions();
之所以repeatdone被调用时,会传入调用者,是因为repeatdone是CallFuncN类型的,另外还有种类型CallFunc,执行时不会传入任何参数,此时代码如下
auto repeatdone = CallFunc::create(CC_CALLBACK_1(WelcomeLayer::loadingDone,this));
auto sequence = Sequence::create(repeat, repeatdone, nullptr);
loading->runAction(sequence);
void WelcomeLayer::loadingDone()
{
auto pScene = GameScene::create();
auto animateScene = TransitionMoveInB::create(0.5f,pScene);
Director::getInstance()->replaceScene(animateScene);
}
3.楼主的理解是对的,以下2种写法是等价的
auto repeatdone = CallFuncN::create(CC_CALLBACK_1(WelcomeLayer::loadingDone,this));
auto repeatdone = CallFuncN::create(std::bind(&WelcomeLayer::loadingDone, this, std::placeholders::_1));
4.关于this的话,当bind的第1个参数是类的成员函数时,需要加上this。如果第1个参数是全局函数,或者静态函数时,不需要加上this。例如:
a.全局函数:
void loadingDone(Node* pNode){…}
auto repeatdone = CallFuncN::create(CC_CALLBACK_1(loadingDone));
b.静态函数
class WelcomeLayer : public cocos2d:Layer
{
static void loadingDone(Node* pNode);
};
auto repeatdone = CallFuncN::create(CC_CALLBACK_1(WelcomeLayer::loadingDone));
好久没来论坛,忘了回复,十分十分感谢您详细的回答…