Cococs2dx:CCCallFuncN pSelectorTarget

时间:2013-11-08 07:18:23

标签: cocos2d-x

我是cocos2d-x的新手,也许这是一个愚蠢的问题。

这是我的代码: 在Helloworld的init()中:

CCSprite *pSprite1 = new CCSprite();
pSprite1 = CCSprite::create("Icon-72.png");
pSprite1->cocos2d::CCNode::setPosition(200, 200);
this->addChild(pSprite1);

CCSprite *pSprite2 = new CCSprite();
pSprite2 = CCSprite::create("Icon-72.png");
pSprite2->cocos2d::CCNode::setPosition(900, 500);
this->addChild(pSprite2);

CCSize size = CCDirector::sharedDirector()->getWinSize();
CCMoveTo *move = CCMoveTo::create(1.0f, ccp(size.width / 2, size.height / 2));
CCCallFuncN *callFuncN = CCCallFuncN::create(pSprite2, callfuncN_selector(HelloWorld::testCCCallFunc));
pSprite1->runAction(CCSequence::create(move, callFuncN, NULL));

这是testCCCallFunc:

void HelloWorld::testCCCallFunc(cocos2d::CCSprite *sender) {
sender->removeFromParentAndCleanup(true);}

我想要的是当pSprite1移动完成时,pSprite2将被删除。但是在实际的pSprite1中删除了,pSprite2仍然在屏幕上。

我试过替换

CCCallFuncN::create(pSprite1, callfuncN_selector(HelloWorld::testCCCallFunc));

CCCallFuncN::create(this, callfuncN_selector(HelloWorld::testCCCallFunc));

甚至是

CCCallFuncN::create(NULL, callfuncN_selector(HelloWorld::testCCCallFunc));

上面的所有代码运行正常,但我不能删除pSprite2,我做了什么?,CCObject * pSelectorTarget究竟用于什么?

PS:抱歉,我的英语不好。

1 个答案:

答案 0 :(得分:0)

首先,您应该在声明时删除new CCSprite();,因为您使用了create函数,该函数将自动释放。但是你没有为release()new,而会导致内存泄漏。

然后让我们回到你的问题。

从.h文件中,static CCCallFuncN * create(CCObject* pSelectorTarget, SEL_CallFuncN selector);有两个参数。

第一个是执行selector方法的对象。所以在你的情况下,这里应该是thisHelloWorld的实例)。

void HelloWorld::testCCCallFunc(cocos2d::CCSprite *sender)中,此sender实际上是运行操作的对象,这就是您pSprite1被删除的原因。

您可以查看CCCallFuncN::execute()CCActionManager::addAction()的源代码了解详情。

最后,为了达到你想要的效果,你可以使用CCCallFuncO

CCCallFuncO *callFuncO = CCCallFuncO::create(this, callfuncO_selector(HelloWorld::testCCCallFunc), pSprite2);
pSprite1->runAction(CCSequence::create(move, callFuncO, NULL));

void HelloWorld::testCCCallFunc(cocos2d::CCSprite *object) {
  object->removeFromParentAndCleanup(true);
}