我是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:抱歉,我的英语不好。
答案 0 :(得分:0)
首先,您应该在声明时删除new CCSprite();
,因为您使用了create
函数,该函数将自动释放。但是你没有为release()
写new
,而会导致内存泄漏。
然后让我们回到你的问题。
从.h文件中,static CCCallFuncN * create(CCObject* pSelectorTarget, SEL_CallFuncN selector);
有两个参数。
第一个是执行selector
方法的对象。所以在你的情况下,这里应该是this
(HelloWorld
的实例)。
在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);
}