cocos2dx 在ccscrollview 实现滚动添加menu

在CCScrollView中添加ccmenu实现滑动效果是不可能的,因为ccmenu的触发事件是你在touchBegan就全部捕获掉了,如果你想滑动CCScrollView取消选中这个菜单是无法实现的,.所以我们应该自己编写一个模拟ccmenu菜单的控件 ,在按下按钮后,如果不移动按钮的话,就触发触摸事件,移动的话就取消触摸事件,实现按钮在CCScrollView中的滚动效果。。。

[cpp]  view plain copy
  1. //  
  2. //  CCButtonSptite.h  
  3. //  CCSpriteButton  
  4. //  
  5. //  Created by jasonsalex on 13-8-6.  
  6. //  
  7. //  
  8.   
  9. #ifndef __CCSpriteButton__CCButtonSptite__  
  10. #define __CCSpriteButton__CCButtonSptite__  
  11.   
  12. #include "cocos2d.h"  
  13.   
  14. #define TOUCH_SENSITIVITY  20 //触摸灵敏度  
  15.   
  16. using namespace cocos2d;  
  17.   
  18. class ButtonSprite:public CCSprite,public CCTouchDelegate  
  19. {  
  20. public:  
  21.     ButtonSprite();  
  22.     virtual bool init(CCSpriteFrame *selFile,CCSpriteFrame *disFile);  
  23.       
  24.     static ButtonSprite *create(const char *selFile,const char *disFile );  
  25.     static ButtonSprite *createWithSpriteFrame(CCSpriteFrame* selFrame,CCSpriteFrame *disFrame);  
  26.     static ButtonSprite *createWithSpriteFrameName(const char *selFile,const char * disFile);  
  27.     virtual ~ButtonSprite();  
  28.       
  29.     virtual void onEnter();  
  30.     virtual void onExit();  
  31.     virtual bool ccTouchBegan(CCTouch* touch, CCEvent* event);  
  32.     virtual void ccTouchMoved(CCTouch* touch, CCEvent* event);  
  33.     virtual void ccTouchEnded(CCTouch* touch, CCEvent* event);  
  34.       
  35.     void registerScriptTapHandler(int nHandler);  
  36.     void unregisterScriptTapHandler(void);  
  37.   
  38.       
  39. private:  
  40.     CCSprite *selSprite;  //选择的精灵  
  41.     CCSprite *disSprite;//不选择的精灵  
  42.       
  43.     int m_nScriptTapHandler;//脚本函数句柄  
  44.     bool isEmitTouchEvent; //是否发射触摸事件  
  45.     CCPoint startTouchPoint; //开始的触摸坐标  
  46. };  
  47.   
  48.   
  49. #endif /* defined(__CCSpriteButton__CCButtonSptite__) */  

