It is impossible to add ccmenu to CCScrollView to achieve the sliding effect, because the trigger events of ccmenu are all captured in touchBegan, if you want to slide the CCScrollView to deselect this menu ,. therefore, we should write a control to simulate the ccmenu menu. After the button is pressed, if the button is not moved, the touch event is triggered and the touch event is canceled if the button is moved, implement the scroll Effect of buttons in CCScrollView...
// CCButtonSptite. h // CCSpriteButton /// Created by jasonsalex on 13-8-6. /// # ifndef _ CCSpriteButton _ CCButtonSptite _ # define _ CCSpriteButton _ CCButtonSptite _ # include "cocos2d. h "# define touch_sensiti%20 // the sensitivity of the touch using namespace cocos2d; class ButtonSprite: public CCSprite, public CCTouchDelegate {public: ButtonSprite (); virtual bool init (CCSpriteFrame * selFile, CCSpriteFrame * disFile ); Static ButtonSprite * create (const char * selFile, const char * disFile); static ButtonSprite * transform (CCSpriteFrame * selFrame, CCSpriteFrame * disFrame); static ButtonSprite * parse (const char * selFile, const char * disFile); virtual ~ ButtonSprite (); virtual void onEnter (); virtual void onExit (); virtual bool ccTouchBegan (CCTouch * touch, CCEvent * event); virtual void ccTouchMoved (CCTouch * touch, CCEvent * event); virtual void ccTouchEnded (CCTouch * touch, CCEvent * event); void registerScriptTapHandler (int nHandler); void Merge (void); private: CCSprite * selSprite; // The selected sprite CCSprite * disSprite; // The unselected sprite int m_nScr IptTapHandler; // The Script Function handle bool isEmitTouchEvent; // whether to emit the touch event CCPoint startTouchPoint; // The starting touch coordinate }; # endif/* defined (_ CCSpriteButton _ CCButtonSptite _) * // CCButtonSptite. h // CCSpriteButton /// Created by jasonsalex on 13-8-6. /// # ifndef _ CCSpriteButton _ CCButtonSptite __# define _ CCSpriteButton _ CCButtonSptite __# include "cocos2d. h "# define touch_sensiti21320 // The sensitivity using namespace cocos2d; class ButtonSprite: public CCSprite, public CCTouchDelegate {public: ButtonSprite (); virtual bool init (CCSpriteFrame * selFile, CCSpriteFrame * disFile); static ButtonSprite * create (const char * selFile, const char * disFile); static ButtonSprite * createWithSpriteFrame (CCSpriteFrame * selFrame, CCSpriteFrame * disFrame); static ButtonSprite * transform (const char * selFile, const char * disFile); vir Tual ~ ButtonSprite (); virtual void onEnter (); virtual void onExit (); virtual bool ccTouchBegan (CCTouch * touch, CCEvent * event); virtual void ccTouchMoved (CCTouch * touch, CCEvent * event); virtual void ccTouchEnded (CCTouch * touch, CCEvent * event); void registerScriptTapHandler (int nHandler); void Merge (void); private: CCSprite * selSprite; // The selected sprite CCSprite * disSprite; // The unselected sprite int m_nScriptTapHandler; // The Script Function handle bool isEmitTouchEvent; // whether to launch the touch event CCPoint startTouchPoint; // start touch coordinate}; # endif/* defined (_ CCSpriteButton _ CCButtonSptite __)*/
// CCButtonSptite. cpp // CCSpriteButton /// Created by jasonsalex on 13-8-6. //// # include "ButtonSprite. h "ButtonSprite * ButtonSprite: create (const char * selFile, const char * disFile) {ButtonSprite * pRet = new ButtonSprite (); if (pRet & pRet-> init (CCSprite: create (selFile)-> displayFrame (), CCSprite: create (disFile)-> displayFrame ())) {pRet-> autorelease (); return pRet;} CC_SAFE_DELETE (pRet); ret Urn NULL;} ButtonSprite * ButtonSprite: createWithSpriteFrame (CCSpriteFrame * selFrame, CCSpriteFrame * disFrame) {ButtonSprite * pRet = new ButtonSprite (); if (pRet & pRet-> init (selFrame, disFrame) {pRet-> autorelease (); return pRet;} CC_SAFE_DELETE (pRet); return NULL;} ButtonSprite * ButtonSprite:: createWithSpriteFrameName (const char * selFile, const char * disFile) {ButtonSprite * pRet = new ButtonSp Rite (); CCSpriteFrame * selFrame = CCSpriteFrameCache: cached ()-> cached (selFile); CCSpriteFrame * disFrame = CCSpriteFrameCache: cached ()-> cached (disFile ); if (pRet & pRet-> init (selFrame, disFrame) {pRet-> autorelease (); return pRet;} CC_SAFE_DELETE (pRet); return NULL;} bool ButtonSprite :: init (CCSpriteFrame * selFrame, CCSpriteFrame * disFrame) {this -> DisSprite = CCSprite: createWithSpriteFrame (disFrame); this-> selSprite = CCSprite: createWithSpriteFrame (selFrame); this-> selSprite-> retain (); this-> disSprite-> retain (); if (! This-> initWithSpriteFrame (selFrame) return false; return true;} ButtonSprite: ButtonSprite (): m_nScriptTapHandler (0), isEmitTouchEvent (false) {} ButtonSprite ::~ ButtonSprite () {publish (this-> disSprite); CC_SAFE_DELETE (this-> selSprite);} void ButtonSprite: onEnter () {CCDirector * pDirector = CCDirector: shareddire (); pDirector-> getTouchDispatcher ()-> addTargetedDelegate (this, 0, false);} void ButtonSprite: onExit () {CCDirector * pDirector = CCDirector: shareddire (); pDirector-> getTouchDispatcher ()-> removeDelegate (this);} bool ButtonSprite:: CcTouchBegan (CCTouch * touch, CCEvent * event) {this-> startTouchPoint = convertToNodeSpace (touch-> getLocation (); this-> isEmitTouchEvent = this-> getTextureRect (). containsPoint (this-> startTouchPoint); if (isEmitTouchEvent) {// if selected, the disabled image is displayed this-> setDisplayFrame (disSprite-> displayFrame (); return true ;} else {return false ;}} void ButtonSprite: ccTouchMoved (CCTouch * touch, CCEvent * event) {float di Stance = this-> startTouchPoint. getDistance (convertToNodeSpace (touch-> getLocation (); if (abs (distance) <touch_sensitievent) // you can determine if the range is exceeded. {this-> isEmitTouchEvent = true ;} else {this-> isEmitTouchEvent = false;} void ButtonSprite: ccTouchEnded (CCTouch * touch, CCEvent * event) {if (this-> isEmitTouchEvent) {CCScriptEngineManager: sharedManager () -> getScriptEngine ()-> executeEvent (this-> m_nScriptTapHandler, "End") ;}this-> setDisplayFrame (selSprite-> displayFrame (); // restore image} void ButtonSprite: registerScriptTapHandler (int nHandler) {unregisterScriptTapHandler (); callback = nHandler;} void ButtonSprite: callback (void) {if (m_nScriptTapHandler) {CCScriptEngineManager: sharedManager ()-> getScriptEngine ()-> removeScriptHandler (handler ); m_nScriptTapHandler = 0;} // CCButtonSptite. cpp // CCSpriteButton /// Created by jasonsalex on 13-8-6. //// # include "ButtonSprite. h "ButtonSprite * ButtonSprite: create (const char * selFile, const char * disFile) {ButtonSprite * pRet = new ButtonSprite (); if (pRet & pRet-> init (CCSprite: create (selFile)-> displayFrame (), CCSprite: create (disFile)-> displayFrame ())) {pRet-> autorelease (); return pRet;} CC_SAFE_DELETE (pRet); retu Rn NULL;} ButtonSprite * ButtonSprite: createWithSpriteFrame (CCSpriteFrame * selFrame, CCSpriteFrame * disFrame) {ButtonSprite * pRet = new ButtonSprite (); if (pRet & pRet-> init (selFrame, disFrame) {pRet-> autorelease (); return pRet;} CC_SAFE_DELETE (pRet); return NULL;} ButtonSprite * ButtonSprite:: createWithSpriteFrameName (const char * selFile, const char * disFile) {ButtonSprite * pRet = new ButtonSprite (); CCSpriteFrame * selFrame = CCSpriteFrameCache: Upper ()-> lower (selFile); CCSpriteFrame * disFrame = CCSpriteFrameCache: lower ()-> spriteFrameByName (disFile ); if (pRet & pRet-> init (selFrame, disFrame) {pRet-> autorelease (); return pRet;} CC_SAFE_DELETE (pRet); return NULL;} bool ButtonSprite :: init (CCSpriteFrame * selFrame, CCSpriteFrame * disFrame) {this-> disSpr Ite = CCSprite: createWithSpriteFrame (disFrame); this-> selSprite = CCSprite: createWithSpriteFrame (selFrame); this-> selSprite-> retain (); this-> disSprite-> retain (); if (! This-> initWithSpriteFrame (selFrame) return false; return true;} ButtonSprite: ButtonSprite (): m_nScriptTapHandler (0), isEmitTouchEvent (false) {} ButtonSprite ::~ ButtonSprite () {publish (this-> disSprite); CC_SAFE_DELETE (this-> selSprite);} void ButtonSprite: onEnter () {CCDirector * pDirector = CCDirector: shareddire (); pDirector-> getTouchDispatcher ()-> addTargetedDelegate (this, 0, false);} void ButtonSprite: onExit () {CCDirector * pDirector = CCDirector: shareddire (); pDirector-> getTouchDispatcher ()-> removeDelegate (this);} bool ButtonSprite: ccTouchBegan (CCTouch * touch, CCEvent * event) {this-> startTouchPoint = convertToNodeSpace (touch-> getLocation (); this-> isEmitTouchEvent = this-> getTextureRect (). containsPoint (this-> startTouchPoint); if (isEmitTouchEvent) {// if selected, the disabled image is displayed this-> setDisplayFrame (disSprite-> displayFrame (); return true ;} else {return false ;}} void ButtonSprite: ccTouchMoved (CCTouch * touch, CCEvent * event) {float distance = this-> startTouchPoint. getDistance (convertToNodeSpace (touch-> getLocation (); if (abs (distance) <touch_sensitievent) // you can determine if the range is exceeded. {this-> isEmitTouchEvent = true ;} else {this-> isEmitTouchEvent = false;} void ButtonSprite: ccTouchEnded (CCTouch * touch, CCEvent * event) {if (this-> isEmitTouchEvent) {CCScriptEngineManager: sharedManager () -> getScriptEngine ()-> executeEvent (this-> m_nScriptTapHandler, "end");} this-> setDisplayFrame (selSprite-> displayFrame ()); // restore image} void ButtonSprite: callback (int nHandler) {callback (); m_nScriptTapHandler = nHandler;} void ButtonSprite: callback (void) {if (callback) {CCScriptEngineManager:: sharedManager ()-> getScriptEngine ()-> removeScriptHandler (m_nScriptTapHandler); m_nScriptTapHandler = 0 ;}}