首先看代码,我在Helloworld中添加两个函数。
void HelloWorld::addTarget(){ Size visibleSize = Director::getInstance()->getVisibleSize(); auto target = Sprite::create(, , , )); int cSizeH = target->getContentSize().height; int cSizeW = target->getContentSize().width; ; ; int rangeY = maxY - minY; int actualY = (CCRANDOM_0_1() * rangeY) + minY; target->setPosition(Point(visibleSize.width + cSizeW /,actualY)); ); int minDuration = 2.0; int maxDuration = 4.0; int rangeDuration = maxDuration - minDuration; int actualDuration = (CCRANDOM_0_1() * rangeDuration) + minDuration; auto actionMove = MoveTo::create(actualDuration,Point(-cSizeW/,actualY)); auto actionMoveDone = CallFuncN::create( CC_CALLBACK_1(HelloWorld::spriteMoveFinishedCallback,this)); target->runAction(Sequence::create(actionMove,actionMoveDone,NULL)); } void HelloWorld::spriteMoveFinishedCallback(Ref* pSender){ Sprite* sprite = static_cast<Sprite*>(pSender); this->removeChild(sprite); }
一般来说,我们使用CC_CALLBACK_1这个宏来绑定HelloWorld类中spriteMoveFinishedCallback函数和this指针,既然代码处于HelloWorld类中,我们会认为this指针是指向函数所在的HelloWorld类对象。可是,实际调试代码发现,this指针指向的是调用这个动作(cocos2dx中把函数调用认为是动作的一种)的对象,在这里也就是那个target。
其实仔细想来,this指针在这里确实是这样的,this指针真正的初始化应该发生在target这个对象调用动作的时候,这时候,自然就把target对象传递给了this指针。