cocos2d-x加减长按

长按键方法实现

1、首先开启触摸

记着在init方法中开启触摸:this->setTouchEnabled(true);

2、在.h文件中声明或重写以下方法

重写几个方法

//------------------------------------.h文件--------------------------------------------------

//触摸方法

virtual bool ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent);

virtual void ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent);

virtual void ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent);

virtual void onEnter();

virtual void onExit();

//长按键计时器方法-------加-----------------

void update_jia_func(float dlt);

//长按键计时器方法------------------------

void update_jian_func(float dlt);

//------------------------------------.h文件--------------------------------------------------

3

该例子中实际上包含了两个长按键功能的实现:

分别是,都实现了长按键的功能

以下是方法中的具体内容:

  1. void ChangeMoney::onEnter()  
  2. {  
  3.     CCLayer::onEnter();  
  4.     CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this,0,true);  
  5. }  
  6. void ChangeMoney::onExit()  
  7. {  
  8.     CCDirector::sharedDirector()->getTouchDispatcher()->removeDelegate(this);  
  9.     CCLayer::onExit();  
  10. }  
  11. //1.在ccTouchBegan和ccTouchMoved中实现长按键处理  
  12. bool ChangeMoney::ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent)  
  13. {  
  14.     CCPoint p=pTouch->getLocation();  
  15.     //首先判断是否点中了加号  
  16.     //获取加号的tag值  
  17.     sprite=(CCSprite *)this->getChildByTag(101);  
  18.     if (sprite)  
  19.     {  
  20.         if (sprite->boundingBox().containsPoint(p))  
  21.         {  
  22.             //currentCount是一个int型变量,标识数字的当前值,allCanBeChanged是最大值,判断currentCount是否已经增加到最多  
  23.             if (currentCount>=allCanBeChanged)  
  24.             {  
  25.                 this->unschedule(schedule_selector(ChangeMoney::update_jia_func));  
  26.                 //设置图片为灰色,灰色标示不可用  
  27.                 sprite=(CCSprite *)this->getChildByTag(101);  
  28.                 if (sprite)sprite->setColor(ccGRAY);  
  29.             }  
  30.             else  
  31.             {  
  32.                 //设置图片为白色  
  33.                 sprite=(CCSprite *)this->getChildByTag(101);  
  34.                 if (sprite)sprite->setColor(ccWHITE);  
  35.                 //currentCount没有增加到最大值时,允许自增  
  36.                 currentCount++;  
  37.                 //currentCount增加后改变label的显示  
  38.                 CCLabelTTF *label=(CCLabelTTF *)this->getChildByTag(201);  
  39.                 string=CCString::createWithFormat("%d",currentCount);  
  40.                 label->setString(string->getCString());  
  41.             }  
  42.             //当touchBegin时,先是currentCount自增1,然后再执行计时器函数  
  43.             this->schedule(schedule_selector(ChangeMoney::update_jia_func),0.1f);  
  44.         }  
  45.         //当触摸到sprite之外时停止计时器函数  
  46.         else   
  47.         {  
  48.             this->unschedule(schedule_selector(ChangeMoney::update_jia_func));  
  49.         }  
  50.     }  
  51.   
  52.     //-----------------减操作的原理与上面加操作的原理一样---------------------------------------------  
  53.   
  54.     //接着判断是否点中了减号  
  55.     //根据tag获取sprite  
  56.     sprite=(CCSprite *)this->getChildByTag(102);  
  57.     if (sprite)  
  58.     {  
  59.         if (sprite->boundingBox().containsPoint(p))  
  60.         {  
  61.             //已经减少至最少  
  62.             if (currentCount<=0)  
  63.             {  
  64.                 //停止计时器函数,因为已经减少到最少了,没必要再执行计时器函数消耗系统资源了  
  65.                 this->unschedule(schedule_selector(ChangeMoney::update_jian_func));  
  66.                 //设置图片为灰色,灰色默认为不可用  
  67.                 sprite=(CCSprite *)this->getChildByTag(102);  
  68.                 if (sprite)sprite->setColor(ccGRAY);  
  69.             }  
  70.             //没有减少至最少,可执行减的操作  
  71.             else  
  72.             {  
  73.                 //设置图片为白色  
  74.                 sprite=(CCSprite *)this->getChildByTag(102);  
  75.                 if (sprite)sprite->setColor(ccWHITE);  
  76.                 //自减1  
  77.                 currentCount--;  
  78.                 //改变label的显示  
  79.                 CCLabelTTF *label=(CCLabelTTF *)this->getChildByTag(201);  
  80.                 string=CCString::createWithFormat("%d",currentCount);  
  81.                 label->setString(string->getCString());  
  82.             }  
  83.             //调用减号的计时器方法  
  84.             this->schedule(schedule_selector(ChangeMoney::update_jian_func),0.1f);  
  85.         }  
  86.         //没有点中减号则取消计时器函数  
  87.         else  
  88.         {  
  89.             this->unschedule(schedule_selector(ChangeMoney::update_jian_func));  
  90.         }  
  91.               
  92.     }  
  93.     return true;  
  94. }  
  95.   
  96.   
  97. //ccTouchMoved中方法的执行道理其实跟ccTouchBegan中是一样的  
  98. void ChangeMoney::ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent)  
  99. {  
  100.     CCPoint p=pTouch->getLocation();  
  101.     //加  
  102.     sprite=(CCSprite *)this->getChildByTag(101);  
  103.     if (sprite)  
  104.     {  
  105.         if (sprite->boundingBox().containsPoint(p))  
  106.         {  
  107.             this->schedule(schedule_selector(ChangeMoney::update_jia_func),0.1f);  
  108.         }  
  109.         else this->unschedule(schedule_selector(ChangeMoney::update_jia_func));  
  110.     }  
  111.     //减  
  112.     sprite=(CCSprite *)this->getChildByTag(102);  
  113.     if (sprite)  
  114.     {  
  115.         //move的过程中划中减号则执行计时器函数自减  
  116.         if (sprite->boundingBox().containsPoint(p))  
  117.         {  
  118.             this->schedule(schedule_selector(ChangeMoney::update_jian_func),0.1f);  
  119.         }  
  120.           
  121.         else this->unschedule(schedule_selector(ChangeMoney::update_jian_func));  
  122.     }  
  123. }  
  124. //在ccTouchEnded函数中取消计时器函数的执行  
  125. void ChangeMoney::ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent)  
  126. {  
  127.     this->unscheduleAllSelectors();  
  128. }  
  129. void ChangeMoney::update_jia_func(float dlt)  
  130. {  
  131.     //已经增加到最多  
  132.     if (currentCount>=allCanBeChanged)  
  133.     {  
  134.         this->unschedule(schedule_selector(ChangeMoney::update_jia_func));  
  135.     }  
  136.     else  
  137.     {  
  138.         //自增  
  139.         currentCount++;  
  140.         //改变label显示  
  141.         CCLabelTTF *label=(CCLabelTTF *)this->getChildByTag(201);  
  142.         string=CCString::createWithFormat("%d",currentCount);  
  143.         label->setString(string->getCString());  
  144.     }  
  145. }  
  146. void ChangeMoney::update_jian_func(float dlt)  
  147. {  
  148.     //已减少到最少  
  149.     if (currentCount<=0)  
  150.     {  
  151.         this->unschedule(schedule_selector(ChangeMoney::update_jian_func));  
  152.     }  
  153.     else  
  154.     {  
  155.         //自减  
  156.         currentCount--;  
  157.         //改变label显示  
  158.         CCLabelTTF *label=(CCLabelTTF *)this->getChildByTag(201);  
  159.         string=CCString::createWithFormat("%d",currentCount);  
  160.         label->setString(string->getCString());  
  161.     }  

4、写到这里基本上已经结束了,给大家大概说下原理当我们点中时,分几种情况分别是:单击(点一下马上松开)、点击按下持续一段时间、划过某精灵并在精灵上停止一段时间,我们就是在这3种情况下做方法处理,后两种情况就是我们要处理的长按键处理,在处理之前要判断是否点中要执行长按键事件的精灵,如果点中并长按,则开始执行长按键操作

转载自http://blog.youkuaiyun.com/sharkmarine/article/details/9064115

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值