cocos2d-x-2.2.3 CCAssert( child->m_pParent == NULL, "child already added. It can't be added again");的一种情况
看了本书,书上比较坑爹的部分就是基本只给函数,不给完整的文件,对于新手来说真是让人捉急啊~~~
看到CCControl的时候,试了下CCControlSlider,
书上只给了init()函数的代码,头文件啊命名空间什么的都没提,有点坑爹~
改了改查了查,完整的(好吧,一个比较坑爹的实现).h文件代码大致如下:
#include <iostream> #include "cocos2d.h" #include "cocos-ext.h" USING_NS_CC_EXT; //cocos2d的命名空间搞不太清,还没找到比较靠谱的说明
USING_NS_CC;
class QSlider :public CCControlSlider{ public: bool init();//主要实现的就是这个了 void valueChange(CCObject *sender,CCControlEvent controlEvent); void onEixt(); void onEnter(); };
.cpp文件如下:
#include "QSlider.h" USING_NS_CC; bool QSlider::init(){ if(!CCControlSlider::init()){ return false; } CCSize size = CCDirector::sharedDirector()->getWinSize(); CCControlSlider *slider = CCControlSlider::create("sliderT1.png", "sliderT2.png", "sliderT3.png");//空滑道图片,拖滑块占满的滑道图片,滑块图片 slider->setMinimumValue(0.0f); slider->setMaximumValue(5.0f); slider->setPosition(ccp(size.width/2, size.height/2)); slider->addTargetWithActionForControlEvents(this, cccontrol_selector(QSlider::valueChange),CCControlEventValueChanged); addChild(slider,0); return true; } void QSlider::valueChange(cocos2d::CCObject *sender, CCControlEvent controlEvent){ CCSize size = CCDirector::sharedDirector()->getWinSize(); CCControlSlider *pSlider = (CCControlSlider*)sender; CCLabelTTF* label = CCLabelTTF::create("", "Zapfino", 45); label->setPosition(ccp(size.width/2, size.height/2+100)); label->setColor(ccc3(192, 168, 1)); addChild(label,1); label->setString(CCString::createWithFormat("slider value= %.2f",pSlider->getValue())->getCString()); } void QSlider::onEixt(){ CCLog("gone~"); CCControlSlider::onExit(); } void QSlider::onEnter(){ CCLog("have!"); CCControlSlider::onEnter(); }
之后直接在HelloWorld.cpp里面加了句
QSlider *slider;
然后 this->addChild(slider);
然后就有了标题的CCAssert( child->m_pParent == NULL, "child already added. It can't be added again");
看到这个霎时有点找不到原因,already added?
但是改了下上面那句,QSlider *slider = new QSlider();
之后就没问题往出冒了~~
sa~~比较奇怪为什么冒出的是这句~
然后~~~
发现运行成功出现的是一个很神奇的东东~
slider value = ...
是一团模糊啊~~拉一次多一次~~
原因是void valueChange(CCObject *sender,CCControlEvent controlEvent)这个函数,它会在slider值改变的时候就执行,相当于创建了N多的CCLabelTTF~~
所以解决方法就是把QSlider继承于CCLayer~~
改动后的代码如下:
#include <iostream> #include "cocos2d.h" #include "cocos-ext.h" USING_NS_CC_EXT; USING_NS_CC; class QSlider :public CCControlSlider{ public: bool init(); void valueChange(CCObject *sender,CCControlEvent controlEvent); void onEixt(); void onEnter(); CCLabelTTF *label; };
#include "QSlider.h" USING_NS_CC; bool QSlider::init(){ if(!CCControlSlider::init()){ return false; } CCSize size = CCDirector::sharedDirector()->getWinSize(); CCControlSlider *slider = CCControlSlider::create("sliderT1.png", "sliderT2.png", "sliderT3.png"); slider->setMinimumValue(0.0f); slider->setMaximumValue(5.0f); slider->setPosition(ccp(size.width/2, size.height/2)); slider->addTargetWithActionForControlEvents(this, cccontrol_selector(QSlider::valueChange),CCControlEventValueChanged); addChild(slider,0); label = CCLabelTTF::create("", "Zapfino", 45); label->setPosition(ccp(size.width/2, size.height/2+100)); label->setColor(ccc3(192, 168, 1)); addChild(label,1,1); return true; } void QSlider::valueChange(cocos2d::CCObject *sender, CCControlEvent controlEvent){ CCControlSlider *pSlider = (CCControlSlider*)sender; label->setString(CCString::createWithFormat("slider value= %.2f",pSlider->getValue())->getCString()); } void QSlider::onEixt(){ CCLog("gone~"); CCControlSlider::onExit(); } void QSlider::onEnter(){ CCLog("have!"); CCControlSlider::onEnter(); }
这样就大丈夫~木有重影了~~
之前用CCNode设置了旋转~效果如下~