对!起名字什么的讨厌了,请原谅我把名字再次起的如此没有水准儿。
分享给大家一个新的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; // 记录重复次数
};
(+_+) 看完头文件是不是有点晕?说实话我也有点晕了,隔了好几天没在看这个了,,,,,
#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哈哈~也请各位前辈多加指点,小弟在此谢过啦~\(≧▽≦)/~啦啦啦