cocos2dx 一个新的control stepper

对!起名字什么的讨厌了,请原谅我把名字再次起的如此没有水准儿。

分享给大家一个新的control stepper,效果就是按住按钮,事件被连续执行。代码是根据cocos示例的cccontrolstepper改来的。看过cccontrolbutton那个例子都看到过,control stepper被绑定为两个按钮,我这里把它分离出来,改为了一个,希望有用的同学方便使用,顺便留下个脚印....

下边直接上代码了


#include "cocos-ext.h"
USING_NS_CC_EXT;
// 上边两行不解释了,,

// 这是一个“按到哪”的一个枚举类型,用来判断是否按在按钮上
typedef enum 
{
	kTouchPartInside,	// 按在按钮上 inside
	kTouchPartOutside,	// 移到外部了 outside
	kTouchPartNone		// 哪也没按
}UIButtonTouchPart;
// 继承自cccontrol
class UIStepButton : public CCControl
{
public :
	UIStepButton();
	virtual ~UIStepButton();

	// 试用一张图片来创建我们的按钮(看吧,函数名都没改,我真是有够懒的  =_=)
	bool initWithMinusSpriteAndPlusSprite(CCSprite *plusSprite);
	static UIStepButton* create( CCSprite *plusSprite);
	// 是否发送事件(不要翻译函数的名字!)
	virtual void setValueWithSendingEvent(bool send);
	virtual bool isContinuous();
	void update(float dt);
	// 触摸函数
    virtual bool ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent);
    virtual void ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent);
    virtual void ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent);

protected :
    CC_SYNTHESIZE_RETAIN(CCSprite*, m_pPlusSprite, PlusSprite)
	
    // 根据touch的位置判断点到了哪里
    void updateLayoutUsingTouchLocation(CCPoint location);
	// 开始重复执行事件
    void startAutorepeat();
	// 停止执行
    void stopAutorepeat();

    bool                    m_bContinuous;		// 是否继续的bool变量
    bool                    m_bAutorepeat;		// 是否重复的bool变量
    bool                    m_bTouchInsideFlag;		// 是否按到按钮的bool变量
    UIButtonTouchPart		 m_eTouchedPart;	// “按到哪里”的枚举变量
    int                     m_nAutorepeatCount;		// 记录重复次数
};

(+_+)  看完头文件是不是有点晕?说实话我也有点晕了,隔了好几天没在看这个了,,,,,


 好,下边是cpp,希望看完这个不会更晕


#define kAutorepeatDeltaTime                0.1f //经过多长时间开始连续执行事件
#define kAutorepeatIncreaseTimeIncrement    12


UIStepButton::UIStepButton()
: m_pPlusSprite(NULL)
, m_bContinuous(false)
, m_bAutorepeat(false)
, m_bTouchInsideFlag(false)
, m_eTouchedPart(kTouchPartNone)
, m_nAutorepeatCount(0)
{
}

UIStepButton::~UIStepButton()
{
    unscheduleAllSelectors();
    
    CC_SAFE_RELEASE(m_pPlusSprite);
}

bool UIStepButton::initWithMinusSpriteAndPlusSprite(CCSprite *plusSprite)
{
	if(!CCControl::init())	return false;
	
        CCAssert(plusSprite,    "Plus sprite must be not nil");
        
        setTouchEnabled(true);

        // Set the default values
        m_bAutorepeat                         = true;
        m_bContinuous                         = true;
        this->ignoreAnchorPointForPosition( false );
    
        
        this->setPlusSprite( plusSprite );
		m_pPlusSprite->setPosition( ccp(plusSprite->getContentSize().width / 2, plusSprite->getContentSize().height / 2) );
		this->addChild(m_pPlusSprite);
        // 这里需要对当前结点设置一下size,后边用这个size判断点到哪里
	this->setContentSize(m_pPlusSprite->getContentSize() );


	return true;
}

