cocos2d-x 2.2.6 之CCControlSwitch开关按钮

感慨什么的不多说了,就是想创建声音,音效的开关按钮,可参考cocos2d-x的Demo代码,其文件为:

  CCControlSwitchTest.cpp。

我将其资源放置到本人Demo的资源目录中,其大概代码如下:

.h文件

#include "cocos2d.h"
#include "cocos-ext.h"

USING_NS_CC;
USING_NS_CC_EXT;

// 声音音效的设定(仅写关键代码,且只写声音,其它的就不做编写了)
class UISwitch : public CCLayer
{
public:
    virtual bool init();
    virtual bool ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent);
    virtual void ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent);
    virtual void ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent);

private:
    void MusicChanged(CCObject* pSender,CCControlEvent controlEvent);   // 声音

private:
    CCControlSwitch* m_pWavSwitch;      // 声音按钮
    bool             m_bIsMusicTouched;   // 是否触摸声音按钮
};

.cpp文件

bool UISwitch::init()
{
     if(!CCLayer::init())
         return false;

    // 声音
    m_pMusicSwitch = CCControlSwitch::create(
        CCSprite::create("ui/switch-mask.png"),       // 按钮背景图
        CCSprite::create("ui/switch-on.png"),         // 开状态下背景图片
        CCSprite::create("ui/switch-off.png"),        // 关状态背景图片
        CCSprite::create("ui/switch-thumb.png"),      // 开关标记图片
        CCLabelTTF::create("On", "Arial", 16),        // 开文字标签
        CCLabelTTF::create("Off", "Arial", 16));     // 关文字标签

    if(m_pMusicSwitch != NULL)
    {
        // 注册事件
        m_pMusicSwitch->addTargetWithActionForControlEvents(this,
            cccontrol_selector(UISwitch::MusicChanged),
            CCControlEventValueChanged);
     // 设定位置
        m_pMusicSwitch->setPosition(ccp(550, 370));
        // 设置状态为开启
        m_pMusicSwitch->setOn(true);            
        this->addChild(m_pMusicSwitch,6);
    }
}

void UISwitch::MusicChanged( CCObject* pSender,CCControlEvent controlEvent )
{
    CCControlSwitch* pSwitch = (CCControlSwitch*)pSender;
    // 判断状态是否为开启
    if (pSwitch->isOn())
    {
        CCLog("UIPause music on");
    } 
    else
    {
        CCLog("UIPause music off");
    }
}

这些是按照cocos2d-x自带的demo来参考编写的,很不幸,事件点击无效,查看CCCcontrolSwitch类中发现,一个接口为:

bool hasMoved() { return m_bMoved; }

而针对于m_bMoved的设定为true时,仅仅在CCControlSwitch::ccTouchMoved(...)中进行了设定,所以,我采取了如下方式进行解决问题,这就是在代码中,我设定了bool m_bIsMusicTouched的原因,接下的代码如下:

bool UISwitch::ccTouchBegan( CCTouch *pTouch, CCEvent *pEvent )
{
    // 判断点击处是否为音乐开关按钮
    m_bIsMusicTouched = m_pMusicSwitch->ccTouchBegan(pTouch,pEvent);
}

void UISwitch::ccTouchMoved( CCTouch *pTouch, CCEvent *pEvent )
{
    // 音乐按钮移动处理
    if(m_bIsMusicTouched)
        m_pMusicSwitch->ccTouchMoved(pTouch,pEvent);
}

void UISwitch::ccTouchEnded( CCTouch *pTouch, CCEvent *pEvent )
{
    if(m_bIsMusicTouched)
    {
        m_pMusicSwitch->ccTouchEnded(pTouch,pEvent);
        m_bIsMusicTouched = false;
    }
}

这样的话,再点击就可以了,其效果如下:

 

对了,大家要注意一个这样的东东,在bool init()中要添加这样的代码:

// 参数一: 触摸接受的对象
// 参数二: 优先级,值越小,优先级越高
// 参数三: 是否“吞噬”触摸事件
CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this,-128,true);

同时,在void onExit中添加如下代码:

CCDirector::sharedDirector()->getTouchDispatcher()->removeDelegate(this);

不用了,就干掉,否则会引来其它触摸事件的问题,添加了这两句的主要目的就是为了防止事件透点,就说到这里吧。

(本人新人,参考了网上很多师兄师姐的资料,但没有一味的复制粘贴而不做考证,如果依然出现了问题,希望大家能够指正,感谢!)

 

posted @ 2016-02-01 00:53  Code~  阅读(447)  评论(0编辑  收藏  举报