Cocos2d implements a menu control similar to CCMenu, which is a lua script control in the CCScrollView

Source: Internet
Author: User

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 ;}}


 

Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.