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

10 篇文章 0 订阅
6 篇文章 0 订阅

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值