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设置了旋转~效果如下~

 

转载于:https://www.cnblogs.com/muqin/p/3680375.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值