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);

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

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

时间: 2024-08-06 05:57:10

cocos2d-x 2.2.6 之CCControlSwitch开关按钮的相关文章

cocos2dx基础篇(10)——开关按钮CCControlSwitch

[本节内容] 开关类CCControlSwitch继承于控件类CCControl. 控件类CCControl主要向子类提供了一系列的控件触发事件.当子控件触发相关的事件后,就会执行相关的控件事件回调函数.这与之前讲的CCMenu中的菜单按钮回调是类似的. 控件类CCControl主要有三个子类: (1)开关控件CCControlSwitch (2)滑块控件CCControlSlider (3)按钮控件CCControlButton 本节讲的是其子类其中之一:开关类CCControlSwitch.

Cocos2D学习笔记(1)- 常用的类

1.坐标系 >屏幕坐标系(UIKit):原点在左上角! >OpenGl坐标系:原点在屏幕的左下角! 2.游戏设计:Director--Scene--Layer--Sprite. >CCDirector:导演类,相当于是游戏策划,负责整个游戏的布局和运行规则的制定. >CCScene:场景类,每个场景可以是一个界面或一个关卡. >CCLayer:图层类,为了方便游戏界面的渲染管理. >CCSprite:精灵类, 小结:一个导演类(CCDirector)可以指挥多个场景类(

1cocos2dx扩展库UI控件,CCControlSlider,CCScale9Sprite(九妹图),CCControlSwitch,CCControlButton

 UI控件来自cocos2dx的扩展库,完善了UI方面的元素,使cocos2dx更加丰富多彩.使用扩展库需包含: #include "cocos-ext.h" USING_NS_CC_EXT; CCControlSlider CCControlSlider * slider = CCControlSlider::create("sliderTrack.png","sliderProgress.png","sliderThumb.pn

PyQt4开关按钮ToggleButton

PyQt4没有开关按钮部件.但是我们可以使用在特殊状态下的QPushButton部件来创建开关按钮.而所谓的开关按钮就是一个具有按下和未按下两种状态的普通赶牛.用户可以通过单击按钮来切换其开或者关的状态.在一些情形下,这个特性会非常好用. #!/usr/bin/python # -*- coding: utf-8 -*- import sys from PyQt4 import QtGui, QtCore class ToggleButton(QtGui.QWidget): def __init

cocos2d::Vector

v3.0 beta加入 定义在"COCOS2DX_ROOT/cocos/base"的"CCVector.h"头文件中. template<class T>class CC_DLL Vector; cocos2d::Vector<T>是一个封装好的能动态增长顺序访问的容器. cocos2d::Vector<T>中的元素是按序存取的,它的低层实现数据结构是标准模版库中的标准顺序容器std::vector. 在Cocos2d-x v3.

Cocos2D中Action的进阶使用技巧(一)

大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 假设认为写的不好请多提意见,假设认为不错请多多支持点赞.谢谢! hopy ;) 大家对Cocos2d中动作的使用大概都非常清楚了,事实上本身action的概念也不复杂. 可是在某些情况下,一般的动作不能满足我们需求的时候,我们就必须使用更高级的Action方法来解决这个问题. 比方,串行化(不是序列化哦,这是两个全然不同的概念)不同Action的执行-有些童鞋可能会说非常easy,直接用CCActionSequence不就结了,可是等等我

Cocos2d入门--3-- 向量的应用

 Cocos2d入门--3-- 向量的应用 小球向一个方向持续运动的Demo HelloWorldScene.h ...... //设置一个protected的属性 protected: cocos2d::Vec2 _vec; ...... HelloWorldScene.cpp //这个是通过随机数设置向量的方向 _vec.set(random(-0.1f, 1.0f), random(-1.0f, 1.0f)); //通过normalize这个标准化函数,能够使得向量的大小为1 _vec.n

Cocos2d入门--1-- 初涉相关属性或代码

 Cocos2d入门--1-- 初涉相关属性或代码 Cocos2d vision:  cocos2d-x-3.8.1 万丈高楼,起于累土.对于一个游戏框架的学习,其实在于框架功能的使用积累,学会了如何在cocos2d游戏引擎的基础上使用它提供的各种功能,并灵活运用, 以及学会查阅Cocos2d官方提供的API文档.相信自己也能开发出自己喜爱或者让别人羡慕的游戏. 目录: 1>认识origin和visibleSize以及cocos2d的基础绘画类DrawNode的简单实用 2>认识 CCLOG(

UITableViewController 滚动引起的cocos2d动画暂停问题的解决

UITableViewController 滚动引起的cocos2d动画暂停问题的解决 之前在使用UITableViewController进行滚动时,cocos2d的动画会暂停,直至滚动完毕才会继续动画. 后来发现可以这样解决,想要了解更多,请查阅NSRunLoop相关知识. // .h NSTimer* m_timer; // .m- (void)updateCCDirector { [[CCDirector sharedDirector] drawScene]; if (!self.tab