cocos2dx中CC_CALLBACK_1等宏中this指针实际指向

时间:2021-06-20 15:34:02

  首先看代码,我在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指针。