cocos2dx 一个新的control stepper
来源:互联网 发布:cf按键精灵自瞄源码 编辑:程序博客网 时间:2024/05/29 15:28
对!起名字什么的讨厌了,请原谅我把名字再次起的如此没有水准儿。
分享给大家一个新的control stepper,效果就是按住按钮,事件被连续执行。代码是根据cocos示例的cccontrolstepper改来的。看过cccontrolbutton那个例子都看到过,control stepper被绑定为两个按钮,我这里把它分离出来,改为了一个,希望有用的同学方便使用,顺便留下个脚印....
下边直接上代码了
#include "cocos-ext.h"USING_NS_CC_EXT;
// 上边两行不解释了,,
// 这是一个“按到哪”的一个枚举类型,用来判断是否按在按钮上typedef enum {kTouchPartInside,// 按在按钮上 insidekTouchPartOutside,// 移到外部了 outsidekTouchPartNone// 哪也没按}UIButtonTouchPart;// 继承自cccontrolclass 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 12UIStepButton::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();elseCC_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
- cocos2dx 一个新的control stepper
- plist 文件、slider、stepper的使用
- quick-cocos2dx 如何派生一个新类
- quick-cocos2dx 如何派生一个新类
- 在用vs2010导入一个cocos2dx 新工程时遇到的一些问题
- iOS5编程--新增控件stepper的使用
- Tab Control的一个运用
- edit control的一个例子
- cocos2dx socket的一个方案
- 一个cocos2dx的扩展库
- cocos2dx AssetsManager的一个BUG
- cocos2dx AssetsManager的一个BUG
- WebBrowser Control的一个简单C++封装
- WebBrowser Control的一个简单C++封装
- 一个定制SEGMENTED CONTROL的开源代码
- swift UI专项训练41 用纯代码的方式实现stepper的值传递
- 一个新的起点
- 一个新的开始...
- c++-嵌套类与局部类
- 第六周自习内容网盘链接http://pan.baidu.com/s/1mgqg6zm
- lex语法分析器
- Linkify
- 在VS2008中创建或加载sliverlight项目失败
- cocos2dx 一个新的control stepper
- JFileChooser 保存文件时根据选择的文件类型改变文件后缀名
- 记事本TXT格式 删除空行 软件 红星小作
- 初学shell脚本编程注意空格问题
- 字符集和字符编码(Charset & Encoding)
- 一个基于AbstractQueuedSynchronizer类的Java的Mutex类的实现
- 编程中使用无符号类型潜在的问题
- 机器学习入门阶段程序员易犯的5个错误
- 32/64位操作系统数据类型字节对比