0

我是 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:对不起我的英语不好。

4

1 回答 1

0

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

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

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

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

void HelloWorld::testCCCallFunc(cocos2d::CCSprite *sender)中,这sender实际上是运行 action 的对象,这就是你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);
}
于 2013-11-08T11:50:46.153 回答