[cpp]  view plain copy
  1. //  
  2. //  CCButtonSptite.cpp  
  3. //  CCSpriteButton  
  4. //  
  5. //  Created by jasonsalex on 13-8-6.  
  6. //  
  7. //  
  8.   
  9. #include "ButtonSprite.h"  
  10. ButtonSprite *  ButtonSprite::create(const char *selFile,const char *disFile )  
  11. {  
  12.       
  13.     ButtonSprite *pRet=new ButtonSprite();  
  14.       
  15.   
  16.     if(pRet && pRet->init(CCSprite::create(selFile)->displayFrame(),CCSprite::create(disFile)->displayFrame()))  
  17.     {  
  18.         pRet->autorelease();  
  19.         return pRet;  
  20.     }  
  21.       
  22.     CC_SAFE_DELETE(pRet);  
  23.     return NULL;  
  24. }  
  25.   
  26. ButtonSprite * ButtonSprite::createWithSpriteFrame(CCSpriteFrame* selFrame,CCSpriteFrame *disFrame)  
  27. {  
  28.       
  29.     ButtonSprite *pRet=new ButtonSprite();  
  30.       
  31.     if(pRet && pRet->init(selFrame,disFrame))  
  32.     {  
  33.         pRet->autorelease();  
  34.         return pRet;  
  35.     }  
  36.       
  37.     CC_SAFE_DELETE(pRet);  
  38.     return NULL;  
  39.       
  40. }  
  41.   
  42. ButtonSprite * ButtonSprite::createWithSpriteFrameName(const char *selFile,const char * disFile)  
  43. {  
  44.       
  45.     ButtonSprite *pRet=new ButtonSprite();  
  46.       
  47.     CCSpriteFrame *selFrame=CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName(selFile);  
  48.     CCSpriteFrame *disFrame=CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName(disFile);  
  49.       
  50.     if(pRet && pRet->init(selFrame,disFrame))  
  51.     {  
  52.         pRet->autorelease();  
  53.         return pRet;  
  54.     }  
  55.       
  56.     CC_SAFE_DELETE(pRet);  
  57.     return NULL;  
  58.       
  59. }  
  60.   
  61.   
  62. bool ButtonSprite::init(CCSpriteFrame* selFrame,CCSpriteFrame *disFrame)  
  63. {  
  64.     this->disSprite=CCSprite::createWithSpriteFrame(disFrame);  
  65.     this->selSprite=CCSprite::createWithSpriteFrame(selFrame);  
  66.     this->selSprite->retain();  
  67.     this->disSprite->retain();  
  68.       
  69.     if(!this->initWithSpriteFrame(selFrame))  
  70.         return false;  
  71.       
  72.     return true;  
  73. }  
  74.   
  75. ButtonSprite::ButtonSprite():m_nScriptTapHandler(0),isEmitTouchEvent(false)  
  76. {  
  77.       
  78. }  
  79.   
  80. ButtonSprite::~ButtonSprite()  
  81. {  
  82.     CC_SAFE_DELETE(this->disSprite);  
  83.     CC_SAFE_DELETE(this->selSprite);  
  84. }  
  85.   
  86.   
  87. void ButtonSprite::onEnter()  
  88. {  
  89.     CCDirector* pDirector = CCDirector::sharedDirector();  
  90.     pDirector->getTouchDispatcher()->addTargetedDelegate(this, 0, false);  
  91. }  
  92.   
  93. void ButtonSprite::onExit()  
  94. {  
  95.     CCDirector* pDirector = CCDirector::sharedDirector();  
  96.     pDirector->getTouchDispatcher()->removeDelegate(this);  
  97.       
  98. }  
  99.   
  100. bool ButtonSprite::ccTouchBegan(CCTouch* touch, CCEvent* event)  
  101. {  
  102.     this->startTouchPoint = convertToNodeSpace(touch->getLocation());  
  103.    
  104.     this->isEmitTouchEvent= this->getTextureRect().containsPoint(this->startTouchPoint);  
  105.     if(isEmitTouchEvent)  
  106.     {                   //如果选择了就显示禁用图像  
  107.         this->setDisplayFrame(disSprite->displayFrame());  
  108.         return true;  
  109.     }else    
  110.     {  
  111.         return false;  
  112.     }  
  113. }  
  114.   
  115. void ButtonSprite::ccTouchMoved(CCTouch* touch, CCEvent* event)  
  116. {  
  117.       
  118.     float distance=this->startTouchPoint.getDistance(convertToNodeSpace(touch->getLocation()));  
  119.       
  120.     if(abs(distance)<TOUCH_SENSITIVITY)  //判断是否超过了移动范围  
  121.     {  
  122.         this->isEmitTouchEvent=true;  
  123.     }else  
  124.     {  
  125.         this->isEmitTouchEvent=false;  
  126.     }  
  127.       
  128. }  
  129.   
  130. void ButtonSprite::ccTouchEnded(CCTouch* touch, CCEvent* event)  
  131. {  
  132.     if(this->isEmitTouchEvent)  
  133.     {  
  134.         CCScriptEngineManager::sharedManager()->getScriptEngine()->executeEvent(this->m_nScriptTapHandler,"end");    
  135.     }  
  136.       
  137.     this->setDisplayFrame(selSprite->displayFrame()); //恢复图像  
  138. }  
  139.   
  140. void ButtonSprite::registerScriptTapHandler(int nHandler)  
  141. {  
  142.     unregisterScriptTapHandler();  
  143.     m_nScriptTapHandler = nHandler;  
  144. }  
  145.   
  146. void ButtonSprite::unregisterScriptTapHandler(void)  
  147. {  
  148.     if (m_nScriptTapHandler)  
  149.     {  
  150.         CCScriptEngineManager::sharedManager()->getScriptEngine()->removeScriptHandler(m_nScriptTapHandler);  
  151.         m_nScriptTapHandler = 0;  
  152.     }  
  153. }  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SZ_Eason

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值