[置顶] cocos2d实现类似CCMenu菜单类控件,在CCScrollView滚动, lua脚本控件

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

 

开发人员:Jason's.Alex   QQ:531401335

csdn博客:http://blog.csdn.net/RuShrooM

 

 

//

//  CCButtonSptite.h

//  CCSpriteButton

//

//  Created by jasonsalex on 13-8-6.

//

//



#ifndef __CCSpriteButton__CCButtonSptite__

#define __CCSpriteButton__CCButtonSptite__



#include "cocos2d.h"



#define TOUCH_SENSITIVITY  20 //触摸灵敏度



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 *createWithSpriteFrameName(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 unregisterScriptTapHandler(void);



    

private:

    CCSprite *selSprite;  //选择的精灵

    CCSprite *disSprite;//不选择的精灵

    

    int m_nScriptTapHandler;//脚本函数句柄

    bool isEmitTouchEvent; //是否发射触摸事件

    CCPoint startTouchPoint; //开始的触摸坐标

};





#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);

    return 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::sharedSpriteFrameCache()->spriteFrameByName(selFile);

    CCSpriteFrame *disFrame=CCSpriteFrameCache::sharedSpriteFrameCache()->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->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()

{

    CC_SAFE_DELETE(this->disSprite);

    CC_SAFE_DELETE(this->selSprite);

}





void ButtonSprite::onEnter()

{

    CCDirector* pDirector = CCDirector::sharedDirector();

    pDirector->getTouchDispatcher()->addTargetedDelegate(this, 0, false);

}



void ButtonSprite::onExit()

{

    CCDirector* pDirector = CCDirector::sharedDirector();

    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)

    {                   //如果选择了就显示禁用图像

        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_SENSITIVITY)  //判断是否超过了移动范围

    {

        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()); //恢复图像

}



void ButtonSprite::registerScriptTapHandler(int nHandler)

{

    unregisterScriptTapHandler();

    m_nScriptTapHandler = nHandler;

}



void ButtonSprite::unregisterScriptTapHandler(void)

{

    if (m_nScriptTapHandler)

    {

        CCScriptEngineManager::sharedManager()->getScriptEngine()->removeScriptHandler(m_nScriptTapHandler);

        m_nScriptTapHandler = 0;

    }

}


 

 

你可能感兴趣的:(scrollview)