UIStepButton* UIStepButton::create(  CCSprite *plusSprite)
{
	UIStepButton *step = new UIStepButton();
	if(step && step->initWithMinusSpriteAndPlusSprite( plusSprite))
		step->autorelease();
	else
		CC_SAFE_DELETE(step);

	return step;
}

bool UIStepButton::isContinuous()
{
    return m_bContinuous;
}

void UIStepButton::setValueWithSendingEvent( bool send)
{    
    if (send)
    {
        this->sendActionsForControlEvents(CCControlEventValueChanged);
    }
}

void UIStepButton::startAutorepeat()
{
    m_nAutorepeatCount    = -1;
    
    this->schedule(schedule_selector(CCControlStepper::update), kAutorepeatDeltaTime, kCCRepeatForever, kAutorepeatDeltaTime * 3);
}

void UIStepButton::stopAutorepeat()
{
    this->unschedule(schedule_selector(CCControlStepper::update));
}

void UIStepButton::update(float dt)
{
    m_nAutorepeatCount++;
    
    if ((m_nAutorepeatCount < kAutorepeatIncreaseTimeIncrement) && (m_nAutorepeatCount % 3) != 0)
        return;
    /**
	呃,这个在原示例中是区分了加减号(详见示例效果..)
	在这里我们只有一个按钮,所以不用在做区分,只要一句  
this->setValueWithSendingEvent( m_bContinuous); 即可


*/ 
    //if (m_eTouchedPart == kCCControlStepperPartMinus)
    //{
        this->setValueWithSendingEvent( m_bContinuous);
    //} else if (m_eTouchedPart == kCCControlStepperPartPlus)
    //{
    //    this->setValueWithSendingEvent( m_bContinuous);
    //}
}

void UIStepButton::updateLayoutUsingTouchLocation(CCPoint location)
{
	// 看到size木有,这里就是根据touch点来判断是否点击到了按钮
    if (location.x < m_pPlusSprite->getContentSize().width)
    {
		m_eTouchedPart        = kTouchPartInside;
    } else if (location.x >= m_pPlusSprite->getContentSize().width)
    {
		m_eTouchedPart        = kTouchPartOutside;
    }
}

bool UIStepButton::ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent)
{
    if (!isTouchInside(pTouch) || !isEnabled() || !isVisible())
    {
        return false;
    }
    
    CCPoint location    = this->getTouchLocation(pTouch);
	// 传入触摸点坐标,进行判断
    this->updateLayoutUsingTouchLocation(location);
    
    m_bTouchInsideFlag = true;
    
	// autorepeat默认为true,所以调用重复函数
    if (m_bAutorepeat)
    {
        this->startAutorepeat();
    }
    
    return true;
}

void UIStepButton::ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent)
{
    if (this->isTouchInside(pTouch))
    {
        CCPoint location    = this->getTouchLocation(pTouch);
        this->updateLayoutUsingTouchLocation(location);
        // 这里的处理和判断都和begin里边的差不多,不重复写注释啦
        if (!m_bTouchInsideFlag)
        {
            m_bTouchInsideFlag    = true;
            
            if (m_bAutorepeat)
            {
                this->startAutorepeat();
            }
        }
    } else
    {
        m_bTouchInsideFlag    = false;
        
		m_eTouchedPart        = kTouchPartNone;
        
        if (m_bAutorepeat)
        {
            this->stopAutorepeat();
        }
    }
}

void UIStepButton::ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent)
{    
    if (m_bAutorepeat)
    {
        this->stopAutorepeat();
    }
    
    if (this->isTouchInside(pTouch))
    {
        CCPoint location    = this->getTouchLocation(pTouch);
    }
}

嗯,大概就是这样的一个情况了,欢迎各位看官、各路大神前来拍砖蛤~~~O(∩_∩)O哈哈~

也请各位前辈多加指点,小弟在此谢过啦~\(≧▽≦)/~啦啦啦




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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值